2012-06-13 15 views
1

我試圖攻擊與蜂巢分析網絡日誌的問題,我已經看到了很多例子在那裏,但我似乎無法找到與這一具體問題的人。我如何確定RegexSerDe可用於我的Hadoop節點?

下面是我在哪裏:我已經建立了一個AWS ElasticMapReduce集羣,我可以登錄,和我火了蜂巢。我確信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'd和SO'ed這一點,但我想我的谷歌福不直到鼻菸。我發現的一切都指向有問題的人,並通過運行add jar命令解決問題。我已經嘗試過了,我試過將它添加到我的hive-site.xml,我嘗試過在本地嘗試將它放入s3存儲桶中。嘗試添加引導步驟以在引導階段(災難)添加它。

誰能幫我找出一個。)爲什麼我的任務節點找不到RegexSerDe,和b)如何使這項工作?也歡迎鏈接,如果他們可能會透露更多的東西,而不僅僅是運行add jar

在此先感謝!

回答

5

解決這個問題的最簡單的方法是將所有這些jar添加到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目錄罐子:

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

如果使用Oozie的,你也可以把罐子在oozie.share.lib目錄。

+0

我加了一個.SH腳本與's3cmd GET ...'在它S3和試圖建立一個新的羣集,但是用一個非零返回碼保存。結果s3cmd需要一個.s3cfg文件。是否有可能scp文件s3而不是使用s3cmd?與此同時,我手動將罐子放到我的hadoop節點上,它似乎正在工作(就像我正在得到一個新的無關的錯誤)。這很有幫助,儘管我仍然好奇爲什麼「添加jar」並沒有像(看起來)廣告那樣工作。這個命令是不是應該把你的其他節點放在罐子裏? – awshepard

+0

您是否爲每個配置單元終端會話運行ADD JAR?添加JAR是暫時的,所以如果您啓動一個新的配置單元會話,您必須重新執行一次。 –

+0

是的,我喜歡。至少,我很確定我是這樣做的。也許我重新啓動了配置單元,並在發生此錯誤時再次忘記添加JAR。我今天將開始一個新的EMR工作流程,所以我會再次檢查這一切。再次感謝。 – awshepard

0

我的SERDE jar文件複製到

hadoop/lib 

目錄,也做了Hadoop的(甚至是服務器),以真正的工作重新啓動。

-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

之後,開始配置單元會話,你會發現一切正常。

如果你需要這個變量永久地把這個變成.profile文件或.bash_profile根據您的操作系統

相關問題