`

Spark与MR输出文件排序比较

 
阅读更多

 

假设任务的输出存到HDFS,那么输出的HDFS文件个数由什么决定?

MR的输出文件个数由reduce个数决定,如果有一个reduce,则会产生一个结果文件part-r-00000;如果有两个reduce,则会产生两个结果文件part-r-00000, part-r-00001。

Spark的输出文件个数由产生的partition数量决定,如果产生两个partition,则会产生两个结果文件part-00000,part-00001。

 

MR任务的reduce数量如果控制?Spark的partition的数量如果控制?

MR的reduce数量可以在提交job的时候指定,job.setNumReduceTasks(int num);

Spark的批量任务在提交读取数据源转换为RDD的时候可以设置至少产生的partition数量,sc.textFile(path: String, minPartitions: Int);在RDD的数据transaction过程中,可以调用repartition(partitions: Int)重新分配partition的数量。

 

MR如何控制输出结果的排序方式?

Mapreduce框架在feed数据给reducer之前会对map output key排序,这种排序机制保证了每一个reducer局部有序,hadoop 默认的partitioner是HashPartitioner,它依赖于output key的hashcode,使得相同key会去相同reducer,但是不保证全局有序,如果想要获得全局排序结果(比如获取top N, bottom N),就需要用到TotalOrderPartitioner了,它保证了相同key去相同reducer的同时也保证了全局有序。

 

Spark如何控制输出结果的排序方式?

Spark的RDD数据集在Transformations阶段,可以调用sortBy()或者sortByKey()的方式对结果集进行排序。

 

参考: 

MapReduce TotalOrderPartitioner 全局排序

Spark Programming Guide

Apache Hadoop MapReduce Turtorial

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics