2014-07-24 36 views
2

堆棧溢出也有類似的問題,但沒有人回答這個問題。根據以下鏈接http://grepalex.com/2013/02/25/hadoop-libjars/,我們需要使用export HADOOP_CLASSPATH =/path/jar1:/ path/jar2來使其工作。那麼,如何執行export HADOOP_CLASSPATH =/path/jar1:/ path/jar2以使-libjars選項正常工作。如何在aws emr上使用-libjars?

我已經實施了一個工具亞軍。它在hadoop和HDFS上完美運行。

我嘗試使用自定義的罐子執行此一段時間,但它提供了異常java.lang.NoClassDefFoundError: org/json/simple/parser/JSONParser

這是我在EMR那裏我使用MultipleInputs和文件來分析,所以你可以看到多條路徑作爲參數,此工程在跑在hadoop中運行。

Alert -libjars s3n://akshayhazari/jars/json-simple-1.1.1.jar -D mapred.output.compress=true -D mapred.output.compression.type=BLOCK -D io.seqfile.compression.type=BLOCK -D mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec s3n://akshayhazari/rule/rule1.json s3n://akshayhazari/Alert/input/data.txt.gz s3n://akshayhazari/Alert/input/data1.txt.gz s3n://akshayhazari/Alert/output

任何幫助表示讚賞。

回答

2

你可以嘗試創建FatJar並運行。嘗試創建一個添加了依賴項的jar,然後使用EMR運行。它會工作。

在ant構建

可以如下

<拉鍊destfile使用= 「/ LIB/ABC-fatjar.jar」>

< zipgroupfileset DIR = 「LIB」 包括=「jobcustomjar.jar,JSON - 簡單-1.1.1.jar」 />

</ZIP>

+0

對不起患了發燒,沒有檢查一段時間。正如你所說,我用螞蟻創造了一個肥佬。這比用maven構建更容易。有效。謝謝 –

1

這裏就是我所做添加到Sandesh的回答建立一個罐子。然後再指定路徑在EMR到fatjar.jar後運行ant積聚罐

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<project name="alert"> 
    <target name="build-jar"> 
    <jar destfile="lib/fatjar.jar" 
    basedir="classes"> 
     <manifest> 
    <attribute name="Main-Class" value="alert.Alert"/> 
     </manifest> 
     <zipgroupfileset dir="." includes="json-simple-1.1.1.jar" /> 
    </jar> 
    </target> 
</project> 

,使用下述作爲參數。

-D mapred.output.compress=true -D mapred.output.compression.type=BLOCK -D io.seqfile.compression.type=BLOCK -D mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec s3n://akshayhazari/rule/rule1.json s3n://akshayhazari/Alert/input/data.txt.gz s3n://akshayhazari/Alert/input/data1.txt.gz s3n://akshayhazari/Alert/output 
1

對於Hadoop的工作流,你不能捆綁你的代碼變成一個大罐,你可以使用下面的技巧(在我的情況,我創建了自己的Java類的定製輸入和輸出格式。對於自定義分離器或任何其他,這同樣的技巧也適用)

  1. 創建JAR文件包含您的自定義類

  2. 上傳罐子S3:

    aws s3 cp myjar.jar s3://mybucket/myjar.jar 
    
  3. 創建shell腳本提取Jar並將其複製到主節點:

    #!/bin/bash 
    hadoop fs -copyToLocal s3://mybucket/myjar.jar /home/hadoop/myjar.jar 
    
  4. 上傳的shell腳本S3:

    aws s3 cp jar_fetcher.sh s3://mybucket/jar_fetcher.sh 
    
  5. 在創建EMR的工作,你的數據流作業之前運行的罐子取功能的腳本:

    elastic-mapreduce --create \ 
        --ami-version "3.3.1" \ 
        --name "My EMR Job using -libjars" \ 
        --num-instances 3 \ 
        --master-instance-type "m3.xlarge" --slave-instance-type "m3.xlarge" \ 
        --script s3://mybucket/jar_fetcher.sh \ 
        --step-name "Jar fetcher for -libjars" \ 
        --stream \ 
        --args "-libjars,/home/hadoop/myjar.jar" \ 
        --args "-D,org.apache.hadoop.mapreduce.lib.input.FileInputFormat=my.custom.InputFormat" \ 
        --args "-outputformat,my.custom.OutputFormat" \ 
        --arg "-files" \ 
        --arg "s3://mybucket/some_job.py,s3://mybucket/some_utils.py" \ 
        --mapper "python some_job.py --someArg" \ 
        --reducer NONE \ 
        --input s3://mybucket/someData \ 
        --output s3://mybucket/results/someJob \ 
        --step-name "Streaming step with -libjars" 
    
+0

謝謝。這可能有助於某個時候。 –