【问题标题】:How do I make sure RegexSerDe is available to my Hadoop nodes?如何确保 RegexSerDe 可用于我的 Hadoop 节点?
【发布时间】:2012-06-16 12:52:49
【问题描述】:

我正在尝试解决使用 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 有效(我认为在本地,因为我没有得到 map % 和 reduce % 输出),我从样本数据中得到了 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

提前致谢!

【问题讨论】:

    标签: hadoop hive classnotfoundexception elastic-map-reduce


    【解决方案1】:

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

    scp library.jar task-tracker-1:~/<HADOOP_HOME>/lib/
    

    或在引导脚本中使用 EMR:

    s3cmd get s3://path/to/lib.jar /home/hadoop/lib/
    

    当我们使用 EMR 时,我们只有一个 s3 目录,里面装满了我们会同步到 hadoop lib 目录的 jars:

    s3cmd sync s3://static/jars/ /home/hadoop/jars
    cp jars/*.jar lib/
    

    如果你使用 oozie,你也可以将 jars 放在 oozie.share.lib 目录中。

    【讨论】:

    • 我在 s3 中添加了一个带有 s3cmd get ... 的 .sh 脚本,并尝试创建一个新集群,但返回码为非零。原来 s3cmd 需要一个 .s3cfg 文件。是否可以从 s3 中提取文件而不是使用 s3cmd?与此同时,我手动将 jar scp'ed 到我的 hadoop 节点,它似乎正在工作(如,我得到一个新的、不相关的错误)。这是一个很大的帮助,尽管我仍然很好奇为什么add jar ... 没有像(看似)宣传的那样工作。该命令不应该处理将 jars 传送到其他节点吗?
    • 您是否为每个 hive 终端会话运行 ADD JAR? ADD JAR 是临时的,所以如果你开始一个新的 hive 会话,你必须再做一次。
    • 是的,我愿意。至少,我很确定我知道。当我收到此错误时,也许我已经重新启动了配置单元并忘记再次添加 JAR。我今天将开始一个新的 EMR 工作流程,所以我会再次仔细检查这一切。再次感谢。
    • 顺便说一句,您是如何在 EMR 引导脚本中配置 s3cmd 的?你有什么东西可以输出或下载你的 .s3cfg 文件吗?
    • 不,启动时盒子上有 AWS 凭证,因此您可以复制这些凭证。不记得他们现在住在哪里。诚实地使用hadoop fs客户端更容易,它可以很好地读/写s3。
    【解决方案2】:

    我将 serde jar 文件复制到了

    hadoop/lib
    

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

    【讨论】:

      【解决方案3】:

      我猜你只需要将此 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-03
        • 2016-05-29
        相关资源
        最近更新 更多