MapReduce全局排序细节

一、概念

        全局排序是通过将进入map端之前的数据进行随机采样,在采取的样本中设置分割点,通过分割点将数据进行分区

二、原理

        将设置的分割点保存在二叉树中,Map Task 每输出一个数据就会去查找其对应的区间,以此来达到分区效果

三、易忘点

(1)全局排序处理的文件内容key----value按照TAB键分割的(例如k    v);

(2)Mapper函数的输入数据类型为Text,Text类型(输出数据类型随意,但需要保证reduce端的输入数据类型与其一致)

(3)主函数中

                1,定义分割点的存储路径(例如    String partitionPath="file:/E:/partition"     注意本地路径前要加file:/);

                2,   设置InputFormat阶段的格式化类型(job.setInputFormatClass(KeyValueTextInputFormat.class));

                3,   设置分区类为全局排序(job.setPartitionerClass(TotalOrderPartitioner.class));

                4,    设置分区的分区数,需要与创建随机样本对象传入的分区数相同

                       job.setNumReduceTasks(3);        (3---------为我设置的分区数)

                5,获取随机样本对象

                        RadomSample <Text,Text> sampler =new RandomSample<>(0.1,10,3);

                        0.1-----------------每个样本被抽到的概率

                        10------------------样本数

                        3--------------------分区数

                6,设置分割点存储路径

                        TotalOrderPartitioner.setPartitionFile(job.getConfiguration(),new Path(partitionPath));

                 7,  添加分割点

                        InputSampler.writePartitionFile(job,sampler);

猜你喜欢

转载自blog.csdn.net/qq_42444621/article/details/80701062