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
感谢任何帮助。
答案 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类。对于自定义分割器或其他任何东西,同样的技巧将适用):
创建一个包含自定义类的Jar
将Jar上传到S3:
aws s3 cp myjar.jar s3://mybucket/myjar.jar
创建一个shell脚本,用于获取Jar并将其复制到主节点:
#!/bin/bash
hadoop fs -copyToLocal s3://mybucket/myjar.jar /home/hadoop/myjar.jar
将shell脚本上传到S3:
aws s3 cp jar_fetcher.sh s3://mybucket/jar_fetcher.sh
创建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