1、遇到内存不够怎么办
一般情况下是reduce端内存溢出,设置以下参数:
set mapreduce.reduce.java.opts=-Xmx10000M;
set mapreduce.reduce.memory.mb=10000;
set mapreduce.reduce.tasks=64;
2、遇到异常数据,比如说null,导致npe,程序退出
使用 coalesce 函数可以设置当值为null或者None等异常的时候的默认值
coalesce(col,"invalid")
3、mapjoin,在遇到两个表jion其中一个表的数据量很少,可以使用mapjoin优化
set hive.auto.convert.join = true;
select /*+MAPJOIN(mobile_location)*/ a.*,b.province as mob_province,b.city as mob_city from userinfo a
left outer join mobile_location b on (b.mob_prefix=substr(a.reg_mobile,0,7)) ;
4、udf 使用
编程比较简单,添加jar和file有点麻烦
add file /export/tmp/qingwu.fu/userinfo/NIandLocal.txt;
add jar /export/tmp/qingwu.fu/userinfo/hive-udf-1.0-SNAPSHOT.jar;
create temporary function jg as 'JiGuanUDF';
如果报file not find , 再创建一下临时function就可以
4、输出压缩,合并小文件
set hive.exec.compress.output=true;
set hive.hadoop.supports.splittable.combineinputformat=true
set mapred.max.split.size=256000000; #每个Map最大输入大小
set mapred.min.split.size.per.node=256000000; #一个节点上split的至少的大小
set mapred.min.split.size.per.rack=256000000; #一个交换机下split的至少的大小
set hive.input.format=org.apache.Hadoop.hive.ql.io.CombineHiveInputFormat; #执行Map前进行小文件合并