apache-spark - HDFS 和 Spark : Best way to write a file and reuse it from another program

标签 apache-spark hadoop hdfs

我有一些来自 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/

相关文章:

java - "Malformed data length is negative",当尝试使用带有 Avro 数据源的 kafka 的 Spark 结构化流时

scala - 将列表项映射到 org.apache.spark.sql.Column 类型

apache-spark - SparkContext 中的 parallelize() 方法

apache-spark - 简而言之,Spark S3(或 S3A)提交者是什么以及何时应该使用它们?

mysql - hive 中的表分区

hadoop - YARN 上的 Spark 中的日志在哪里?

hadoop - 可以通过执行-mkdir在hadoop中的远程集群上创建目录吗?

hadoop - 我们如何为 HDFS(Hadoop 分布式文件系统)开发代理

mysql - 如何使用sqoop将hive数据导出到mysql的指定字段?

hadoop - 使用Spark Streaming时HDFS文件被覆盖,但是我不希望这样