PySpark输出文件数

时间:2016-12-28 20:35:41

标签: apache-spark pyspark pyspark-sql

我是Spark新手。我有一个简单的pyspark脚本。它读取一个json文件,将其展平并将其作为镶木地板压缩文件写入S3位置。

读取和转换步骤运行得非常快,并使用50个执行程序(我在conf中设置)。但写入阶段需要很长时间,并且只写一个大文件(480MB)。

如何确定保存的文件数量? 写操作能否以某种方式加速?

谢谢, 拉姆。

2 个答案:

答案 0 :(得分:2)

输出的文件数等于要保存的RDD的分区数。在此示例中,RDD被重新分区以控制输出文件的数量。

尝试:

  

repartition(numPartitions) - 随机重新调整RDD中的数据   创建更多或更少的分区并在它们之间进行平衡。   这总是随机播放网络上的所有数据。

>>> dataRDD.repartition(2).saveAsTextFile("/user/cloudera/sqoop_import/orders_test")

输出的文件数与RDD的分区数相同。

$ hadoop fs -ls /user/cloudera/sqoop_import/orders_test
Found 3 items
-rw-r--r--   1 cloudera cloudera          0 2016-12-28 12:52 /user/cloudera/sqoop_import/orders_test/_SUCCESS
-rw-r--r--   1 cloudera cloudera    1499519 2016-12-28 12:52 /user/cloudera/sqoop_import/orders_test/part-00000
-rw-r--r--   1 cloudera cloudera    1500425 2016-12-28 12:52 /user/cloudera/sqoop_import/orders_test/part-00001

同时检查:coalesce(numPartitions)

source-1 | source-2

<强> 更新

  

textFile method还有一个可选的第二个参数   控制文件的分区数。默认情况下,Spark   为文件的每个块创建一个分区(块为64MB   在HDFS中默认),但您也可以要求更高的数量   通过传递更大的值来分区。请注意,你不能少   分区而不是块。

...但这是可能分区的最小数量,因此无法保证。

所以如果你想在读取时进行分区,你应该使用这个....

dataRDD=sc.textFile("/user/cloudera/sqoop_import/orders").repartition(2)

答案 1 :(得分:1)

要考虑2种不同的事物:-

  1. HDFS块大小:-HDFS的块大小可在HDFS-site.xml中配置(默认为128 Mb)。如果文件的大小大于块大小,则会在存储器中为文件的其余部分分配一个新块。但是,您看不到那东西。它是在内部完成的。整个过程是顺序的。

  2. 分区:-当Spark出现时,并行性也是如此。理想情况下,如果不手动提供分区数,则它等于默认配置中的块大小。另一方面,如果您要自定义分区文件的数量,则可以继续使用API​​,其中n是分区的数量。 当您浏览HDFS时,这些分区对您可见。

此外,要提高性能,您可以在spark-submit / pyspark / spark-shell时提供一些规格,例如num执行程序,执行程序内存,每个执行程序的内核等。写入任何文件时的性能都取决于同一个文件的格式和压缩编解码器。

感谢阅读。

相关问题