如何确保我的Hadoop节点可以使用RegexSerDe?

aws*_*ard 1 hadoop hive classnotfoundexception elastic-map-reduce

我正试图用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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我从任务跟踪器检查系统日志,并查看,除其他外,

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
Run Code Online (Sandbox Code Playgroud)

我已经google'd并且这样做了,但我想我的google-fu不符合要求.我发现的一切都指向人们遇到麻烦并通过运行add jar命令来解决它.我试过了,我已经尝试将它添加到我的hive-site.xml,我尝试过在本地尝试,尝试将jar放入s3桶中.尝试添加引导步骤以在引导阶段(灾难)期间添加它.

任何人都可以帮我弄清楚.)为什么我的任务节点找不到RegexSerDe,而b.)如何使这个工作?如果他们可能揭示的不仅仅是运行,那么也欢迎链接add jar.

提前致谢!

Mat*_*one 5

解决这个问题的最简单方法是将所有这些罐子添加到所有任务跟踪器上的hadoop的lib目录中,我们用一堆东西来做:

scp library.jar task-tracker-1:~/<HADOOP_HOME>/lib/
Run Code Online (Sandbox Code Playgroud)

或者在引导脚本中使用EMR:

s3cmd get s3://path/to/lib.jar /home/hadoop/lib/
Run Code Online (Sandbox Code Playgroud)

当我们使用EMR时,我们只有一个充满jar的s3目录,我们将同步到hadoop lib目录:

s3cmd sync s3://static/jars/ /home/hadoop/jars
cp jars/*.jar lib/
Run Code Online (Sandbox Code Playgroud)

如果您使用oozie,您还可以将jar放在oozie.share.lib目录中.