hadoop MapReduce框架可以让你的应用在集群中:可靠地、容错地、并行、处理TB级别的数据。
本实例通过idea运行java本地代码,实现统计单词计数。
hadoop集群搭建见 hadoop基于zookeper自动高可用搭建。这里就不在重复赘述。
1 统计文件准备
1.1 创建需要统计单词的文件
任意选择一条服务器,创建包含hello world number hello.txt文件
for i in `seq 100000`;do echo hello world $i >hello.txt ;done;
1.2 上传到hdfs文件系统上
创建目录 /home/root
hdfs dfs -mkdir /home
hdfs dfs -mkdir /home/root
查看是否创建成功
hdfs dfs -ls /home
上传文件到hdfs服务器上
设置块大小为1MB
hdfs dfs -D dfs.blocksize=1048576 -put hello.txt /home/root
通过前台页面:node2:50070 可以看到上传文件被分为2个块 ,存放在node3和node4上
2 创建java项目
结构如下:
2.1 配置文件
conf目录下配置文件core-site.xml和hdfs-site.xml文件来在hadoop集群服务器上,路径为HADOOP_HOME/etc/hadoop。将此文件拷贝到本地java工程即可
cd $HADOOP_HOME/etc/hadoop
2.2 java代码
2.2.1 WordCountMapper 类
WordCountMapper 类需要重写map方法,代码如下:
ublic class WordCountMapper extends Mapper<LongWritable,Text,Text,IntWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// key value
// <0, "hello world 1">
// "hello bjsxt 1" 输出到reduce
String line=value.toString();
String [] words=line.split(" ");
for (int i = 0; i < words.length-1; i++) {//排除最后一位数字
context.write(new Text(words[i]),new IntWritable(1));
}
}
}
2.2.2WordCountReducer 类
WordCountReducer 类需要重写reduce方法。代码如下
public class WordCountReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
// <"hello", 1>
// <"hello", 1>
// key "hello", {1,1,1,1,1,1,1,1,1,1,1,1} reducer 处理前结果
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum=0;
for (IntWritable value : values) {
sum+=value.get();
}
// 输出结果为 <hello ,120>
context.write(key,new IntWritable(sum));
}
}
2.2.3 MainClass 类
MainClass类为本地运行类,代码如下:
//客户端运行
public class MainClass {
// yarn jar mywc.jar com.bjsxt.mr.wordcount.MainClass /input /output
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
long start = System.currentTimeMillis();
if(args==null ||args.length!=2){
System.out.println("Usage: yarn jar mywc.jar com.wh.mr.wordcount.MainClass <inpath> <outpath>");
System.exit(1);
}
Configuration conf=new Configuration(true);
// 本地运行
conf.set("mapreduce.framework.name","local");
// 创建mapreduce作业Job对象
Job job=Job.getInstance(conf);
// 设置作业的名称
job.setJobName("单次计数");
// 设置作业的主入口类
job.setJarByClass(MainClass.class);
// 设置输入文件路径,该方法可以调用多次,用于设置多个输入文件路径
FileInputFormat.addInputPath(job,new Path(args[0]));
// 设置输出文件路径
FileOutputFormat.setOutputPath(job,new Path(args[1]));
// 设置mapper类
job.setMapperClass(WordCountMapper.class);
// 设置reducer类
job.setReducerClass(WordCountReducer.class);
// 设置mapper输出key的类型,用于排序
job.setMapOutputKeyClass(Text.class);
// 设置mapper输出value的类型
job.setMapOutputValueClass(IntWritable.class);
// 提交作业到集群运行,并等待程序在集群中运行结束
job.waitForCompletion(true);
long end = System.currentTimeMillis();
long cost = end - start;
System.out.println("耗时:"+cost);
}
}
3 参数设置
需要从main方法传入需要处理的文件以及输出结果目录,设置如下图所示
需要注意的是 program arguments参数设置需要处理的文件以及处理结果路径。结果处理存放路径不能是存在的,不然程序会抛异常
4 运行结果
运行程序以后,通过页面node2:50070进入文件管理可以看到执行结果
存放到/mr/output目录下
执行结果写入到 part-r-00000文件中,该文件块id为1073742362。
写入到node3和node5上
node3和node5任意选一台,本实例选择node5.
进入数据存放目录。
core-site.xml(cd $HADOOP_HOME/etc/hadoop)这个配置文件
/var/wh/hadoop/ha
进入如下路径
var/wh/hadoop/ha/dfs/data/current/BP-1264273982-192.168.8.62-1605458224755/current/finalized/subdir0
进入后有三个文件
查找执行结果文件存放目录
find . -name '*1073742362*'
看到 文件存放在 subdir2下
vim blk_1073742362
看到 统计hello 和world 个数都为10w个
5 服务器运行本地单词计数程序
hadoop自带有单词统计程序,在 $HADOOP_HOME/share/hadoop/mapreduce目录下
cd $HADOOP_HOME/share/hadoop/mapreduce
ls
在这里插入图片描述
然后执行
hadoop jar hadoop-mapreduce-examples-2.6.5.jar wordcount /home/root/hello.txt /mr/wordcount/output
*ouput:是hdfs中不存在的目录,mr程序运行的结果会输出到该目录
执行结果
hdfs dfs -ls /mr/wordcount/output
结果存放在part-r-00000文件上
再通过如下命令查看结果
hdfs dfs -cat /mr/wordcount/output/part-r-00000
6 打包本地java代码到服务器执行
还可以将本地的java代码打包到服务器执行,只是需要将mainclass文件中设置本地运行代码注释掉
conf.set("mapreduce.framework.name","local");
打包页面如下
进入到打包目录找到包文件
D:\idea_workspace\hadoop\out\artifacts\mywc
上传代码到服务器上,
如果没有传参数运行
yarn jar mywc.jar com.wh.mr.wordcount.MainClass
可以看到这里运行结果按照java代码中进行退出。
yarn jar mywc.jar com.wh.mr.wordcount.MainClass /home/root/hello.txt /mr/wordcount/output2
运行结果