1

我正在尝试解决使用 Hive 分析 Web 日志的问题,并且我已经看到了很多示例,但我似乎找不到任何遇到此特定问题的人。

这就是我所在的位置:我已经设置了一个 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

我已经用谷歌搜索过这个,但我想我的 google-fu 达不到标准。我发现的一切都表明人们遇到了这个问题并通过运行add jar命令来解决它。我试过了,我试过把它添加到我的hive-site.xml,我试过把它放在本地,试着把罐子放在一个 s3 桶里。尝试添加引导步骤以在引导阶段添加它(灾难)。

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

提前致谢!

4

3 回答 3

5

解决这个问题的最简单方法是将所有这些 jars 添加到所有任务跟踪器上的 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 目录中。

于 2012-06-13T15:09:16.633 回答
0

我将 serde jar 文件复制到

hadoop/lib

目录并且还重新启动了hadoop(甚至服务器)以真正工作。

于 2014-08-27T06:36:55.313 回答
-1

我想您需要的只是将此 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.

之后开始 hive 会话,您将看到一切正常。

如果您需要此变量,请将其永久保存到.profile文件中或.bash_profile基于您的操作系统

于 2015-12-10T12:54:01.210 回答