Hadoop自带的Partitioner的实现有两种,一种为HashPartitioner, 默认的分区方式,计算公式 hash(key)%reducernum,另一种为TotalOrderPartitioner org.apache.hadoop.mapreduce.lib.partition.InputSampler; import org.apache.hadoop.mapreduce.lib.partition.TotalOrderPartitioner job.setOutputKeyClass(Text.class); job.setOutputValueClass(NullWritable.class); //设置分区文件存放路径 TotalOrderPartitioner.setPartitionFile (job.getConfiguration(), new Path("/user/root/myPartition/")); job.setPartitionerClass(TotalOrderPartitioner.class
这里出现了一个叫 TotalOrderPartitioner的类,这也是本次学习的重点。 先看看关系Partition的相关类结构。 可见。 TotalOrderPartitioner还是挺复杂的。 TotalOrderPartitioner的作用就是保证全局有序,对于key的划分,他划分了几个key的抽样点。
hive.mapred.partitioner=org.apache.hadoop.hive.ql.exec.tez.TezTotalOrderPartitioner; --指定上一步骤生成的分区键文件地址 set mapreduce.totalorderpartitioner.path 6与Hive官网的一致如下: set mapred.reduce.tasks=12; set hive.mapred.partitioner=org.apache.hadoop.mapred.lib.TotalOrderPartitioner hive.mapred.partitioner=org.apache.hadoop.hive.ql.exec.tez.TezTotalOrderPartitioner; set mapreduce.totalorderpartitioner.path
1.2 Reduce并行度的动态平衡mapreduce.job.reduces参数的设置需遵循"2-3倍Map输出文件数"原则,但实际应用中存在三个关键考量维度:数据倾斜治理:当key分布不均匀时,采用TotalOrderPartitioner 数据倾斜治理的进阶方案3.1 动态Key分区技术传统HashPartitioner在数据分布不均时会导致严重倾斜,某金融风控系统通过二次抽样+动态区间划分方案实现负载均衡:在Map阶段预统计Key频率分布使用TotalOrderPartitioner
toString().substring(0,3))实现预分区 动态分区:设置hive.optimize.skewjoin=true自动拆分倾斜键 二次排序:在Mapper阶段对Value预排序,配合TotalOrderPartitioner
MapReduce优化策略优化MapReduce性能,可考虑以下策略:选择合适的分区策略:如HashPartitioner、TotalOrderPartitioner,确保数据分布均匀,减少Reducer
TotalOrderPartitioner; SET total.order.partitioner.path=/tmp/hbase_splits; -- generate hfiles using the
生产环境建议使用TotalOrderPartitioner配合采样数据确定最优分区数。
指定 hive.mapred.partitioner 为 org.apache.hadoop.mapred.lib.TotalOrderPartitioner。 指定 mapreduce.totalorderpartitioner.path 为 location下的 xx.lst。 指定 hive.hbase.generatehfiles 为 true。
splitPoints); fs.deleteOnExit(partitionsPath); // configure job to use it job.setPartitionerClass(TotalOrderPartitioner.class ); TotalOrderPartitioner.setPartitionFile(conf, partitionsPath); } 分析上面的源码,能够产生null的又和path相关的,显然是这行代码
采样优化:使用TotalOrderPartitioner配合范围分区,基于键分布采样建立均衡的分区边界 3.
方式三(推荐): 利用TotalOrderPartitioner类。