我正在spark开发一个程序。我需要将结果放在一个文件中,因此有两种方法可以合并结果:凝聚(Spark):myrdd.coalesce(1,false).saveastextfile(pathout);之后将其合并到hdfs中:hadoop fs-getmerge pathout localpath哪一个最高效快捷?有没有其他方法来合并hdfs中的文件(比如“getmerge”)将结果保存到hdfs,而不是将其保存到本地路径?
ldioqlga1#
如果您确定数据适合内存,那么coalesce可能是最好的选择,但在另一种情况下,为了避免oom错误,我将使用getmerge,或者如果您使用fileutil类中的scala/java copymerge api函数。检查spark用户邮件列表的这个线程。
uplii1fm2#
如果您正在处理一个大型数据集(我假设您是这样),我建议让spark将每个分区写入hdfs中自己的“part”文件,然后使用 hadoop fs -getMerge 从hdfs目录中提取单个输出文件。spark将数据分割成多个分区以提高效率,因此它可以在多个工作节点之间分配工作负载。如果合并到一小部分分区,则会降低其分配工作的能力,仅使用一个分区就将所有工作都放在一个节点上。在最好的情况下,这将是缓慢的,在最坏的情况下,它将用尽内存和崩溃的工作。
hadoop fs -getMerge
2条答案
按热度按时间ldioqlga1#
如果您确定数据适合内存,那么coalesce可能是最好的选择,但在另一种情况下,为了避免oom错误,我将使用getmerge,或者如果您使用fileutil类中的scala/java copymerge api函数。
检查spark用户邮件列表的这个线程。
uplii1fm2#
如果您正在处理一个大型数据集(我假设您是这样),我建议让spark将每个分区写入hdfs中自己的“part”文件,然后使用
hadoop fs -getMerge
从hdfs目录中提取单个输出文件。spark将数据分割成多个分区以提高效率,因此它可以在多个工作节点之间分配工作负载。如果合并到一小部分分区,则会降低其分配工作的能力,仅使用一个分区就将所有工作都放在一个节点上。在最好的情况下,这将是缓慢的,在最坏的情况下,它将用尽内存和崩溃的工作。