Lio*_*cer 2 java hadoop mapreduce
我有一个远程运行的hadoop集群.我能够完成教程:
在我的远程计算机上,因为有一个内置的hadoop实例.但是,我希望在本地执行相同的任务.对hadoop不熟悉我不知道怎么做.我想知道我是否可以运行程序并将结果发送回本地计算机.我不确定如何登录到我的远程计算机然后运行MapReduce作业.
这是我在远程计算机上的代码:
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class WordCount {
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
conf.set("mapred.job.queue.name", "exp_dsa");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这对你来说有点晚了,但是人们肯定可以从我的回复中获益,因为我正在寻求非常相似的设置并且能够远程运行作业(甚至从Eclipse).
首先让我提一下,您的机器上不需要任何Hadoop Distribution来远程提交作业(至少在Hadoop 2.6.0中,根据发布信息和发布问题的日期,这似乎没问题) .我将解释如何从Eclipse运行该作业.
让我从配置开始.很少有资源可以提供如何实现这一点,但没有一个解决方案提供给我,没有其他配置.
在服务器上.
假设您安装了Hadoop,Yarn和HDFS,您的第一步应该是正确配置系统变量(当然,您将在以后需要它们).我建议编辑名为hadoop-env.sh(在我的情况下位于/etc/hadoop/conf/)的文件并包含以下行:
export HADOOP_CONF_DIR=/etc/hadoop/conf/
export HADOOP_COMMON_HOME=/usr/lib/hadoop/
export HADOOP_HDFS_HOME=/usr/lib/hadoop-hdfs/
export HADOOP_YARN_HOME=/usr/lib/hadoop-yarn/
export HADOOP_MAPRED_HOME=/usr/lib/hadoop-mapreduce/
Run Code Online (Sandbox Code Playgroud)
(其中/usr/lib/hadoop/对应于安装Hadoop的目录).重启服务.
在core-site.xml,您应该具有以下配置:fs.defaultFS,在某处记下它并检查防火墙是否具有开放端口,以便外部客户端可以执行与数据相关的操作.如果您没有此配置,请将以下条目添加到该文件:
<property>
<name>fs.defaultFS</name>
<value>hdfs://<host-name></value>
<final>true</final>
</property>
Run Code Online (Sandbox Code Playgroud)假设您已正确配置namenode(s)和datanode(s).编辑yarn-site.xml文件并添加以下条目(或检查它们是否存在并记下配置)
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value><your-hostname>:8050</value>
</property>
<property>
<name>yarn.application.classpath</name>
<value>
$HADOOP_CONF_DIR,
$HADOOP_COMMON_HOME/*,$HADOOP_COMMON_HOME/lib/*,
$HADOOP_HDFS_HOME/*,$HADOOP_HDFS_HOME/lib/*,
$HADOOP_MAPRED_HOME/*,$HADOOP_MAPRED_HOME/lib/*,
$HADOOP_YARN_HOME/*,$HADOOP_YARN_HOME/lib/*
</value>
</property>
Run Code Online (Sandbox Code Playgroud)
(查看Hadoop文档以了解不同配置的含义)
mapred-site.xml使用以下条目修改文件:
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.staging-dir</name>
<value>/user</value>
</property>
Run Code Online (Sandbox Code Playgroud)重启服务.服务器大部分都准备好了.检查是否可以从外部访问所有必需的端口(以下网站上有完整的列表,其中一些应该是打开的,请与您的系统管理员联系)
在客户端上
在Eclipse中创建一个项目(简单的Java应用程序).创建Mapper和Reducer(有很多教程,我不会在这里给出任何示例).现在在Main类中,您应该为您的作业提供以下配置(它可能会有所不同,具体取决于您的安全性和系统限制,因此如果您无法远程连接到服务器计算机,您应该自己挖掘这个配置)
Configuration conf = new Configuration();
conf.set("yarn.resourcemanager.address", "<your-hostname>:8050"); // see step 3
conf.set("mapreduce.framework.name", "yarn");
conf.set("fs.defaultFS", "hdfs://<your-hostname>/"); // see step 2
conf.set("yarn.application.classpath",
"$HADOOP_CONF_DIR,$HADOOP_COMMON_HOME/*,$HADOOP_COMMON_HOME/lib/*,"
+ "$HADOOP_HDFS_HOME/*,$HADOOP_HDFS_HOME/lib/*,"
+ "$HADOOP_YARN_HOME/*,$HADOOP_YARN_HOME/lib/*,"
+ "$HADOOP_MAPRED_HOME/*,$HADOOP_MAPRED_HOME/lib/*");
Job job = Job.getInstance(conf);
if (args.length>0) {
job.setJar(args[0]); // see below, use this when submitting from Eclipse
} else {
job.setJarByClass(HadoopWorkloadMain.class); // use this when uploaded the Jar to the server and running the job directly and locally on the server
}
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(DoubleWritable.class);
job.setMapperClass(SomeMapper.class);
job.setCombinerClass(SomeReducer.class);
job.setReducerClass(SomeReducer.class);
FileInputFormat.addInputPath(job, new Path("/inputs/")); // existing HDFS directory
FileOutputFormat.setOutputPath(job, new Path("/results/")); // not existing HDFS directory
job.waitForCompletion(true);
Run Code Online (Sandbox Code Playgroud)
必须根据此资源设置类路径配置.
这应该可以解决问题.运行您的主,看看Hadoop工作.无论如何,我祝你好运和耐心,听起来很容易的任务可能需要相当大的努力.
故障排除:
| 归档时间: |
|
| 查看次数: |
5376 次 |
| 最近记录: |