我正在尝试解决使用 Hive 分析网络日志的问题,我已经看到了很多例子,但我似乎找不到任何有这个特定问题的人。
这就是我所处的位置:我已经设置了一个AWS ElasticMapReduce集群,我可以登录,然后启动Hive。 我确保add jar hive-contrib-0.8.1.jar
,它说它已加载。 我创建了一个名为 event_log_raw
的表,其中包含一些字符串列和一个正则表达式。 load data inpath '/user/hadoop/tmp overwrite into table event_log_raw
,我要去比赛了。 select * from event_log_raw
有效(我认为在本地,因为我没有得到地图 % 并减少 % 输出),并且我从样本数据中获取了 10 条记录,正确解析,一切都很好。 select count(*) from event_log_raw
也可以工作,这次创建了一个mapreduce作业。
我想将我的request_url
字段转换为地图,所以我运行:
select elr.view_time as event_time, elr.ip as ip,
str_to_map(split(elr.request_url," ")[1],"&","=") as params
from event_log_raw elr
Mapreduce启动,等待,等待...失败。
FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.MapRedTask
MapReduce Jobs Launched:
Job 0: Map: 1 HDFS Read: 0 HDFS Write: 0 FAIL
我从任务跟踪器中检查系统日志,并查看除其他事项外,
java.lang.RuntimeException: Error in configuring object
at org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:93)
at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:64)
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:117)
<snip>
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.contrib.serde2.RegexSerDe
at org.apache.hadoop.hive.ql.exec.MapOperator.setChildren(MapOperator.java:406)
at org.apache.hadoop.hive.ql.exec.ExecMapper.configure(ExecMapper.java:90)
... 22 more
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.contrib.serde2.RegexSerDe
我已经谷歌了这个,但我想我的谷歌 fu 达不到鼻烟。 我发现的所有内容都表明人们对此有问题,并通过运行 add jar
命令来解决它。 我已经尝试过,我尝试将其添加到我的hive-site.xml
中,我尝试在本地使用它,尝试将罐子放入 s3 存储桶中。 已尝试添加引导步骤以在引导阶段(灾难)添加它。
谁能帮我弄清楚。为什么我的任务节点找不到正则表达式,以及 b.)如何做到这一点? 链接也是受欢迎的,如果它们可能揭示的不仅仅是运行add jar
。
提前感谢!
简单方法是将所有这些jar添加到所有任务跟踪器的hadoop的lib目录中,我们使用一堆东西来做到这一点:
scp library.jar task-tracker-1:~/<HADOOP_HOME>/lib/
或在引导脚本中使用 EMR:
s3cmd get s3://path/to/lib.jar /home/hadoop/lib/
当我们使用 EMR 时,我们只有一个装满 jar 的 s3 目录,我们会将其同步到 hadoop lib 目录:
s3cmd sync s3://static/jars/ /home/hadoop/jars
cp jars/*.jar lib/
如果你使用oozie,你也可以把jars放在oozie.share.lib目录中。
我将 serde jar 文件复制到
hadoop/lib
目录,还重新启动了Hadoop(甚至服务器)以真正工作。
我想您所需要的只是将此jar文件添加到变量HIVE_AUX_JARS_PATH
例如
如果您的hive-contrib-0.8.1.jar
处于/usr/hive/lib
然后运行
export HIVE_AUX_JARS_PATH=/usr/hive/lib/hive-contrib-0.8.1.jar:$HIVE_AUX_JARS_PATH
或者如果HIVE_AUX_JARS_PATH
不存在,只需运行
export HIVE_AUX_JARS_PATH=/usr/hive/lib/hive-contrib-0.8.1.jar
.
之后,启动配置单元会话,您将看到一切正常。
如果您需要此变量,请根据操作系统将其永久放入.profile
文件或.bash_profile
中