Hive自定义函数后,编译源码,并解决数据倾斜

一、下载源码

首先进入网站:http://archive.cloudera.com/cdh5/cdh/5/

然后搜索 hive-1.1.0-cdh5.15.1-src

Hive自定义函数后,编译源码,并解决数据倾斜

二、自定义函数

2.1 添加随机数前缀函数

解压之后,可以用idea打开工程,然后在目录hive-1.1.0-cdh5.15.1/ql/src/java/org/apache/hadoop/hive/ql/udf下新建一个类UDFAddRandomPrefix

Hive自定义函数后,编译源码,并解决数据倾斜

Hive自定义函数后,编译源码,并解决数据倾斜

2.2 移除前缀函数

同样的在目录

hive-1.1.0-cdh5.15.1/ql/src/java/org/apache/hadoop/hive/ql/udf下新建一个类UDFRemoveRandomPrefix

Hive自定义函数后,编译源码,并解决数据倾斜

2.3 注册函数

上面的函数类我们已经定义好了,但是要注册一下,hive才会知道我们自己写的两个函数,

在类FunctionRegistry的静态代码块static下添加如下代码:

Hive自定义函数后,编译源码,并解决数据倾斜

Hive自定义函数后,编译源码,并解决数据倾斜

三、编译

终端切换到hive-1.1.0-cdh5.15.1目录

Hive自定义函数后,编译源码,并解决数据倾斜

然后执行下面命令

mvn clean package -DskipTests -Phadoop-2 -Pdist

最后出现下面这个图,说明编译成功

Hive自定义函数后,编译源码,并解决数据倾斜

四、结果

最终打包后的文件在hive-1.1.0-cdh5.15.1/packaging/target目录下

Hive自定义函数后,编译源码,并解决数据倾斜

后面直接进行部署就可以了

下图是hive-exec模块的编译结果

Hive自定义函数后,编译源码,并解决数据倾斜

因为我们刚刚添加的函数在hive-exec模块下添加自定义函数的,也可以把hive-exec-1.1.0-cdh5.15.1.jar直接上传部署好hive的lib目录下面

Hive自定义函数后,编译源码,并解决数据倾斜

五、测试函数

查看函数

show functions;

可以看到我们自己定义的两个函数了,如下图

Hive自定义函数后,编译源码,并解决数据倾斜

Hive自定义函数后,编译源码,并解决数据倾斜

我们看下函数的详细描述,看看文档是不是我们刚刚写的

desc function extended add_random_prefix;

如下图,这些不就是我们刚刚自定义函数写的说明么

Hive自定义函数后,编译源码,并解决数据倾斜

我们来使用一下这个函数:

select add_random_prefix('hive',10);

自动给我们加上随机数了

Hive自定义函数后,编译源码,并解决数据倾斜

我们再测试一下移除随机数

select remove_random_prefix('9_hive');

Hive自定义函数后,编译源码,并解决数据倾斜

到这里,说明我们的自定义的函数没有问题

六、解决数据倾斜问题

数据倾斜一般发生在聚合计算的时候,由于相同的key过多导致的,导致有一个task可能会计算的很慢,导致整个job的时间很长

Hive自定义函数后,编译源码,并解决数据倾斜

  1. 上面这个数据,是每个用户购买的产品,现在我们要计算每个用户总共购买了多少产品;
  2. 从上面的数据可以看出user3用户比较多,如果数量再扩大几十万倍,进行聚合的时候会发生数据倾斜的问题了,那么我们可以用上面两个自定义的函数解决数据倾斜问题

6.1 先把uid打散

打散的意思就是在uid字段的值前面加上随机数

select add_random_prefix(uid,5) as rdm_uid from user_pid;

Hive自定义函数后,编译源码,并解决数据倾斜

6.2 第一次聚合

把上面一次查询的结果作为临时表,对打散后的uid进行第一次聚合

Hive自定义函数后,编译源码,并解决数据倾斜

Hive自定义函数后,编译源码,并解决数据倾斜

6.3 移除随机数

现在可以用移除随机数的函数,把上面的结果uid前面的随机数进行移除

Hive自定义函数后,编译源码,并解决数据倾斜

Hive自定义函数后,编译源码,并解决数据倾斜

6.4 第二次聚合

把上面的结果作为临时表,把uid作为分组条件,对cnt进行求和,就可以得到我们的结果

Hive自定义函数后,编译源码,并解决数据倾斜

Hive自定义函数后,编译源码,并解决数据倾斜

到此数据倾斜解决


分享到:


相關文章: