Hive和mapreduce相关的排序和运行的参数

1.设置每个reduce处理的数据量(单位是字节)

我们在hive中查看下




hive 排序后将 数据相同的排序值一致 hive排序取前十_macbook文件排序添加日期倒叙


配置文件hive-site.xml.template


hive 排序后将 数据相同的排序值一致 hive排序取前十_mapreduce复制连接的代码_02


我们打开配置文件可以看到


hive 排序后将 数据相同的排序值一致 hive排序取前十_mapreduce复制连接的代码_03


这是256MB


hive 排序后将 数据相同的排序值一致 hive排序取前十_mapreduce复制连接的代码_04


如果超过1G,将使用4个reducers


hive 排序后将 数据相同的排序值一致 hive排序取前十_macbook文件排序添加日期倒叙_05


2、设置最大运行的reduce的个数

同上我们可以在配置中找到下面的内容


hive 排序后将 数据相同的排序值一致 hive排序取前十_pyspark udf 多个参数_06


复制到记事本里,简化了描述,从配置中我们可以看到默认reduce个数是1009


hive 排序后将 数据相同的排序值一致 hive排序取前十_jar_07


3.实际运行的reduce的个数

这个去哪里看呢?我们用之前执行过的reduce


hive 排序后将 数据相同的排序值一致 hive排序取前十_macbook文件排序添加日期倒叙_08


访问8088端口,查看历史history


hive 排序后将 数据相同的排序值一致 hive排序取前十_hive_09


进入后在configuration中可以搜索到,可以看到我们的语句是否有reduce。

默认设置在hive中可以看到


hive 排序后将 数据相同的排序值一致 hive排序取前十_jar_10


如果我们使用下面的排序,是否reduce的数量有关系呢?

order by 全局排序

sort by:局部排序

distribute by (底层是MR分区)

cluster by:相当于distribute by + sort by组合使用

假如我们设置成3个


hive 排序后将 数据相同的排序值一致 hive排序取前十_mapreduce复制连接的代码_11


执行语句

select * from emp order by sal;


hive 排序后将 数据相同的排序值一致 hive排序取前十_hive_12


hive 排序后将 数据相同的排序值一致 hive排序取前十_hive_13


所以对于order by 全局排序,设置多个reduce的没有太大作用。

执行语句

Insert overwrite local directory '/data/hivetest/export_local_emp' select * from emp sort by sal desc;

查看结果,reduce是3个


hive 排序后将 数据相同的排序值一致 hive排序取前十_macbook文件排序添加日期倒叙_14


生成文件


hive 排序后将 数据相同的排序值一致 hive排序取前十_macbook文件排序添加日期倒叙_15


查看文件内容,可以看到每个都排序了


hive 排序后将 数据相同的排序值一致 hive排序取前十_hive_16


所以对于sort by 局部排序,设置多个reduce的是有作用的。

执行语句

insert overwrite local directory '/opt/hivetest/distribute_test' ROW FORMAT DELIMITED FIELDS TERMINATED BY '' select * from emp distribute by deptno sort by sal ;


hive 排序后将 数据相同的排序值一致 hive排序取前十_jar_17


我们查看文件


hive 排序后将 数据相同的排序值一致 hive排序取前十_macbook文件排序添加日期倒叙_18


查看文件内容,都已经排序了


hive 排序后将 数据相同的排序值一致 hive排序取前十_macbook文件排序添加日期倒叙_19


所以对于distribute by 局部排序,设置多个reduce的是有作用的。有两个注意的地方

(1)可以按照指定的字段进行分区

(2)先分区后排序,一般和sort by联合使用

执行语句

insert overwrite local directory '/data/hivetest/cluster_test' ROW FORMAT DELIMITED FIELDS TERMINATED BY '' select * from emp cluster by sal ;


hive 排序后将 数据相同的排序值一致 hive排序取前十_hive_20


查看文件


hive 排序后将 数据相同的排序值一致 hive排序取前十_macbook文件排序添加日期倒叙_21


查看内容


hive 排序后将 数据相同的排序值一致 hive排序取前十_pyspark udf 多个参数_22


所以对于cluster by 局部排序,设置多个reduce的是有作用的,排序只能降序排序,不能指定排序规则

自定义函数(UDF)一进一出

实现一个功能,转换大小写,

首先创建一个maven项目


hive 排序后将 数据相同的排序值一致 hive排序取前十_jar_23


hive 排序后将 数据相同的排序值一致 hive排序取前十_jar_24


添加依赖

下面是依赖的主要内容

org.apache.hadoop

hadoop-client

2.7.3

org.apache.hive

hive-exec

1.2.1

org.apache.hive

hive-jdbc

1.2.1


hive 排序后将 数据相同的排序值一致 hive排序取前十_hive_25


hive 排序后将 数据相同的排序值一致 hive排序取前十_hive_26


创建一个类


hive 排序后将 数据相同的排序值一致 hive排序取前十_mapreduce复制连接的代码_27


编写代码


hive 排序后将 数据相同的排序值一致 hive排序取前十_hive_28


编写一个测试方法,测试代码


hive 排序后将 数据相同的排序值一致 hive排序取前十_jar_29


将写好的代码打成jar包,上传linx


hive 排序后将 数据相同的排序值一致 hive排序取前十_mapreduce复制连接的代码_30


一直点击下一步,其中注意主类的选择


hive 排序后将 数据相同的排序值一致 hive排序取前十_macbook文件排序添加日期倒叙_31


将jar添加到hive里面去

add jar /data/hivetest/hive_udf.jar;

将包上传


hive 排序后将 数据相同的排序值一致 hive排序取前十_mapreduce复制连接的代码_32


我们进入hive,使用db_deptemp库


hive 排序后将 数据相同的排序值一致 hive排序取前十_jar_33


执行命令


hive 排序后将 数据相同的排序值一致 hive排序取前十_hive_34


list jars 和 delete jar 分别是显示jar和删除jar


hive 排序后将 数据相同的排序值一致 hive排序取前十_macbook文件排序添加日期倒叙_35


创建临时函数

create temporary function convert_bl as 'com.xlglvc.xxx.mapredece.hiveudf.TestHiveUDF';


hive 排序后将 数据相同的排序值一致 hive排序取前十_jar_36


可以利用show functions查看函数


hive 排序后将 数据相同的排序值一致 hive排序取前十_jar_37


我们查看已有表的数据,可以看到很多大写的名字


hive 排序后将 数据相同的排序值一致 hive排序取前十_macbook文件排序添加日期倒叙_38


执行我们的函数就可以了


hive 排序后将 数据相同的排序值一致 hive排序取前十_mapreduce复制连接的代码_39