我有一些来自 Spark 应用程序的结果作为名为 part-r-0000X(X= 0、1 等)的文件保存在 HDFS 中。而且,因为我想将所有内容加入到一个文件中,所以我使用了以下命令:
hdfs dfs -getmerge srcDir destLocalFile
前面的命令在 bash 脚本中使用,该脚本清空输出目录(保存 part-r-...
文件的位置),并在循环内执行上面的 getmerge
命令。
问题是我需要在另一个 Spark 程序中使用生成的文件,该程序需要将该合并文件作为 HDFS 的输入。所以我将其保存为本地,然后将其上传到 HDFS。
我想到了另一种选择,即以这种方式从 Spark 程序写入文件:
outputData.coalesce(1, false).saveAsTextFile(outPathHDFS)
但我读过 coalesce() 对性能没有帮助。
还有其他想法吗?建议?谢谢!
最佳答案
我猜你希望将所有文件合并成一个文件,这样你就可以一次将所有文件加载到 Spark rdd 中。
让文件在 HDFS 的 Parts(0,1,....) 中。
为什么不用 wholetextFiles 加载它,它实际上可以满足您的需要。
wholeTextFiles(path, minPartitions=None, use_unicode=True)[source]
从 HDFS、本地文件系统(在所有节点上可用)或任何 Hadoop 支持的文件系统 URI 读取文本文件目录。每个文件作为单个记录读取并以键值对的形式返回,其中键是每个文件的路径,值是每个文件的内容。
如果 use_unicode 为 False,字符串将保留为 str(编码为 utf-8),这比 unicode 更快更小。 (在 Spark 1.2 中添加)
例如,如果您有以下文件:
hdfs://a-hdfs-path/part-00000 hdfs://a-hdfs-path/part-00001 ... hdfs://a-hdfs-path/part-nnnnn
执行 rdd = sparkContext.wholeTextFiles(“hdfs://a-hdfs-path”)
,然后 rdd 包含:
(a-hdfs-path/part-00000,其内容)(a-hdfs-path/part-00001,其内容)...(a-hdfs-path/part-nnnnn,其内容)
关于apache-spark - HDFS 和 Spark : Best way to write a file and reuse it from another program,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51447805/