hive使用中的问题,优化,总结

下面是几年来hive使用过程中的一些问题总结,可能随着版本升级这些问题都不是问题,写下来留个纪念

数据倾斜解决:
数据量大不怕,就怕数据倾斜
a. 从sql语句入手,优化语句
a1.尽量用分区过滤,减少数据量,
a2.每个表单独用where过滤不需要的数据,再拉出数据集,不要将过滤条件放在最后或on后面(过滤条件放where后与inner join时等价,left join时影响很大)由于where 和join的的天然属性,需要遵循 先过滤再join,勿先join再过滤
a3.过滤掉关联键,groupby 键null值的数据,或将null值键转成随机随机数(这样随机数都是关联不上的,但数据没有集中到某一reduce),总的目的是将mapp后数据均匀分散到各个reduce,不让其集中到一个reduce
a4.join或group by某一字段,重复数据太多,导致数据往某一reduce集中,但数据不能舍弃,可以先将重复最多的top n 数据单独拉出来处理,再处理其他重复率较小的数据,最后union all起来
b.想办法实现map端join
c.调整application虚拟内存调整设置
d.参数调节:
hive.map.aggr=true
Map 端部分聚合,相当于Combiner
hive.groupby.skewindata=true
有数据倾斜的时候进行负载均衡,当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操 作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布 到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。

解决hive执行中报虚拟内存oom错误:
hive 报:Container [pid=13549,containerID=container_1463873212013_14092_01_000142] is running beyond virtual memory limits. Current usage: 258.4 MB of 2 GB physical memory used; 4.4 GB of 4.2 GB virtual memory used. Killing container.

解决:job申请虚拟内存大小=mapreduce.map.memory.mb*2.1(默认) ,在这个范围内的内存使用率job运行无压力 ps:注释不能放进代码里跑

set mapreduce.map.memory.mb=3072; 
set mapreduce.reduce.memory.mb=3072;
set mapreduce.map.java.opts=-Xmx2457m;  --这个值应设为mapreduce.map.memory.mb 70%-80%
set mapreduce.reduce.java.opts=-Xmx2457m; --这个值应设为mapreduce.reduce.memory.mb 70%-80%
set yarn.nodemanager.vmem-check-enabled=false;--false表示不检查虚拟内存配置?这个貌似没起作用
set yarn.nodemanager.vmem-pmem-ratio=2.1;--AM申请的虚拟内存与mapreduce.map.memory.mb或 mapreduce.reduce.memory.mb的比率,单现在配置非2.1好像不起作用,不管怎么配虚拟内存申请量都是 mapreduce.map.memory.mb的2.1倍
set mapred.child.java.opts=-Xmx512m;

根据不同设值后如果job还报错,就看如下爆出来的错误信息里物理内存和虚拟内存信息,一步一步调大虚拟内存申请量,
如下:
最开始mapreduce.reduce.memory.mb和mapreduce.map.memory.mb都是1024,虚拟内存申请量为1024m2.1=2.1G,但实际虚拟内存使用是2.3G,所以报错
is running beyond virtual memory limits. Current usage: 290.6 MB of 1 GB physical memory used; 2.3 GB of 2.1 GB virtual memory used. Killing container.
第二步,将mapreduce.reduce.memory.mb和mapreduce.map.memory.m调成2048,虚拟内存申请量为2048m
2.1=4.2G,但实际虚拟内存使用是4.4G(上个job已经跑过,跑另一个job),所以又报错
is running beyond virtual memory limits. Current usage: 258.4 MB of 2 GB physical memory used; 4.4 GB of 4.2 GB virtual memory used. Killing container.
第三步,将mapreduce.reduce.memory.mb和mapreduce.map.memory.m调成3072
所有job运行成功

从文件导入数据到表出现null
原因:1,文件分隔符与表定义的分隔符不一样,将文件分隔符与表定义分隔符调成一致
2,文件内列的字段类型与表定义的字段类型不一样,如一个表字段定义为bigint,文件里这个字段是数字,但实际上是string类型的,可以修改表字段类型为String

处理增量加载时 t_new union t_old left join t_new on t_new.id=t_old.id where t_new.id is null 报Container exited with a non-zero exit code 255错误
解决:在确保两个数据集没有重复数据时用union all 代替union 因为union有去重操作

sqoop 导出数据到mysql, sqoop export 报 Can’t parse input data: '\N’
是数据中null值,导出时无法识别
解决:指定下面两个参数:
–input-null-string “\\N”
–input-null-non-string “\\N” \

sqoop export --connect jdbc:mysql://x.x.x.x:3306/fdd_infr_cdw
–username etl --password 9I68c_0mSL1R
–table fact_customer_house_event_times
–export-dir /user/hive/warehouse/fdd_infr_cdw.db/fact_customer_house_event_times
–input-fields-terminated-by ‘\001’
–input-null-string “\\N”
–input-null-non-string “\\N”
– --default-character-set=utf-8
-m 3

hive中null 和 ’ '
hive 和mysql中 null值是不参与关联的,就是说关联字段存在null值时,等于null的那些记录会舍弃掉不会参与关联
但’ ‘会参与关联,如果两个表关联字段有多个’ '则会残生笛卡尔积

hive UDF使用步骤
1.将udf打成jar包
2.将jar包上传到文件系统(linux本地文件系统或hdfs)
3.hive命令行下执行:add jar /home/hive/UDF/com.fangdd.data.hive.udf-1.0-SNAPSHOT.jar;
CREATE TEMPORARY FUNCTION search_tag as ‘com.fangdd.data.hive.udf.SearchTagUDF’;
4.使用udf

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值