我目前使用以ruby编写的mapper和reducer代码运行流式作业。我想将这些转换为java。我不知道如何使用java运行EMR hadoop的流媒体作业。在amazon的EMR网站上发布的cloudburst样本太复杂了。以下是我目前如何运行这些工作的详细信息。
开始工作的代码:
elastic-mapreduce --create --alive --plain-output --master-instance-type m1.small
--slave-instance-type m1.xlarge --num-instances 2 --name "Job Name" --bootstrap-action
s3://bucket-path/bootstrap.sh
添加步骤的代码:
elastic-mapreduce -j <job_id> --stream --step-name "my_step_name"
--jobconf mapred.task.timeout=0 --mapper s3://bucket-path/mapper.rb
--reducer s3://bucket-path/reducerRules.rb --cache s3://bucket-path/cache/cache.txt
--input s3://bucket-path/input --output s3://bucket-path/output
映射器代码从csv文件中读取,该文件在上面提到为EMR的缓存参数,并且它从输入s3存储桶读取,该存储器也有一些csv文件,进行一些计算并将csv输出行打印到标准输出。
//mapper.rb
CSV_OPTIONS = {
// some CSV options
}
begin
file = File.open("cache.txt")
while (line = file.gets)
// do something
end
file.close
end
input = FasterCSV.new(STDIN, CSV_OPTIONS)
input.each{
// do calculations and get result
puts (result)
}
//reducer.rb
$stdin.each_line do |line|
// do some aggregations and get aggregation_result
if(some_condition) puts(aggregation_result)
end
答案 0 :(得分:0)
如果您使用的是java,则不使用流式传输。您可以直接针对MapReduce API构建Jar。
查看hadoop源代码的示例文件夹,了解如何执行此操作的一些很好的示例,包括臭名昭着的wordcount: https://github.com/apache/hadoop/tree/trunk/src/examples/org/apache/hadoop/examples
我不完全确定你为什么要使用Java,但直接编码到API可能会很痛苦。您可能想尝试以下之一: Java项目:
非爪哇:
FWIW我认为Pig可能是我的选择,并且在EMR上开箱即用。
答案 1 :(得分:0)
从现在起我在Hadoop和Mapreduce上拥有更好的据点,这就是我的预期:
要启动群集,代码将保持与问题中的大致相同,但我们可以添加配置参数:
ruby elastic-mapreduce --create --alive --plain-output --master-instance-type m1.xlarge --slave-instance-type m1.xlarge --num-instances 11 --name "Java Pipeline" --bootstrap-action s3://elasticmapreduce/bootstrap-actions/install-ganglia --bootstrap-action s3://elasticmapreduce/bootstrap-actions/configure-hadoop --args "--mapred-config-file, s3://com.versata.emr/conf/mapred-site-tuned.xml"
添加工作步骤:
第1步:
ruby elastic-mapreduce --jobflow <jobflo_id> --jar s3://somepath/job-one.jar --arg s3://somepath/input-one --arg s3://somepath/output-one --args -m,mapred.min.split.size=52880 -m,mapred.task.timeout=0
步骤2:
ruby elastic-mapreduce --jobflow <jobflo_id> --jar s3://somepath/job-two.jar --arg s3://somepath/output-one --arg s3://somepath/output-two --args -m,mapred.min.split.size=52880 -m,mapred.task.timeout=0
现在,对于Java代码,将有一个Main类,它将包含以下每个类的一个实现:
每个都必须覆盖方法map()和reduce()来完成所需的工作。
有问题的Java类如下所示:
public class SomeJob extends Configured implements Tool {
private static final String JOB_NAME = "My Job";
/**
* This is Mapper.
*/
public static class MapJob extends Mapper<LongWritable, Text, Text, Text> {
private Text outputKey = new Text();
private Text outputValue = new Text();
@Override
protected void setup(Context context) throws IOException, InterruptedException {
// Get the cached file
Path file = DistributedCache.getLocalCacheFiles(context.getConfiguration())[0];
File fileObject = new File (file.toString());
// Do whatever required with file data
}
@Override
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
outputKey.set("Some key calculated or derived");
outputVey.set("Some Value calculated or derived");
context.write(outputKey, outputValue);
}
}
/**
* This is Reducer.
*/
public static class ReduceJob extends Reducer<Text, Text, Text, Text> {
private Text outputKey = new Text();
private Text outputValue = new Text();
@Override
protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException,
InterruptedException {
outputKey.set("Some key calculated or derived");
outputVey.set("Some Value calculated or derived");
context.write(outputKey, outputValue);
}
}
@Override
public int run(String[] args) throws Exception {
try {
Configuration conf = getConf();
DistributedCache.addCacheFile(new URI(args[2]), conf);
Job job = new Job(conf);
job.setJarByClass(TaxonomyOverviewReportingStepOne.class);
job.setJobName(JOB_NAME);
job.setMapperClass(MapJob.class);
job.setReducerClass(ReduceJob.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
FileInputFormat.setInputPaths(job, args[0]);
FileOutputFormat.setOutputPath(job, new Path(args[1]));
boolean success = job.waitForCompletion(true);
return success ? 0 : 1;
} catch (Exception e) {
e.printStackTrace();
return 1;
}
}
public static void main(String[] args) throws Exception {
if (args.length < 3) {
System.out
.println("Usage: SomeJob <comma sparated list of input directories> <output dir> <cache file>");
System.exit(-1);
}
int result = ToolRunner.run(new TaxonomyOverviewReportingStepOne(), args);
System.exit(result);
}
}