使用Hive自定义分区器,可以解决一些情况下产生的数据倾斜,下边给出自定义分区器流程,可做参考。
1、环境说明
当前环境采用Hadoop3.1.3以及Hive3.1.2版本。
2、自定义类
自定义类实现org.apache.hadoop.mapred.Partitioner(必须为这个,Hive中使用的是老的API)接口,这里只是做测试,所以所有数据我现在全部发送至0号分区,注意分区器中Key和Value类型!!
具体代码实现如下:
package com.wh;
import org.apache.hadoop.hive.ql.io.HiveKey;
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.Partitioner;
public class MyPartitioner implements Partitioner {
//实现每条数据的分区逻辑(这里选择将所有数据发送至0号分区)
@Override
public int getPartition(HiveKey s, BytesWritable s2, int numPartitions) {
return 0;
}
//读取配置信息的方法
@Override
public void configure(JobConf job) {
}
}
3、打包到集群/opt/hive/lib目录下
将写好的代码打包上传至集群,放置在Hive的安装路径下的lib目录即可
4、在Hive中进行测试
(1)添加jar包
进入Hive的客户端执行以下命令
hive (default)> add jar /opt/hive/lib/partition.jar;
(2)设置Hive中使用自定义分区器
hive (default)> set hive.mapred.partitioner = com.wh.MyPartitioner;
(3)修改Reducer数量
hive (default)> set mapreduce.job.reduces=3;
(4)执行SQL进行测试
测试数据展示:
hive (default)> select empno from emp;OK
empno
7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934
使用自定义分区器对empno字段进行分区处理
hive (default)> insert overwrite local directory '/opt/data/distribute-result' select * from emp distribute by deptno sort by empno desc;
(5)查看结果
-rw-r--r--. 1 atguigu atguigu 707 11月 1 13:13 000000_0
-rw-r--r--. 1 atguigu atguigu 0 11月 1 13:13 000001_0
-rw-r--r--. 1 atguigu atguigu 0 11月 1 13:13 000002_0
发现只有0号分区有数据,自定义Hive分区器完成!!!
了解更多内容:
推荐算法!基于隐语义模型的协同过滤推荐之用户商品推荐列表
推荐算法!基于隐语义模型的协同过滤推荐之商品相似度矩阵
任务调度系统的后起之秀——DolphinScheduler(二)
任务调度系统的后起之秀——DolphinScheduler(三)
任务调度系统的后起之秀——DolphinSchedular(一)
页面更新:2024-06-11
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号