java - 从 HDFS 下载大文件

标签 java file-io hdfs

我从 HDFS 客户端获得了一个大文件(大约 2GB)的 DataInputStream,我需要将其作为文件存储在我的主机上。

我正在考虑使用 apache common IOUtils 并做这样的事情......

File temp = getTempFile(localPath);
DataInputStream dis = HDFSClient.open(filepath); // around 2GB file (zipped)
in = new BufferedInputStream(dis);
out = new FileOutputStream(temp);
IOUtils.copy(in, out);

我一直在寻找比这种方法更好的其他解决方案。对此主要关注的是在输入和 IOUtils.copy 中使用缓冲...

最佳答案

对于大于2GB的文件,建议使用IOUtils.copyLarge()(如果我们谈论相同的IOUtils:org.apache.commons.io.IOUtils)

IOUtils 中的复制使用默认缓冲区大小 4Kb(尽管您可以指定另一个缓冲区大小作为参数)。

copy()copyLarge() 的区别在于返回结果。

对于 copy(),如果流大于 2GB,您将成功复制,但结果为 -1。

对于copyLarge(),结果正是您复制的字节数。

请参阅此处的文档了解更多信息: http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/IOUtils.html#copyLarge(java.io.InputStream,%20java.io.OutputStream)

关于java - 从 HDFS 下载大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31824598/

相关文章:

hadoop - hdfs dfs -count 从哪里获取信息?

java - Java 8 中的 CompletableFuture

c++ - Python 将输入重定向到子进程

python - cPickle 下溢错误

c - 特殊字符读取错误 - 文件 I/0

hadoop - awk命令组合多个参数

java - 使用java读取hdfs blk_.meta文件

java - 将文件从 Gradle 父目录加载到 Java 测试中

java - 如何使用 Jackcess 在 Access .mdb 中创建 ODBC 链接表?

java - 将 Web 应用程序部署到 Heroku