如何在aws emr上使用-libjars?

时间:2014-07-24 12:58:37

标签: amazon-web-services emr

Stack溢出有类似的问题,但没有一个回答这个问题。根据以下链接http://grepalex.com/2013/02/25/hadoop-libjars/,我们需要使用export HADOOP_CLASSPATH = / path / jar1:/ path / jar2来使其工作。那么如何执行导出HADOOP_CLASSPATH = / path / jar1:/ path / jar2 for -libjars选项才能工作。

我已经实现了一个工具运行器。它完美适用于hadoop和HDFS。

我尝试在使用自定义jar时执行此操作,但它提供了Exception 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

感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

您可以尝试创建FatJar和Run。尝试创建一个添加了依赖关系的jar,然后使用EMR运行。它会起作用。

在ant build中你可以使用如下

< zip destfile =“/ lib / abc-fatjar.jar”>

< zipgroupfileset dir =“lib”includes =“jobcustomjar.jar,json-simple-1.1.1.jar”/>

< / zip>

答案 1 :(得分:2)

对于Hadoop Streaming作业,您可以将代码捆绑到一个大Jar中,您可以使用以下技巧(在我的情况下,我为自定义输入和输出格式创建了自己的Java类。对于自定义分割器或其他任何东西,同样的技巧将适用)

  1. 创建一个包含自定义类的Jar

  2. 将Jar上传到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作业时,请在流式作业之前运行jar-fetcher脚本:

    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"
    

答案 2 :(得分:1)

这是我为Sandesh建立一个罐子的答案所做的。然后运行ant build-jar

<?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>

然后在EMR中指定fatjar.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