正在尝试调查/tmp被填满的问题,但我们不知道是什么原因导致的。我们最近确实有一个更改,即使用HDFS命令执行到另一台主机的拷贝(hdfs dfs -cp /source/file hdfs://other.host:port/target/file),虽然拷贝操作不直接接触或引用/tmp,但它可能会将其用作其实现的一部分。但是我在文档中找不到任何东西来证实或反驳这个理论--还有其他人知道答案吗?
hdfs dfs -cp /source/file hdfs://other.host:port/target/file
xqk2d5yq1#
您可以查看代码:下面是复制using HDFS的代码。它使用自己的内部CommandWithDestination类。并使用另一个internal class(实际上只是java.io.类)写入所有内容。(为了完成实际的写入。)因此,它在内存中缓冲字节并发送字节。可能不是问题所在。您可以通过更改java使用的tmp目录来检查此问题。(java.io.tmpdir)导出JAVA选项=-Djava.io.临时目录=/新/临时/目录显示java.io.java文件中的Docs默认的临时文件目录由系统属性java. io. tmpdir指定。在UNIX系统上,此属性的默认值通常为“/tmp”或“/var/tmp”;在Microsoft Windows系统上,它通常是“c:\temp”。当调用Java虚拟机时,可以为该系统属性指定不同的值,但不保证对该属性进行的编程更改会对该方法使用的临时目录产生任何影响。HDFS拷贝所使用的方法:
protected void copyStreamToTarget(InputStream in, PathData target) throws IOException { if (target.exists && (target.stat.isDirectory() || !overwrite)) { throw new PathExistsException(target.toString()); } TargetFileSystem targetFs = new TargetFileSystem(target.fs); try { System.out.flush(); System.out.println("Hello Copy Stream"); PathData tempTarget = direct ? target : target.suffix("._COPYING_"); targetFs.setWriteChecksum(writeChecksum); targetFs.writeStreamToFile(in, tempTarget, lazyPersist, direct); //here's where it uses Java.io to write the file to hdfs. if (!direct) { targetFs.rename(tempTarget, target); } } finally { targetFs.close(); // last ditch effort to ensure temp file is removed } }
1条答案
按热度按时间xqk2d5yq1#
您可以查看代码:
下面是复制using HDFS的代码。它使用自己的内部CommandWithDestination类。并使用另一个internal class(实际上只是java.io.类)写入所有内容。(为了完成实际的写入。)因此,它在内存中缓冲字节并发送字节。可能不是问题所在。您可以通过更改java使用的tmp目录来检查此问题。(java.io.tmpdir)
导出JAVA选项=-Djava.io.临时目录=/新/临时/目录
显示java.io.java文件中的Docs
默认的临时文件目录由系统属性java. io. tmpdir指定。在UNIX系统上,此属性的默认值通常为“/tmp”或“/var/tmp”;在Microsoft Windows系统上,它通常是“c:\temp”。当调用Java虚拟机时,可以为该系统属性指定不同的值,但不保证对该属性进行的编程更改会对该方法使用的临时目录产生任何影响。
HDFS拷贝所使用的方法: