记一次hive查询报错的问题
CDH中安装完hive后,执行select count(*) from table,居然报错了 进入yarn的webui页面,查看对应的任务的logs 重点是这句:
Error running local (uberized) 'child' : java.lang.UnsatisfiedLinkError: org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy()Z
网上找了一圈,说是Mapreduce任务进入Uber模式,但是ApplicationMaster没有加载Native Libraries,并且提供了一种方法可以试试:
1.在CM上设置参数:yarn.app.mapreduce.am.command-opts为" -Djava.net.preferIPv4Stack=true - Djava.library.path=/opt/cloudera/parcels/CDH-5.5.4-1.cdh5.5.4.p0.9/lib/hadoop/lib/native" 2.在Hive客户端里制定参数:set yarn.app.mapreduce.am.command-opts=-Djava.library.path=/opt/cloudera/parcels/CDH-5.5.4-1.cdh5.5.4.p0.9/lib/hadoop/lib/native 存在问题:如果在Hive中set参数,貌似参数值不能出现空格,也就是说不能使用多个-D的方式。
经过测试,还是没有解决问题,最后在yarn的配置里面把mapreduce.job.ubertask.enable 的选项取消勾选,再次运行就可以成功。 顺便查了一下,Uber模式是Hadoop2.0中实现的一种针对MR小作业的优化机制。mapreduce.job.ubertask.enable 用来控制是否开启Uber运行模式,默认为false。而启用Uber运行模式会对小作业进行优化,不会给每个任务分别申请分配Container资源,这些小任务将统一在一个Container中按照先执行map任务后执行reduce任务的顺序串行执行。 Hadoop中对Uber模式的定义:
1:mapreduce.job.ubertask.enable=true,首先开启Uber模式,默认是false
2:mapreduce.job.ubertask.maxmaps map任务数的阀值默认是9
mapreduce.job.ubertask.maxreduces reduce任务数的阀值默认是1
即:map的数量<=9, reduce<=1
3:所有的输入文件的总长度<=默认的块的大小(128M)
4:mapreduce.map.memory.mb(默认是1024)<=内存需求(内存需求的大小由yarn.app.mapreduce.am.resource.mb来决定,默认1536M)
5:cpu<=yarn.app.mapreduce.am.resource.cpu-vcores(默认1)
6:采用非链式方式运行MR(链式Job是指集成了org.apache.hadoop.mapreduce.lib.chain.ChainReducer和org.apache.hadoop.mapreduce.lib.chain.ChainMapper类的用户Map或Reduce程序)
Uber模式优点:
针对多个小作业,开启uber模式,mapreduce会将所有的task任务放在一个JVM中完成,就需要每个task都去申请资源,启动一个Container容器,
而是多个task申请一份资源,资源会重复的利用,这样的话可以节省cpu及网络Io,磁盘Io的消耗,节省了job运行的时间。
至于为什么开始Uber模式后运行hivesql会报错,等后续找到原因再来更新!
|