我是Spark新手 . 我有一个简单的pyspark脚本 . 它读取一个json文件,展平它并将其作为镶木地板压缩文件写入S3位置 .
读取和转换步骤运行速度非常快,并使用50个执行程序(我在conf中设置) . 但写入阶段需要很长时间,只能写入一个大文件(480MB) .
保存的文件数量如何确定?写操作能以某种方式加速吗?
谢谢,拉姆 .
输出的文件数等于要保存的RDD的分区数 . 在此示例中,RDD被重新分区以控制输出文件的数量 .
尝试:
repartition(numPartitions) - 随机重新调整RDD中的数据以创建更多或更少的分区并在它们之间进行 balancer . 这总是随机播放网络上的所有数据 .
>>> 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
Update:
textFile方法还采用可选的第二个参数来控制文件的分区数 . 默认情况下,Spark为文件的每个块创建一个分区(HDFS中默认为64MB),但您也可以通过传递更大的值来请求更多的分区 . 请注意,您不能拥有比块少的分区 .
...但这是最小数量的可能分区,因此无法保证 .
所以如果你想在读取时进行分区,你应该使用这个....
dataRDD=sc.textFile("/user/cloudera/sqoop_import/orders").repartition(2)
1 回答
输出的文件数等于要保存的RDD的分区数 . 在此示例中,RDD被重新分区以控制输出文件的数量 .
尝试:
输出的文件数与RDD的分区数相同 .
另请查看:coalesce(numPartitions)
source-1 | source-2
Update:
...但这是最小数量的可能分区,因此无法保证 .
所以如果你想在读取时进行分区,你应该使用这个....