我是Spark新手。我有一个简单的pyspark脚本。它读取一个json文件,将其展平并将其作为镶木地板压缩文件写入S3位置。
读取和转换步骤运行得非常快,并使用50个执行程序(我在conf中设置)。但写入阶段需要很长时间,并且只写一个大文件(480MB)。
如何确定保存的文件数量? 写操作能否以某种方式加速?
谢谢, 拉姆。
答案 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
<强> 更新 强>
textFile method还有一个可选的第二个参数 控制文件的分区数。默认情况下,Spark 为文件的每个块创建一个分区(块为64MB 在HDFS中默认),但您也可以要求更高的数量 通过传递更大的值来分区。请注意,你不能少 分区而不是块。
...但这是可能分区的最小数量,因此无法保证。
所以如果你想在读取时进行分区,你应该使用这个....
dataRDD=sc.textFile("/user/cloudera/sqoop_import/orders").repartition(2)
答案 1 :(得分:1)
要考虑2种不同的事物:-
HDFS块大小:-HDFS的块大小可在HDFS-site.xml中配置(默认为128 Mb)。如果文件的大小大于块大小,则会在存储器中为文件的其余部分分配一个新块。但是,您看不到那东西。它是在内部完成的。整个过程是顺序的。
分区:-当Spark出现时,并行性也是如此。理想情况下,如果不手动提供分区数,则它等于默认配置中的块大小。另一方面,如果您要自定义分区文件的数量,则可以继续使用API,其中n是分区的数量。 当您浏览HDFS时,这些分区对您可见。
此外,要提高性能,您可以在spark-submit / pyspark / spark-shell时提供一些规格,例如num执行程序,执行程序内存,每个执行程序的内核等。写入任何文件时的性能都取决于同一个文件的格式和压缩编解码器。
感谢阅读。