Mapreduce初析
Mapreduce是一个计算框架,既然是做计算的框架,那么表现形式就是有个输入(input),mapreduce操作这个输入(input),通过本身定义好的计算模型,得到一个输出(output),这个输出就是我们所需要的结果。
我们要学习的就是这个计算模型的运行规则。在运行一个mapreduce计算任务时候,任务过程被分为两个阶段:map阶段和reduce阶 段,每个阶段都是用键值对(key/value)作为输入(input)和输出(output)。而程序员要做的就是定义好这两个阶段的函数:map函数 和reduce函数。
就以最基础的wordCount为例解释一下:
Map实现:默认文本行读取,将每个单词进行提取,并且计数为1
- public void map(LongWritable key, Text value, Context context)
- throws IOException, InterruptedException {
- String line = value.toString();
- StringTokenizer token = new StringTokenizer(line);
- while (token.hasMoreTokens()) {
- word.set(token.nextToken());
- context.write(word, one);
- }
- }
在Map --> Reduce过程中,如果不对框架进行sort和Group等进行额外的设置,框架会自动按照key值对value进行迭代,生成value值列表。
Reduce实现:对key,和相应的Iterable<>值进行相加,
- public void reduce(Text key, Iterable<IntWritable> values,
- Context context) throws IOException, InterruptedException {
- int sum = 0;
- for (IntWritable val : values) {
- sum += val.get();
- }
- context.write(key, new IntWritable(sum));
- }
程序驱动模式:
- Configuration conf = new Configuration();
- Job job = new Job(conf);
- job.setJarByClass(WordCount.class);
- job.setJobName("wordcount");
- job.setOutputKeyClass(Text.class);
- job.setOutputValueClass(IntWritable.class);
- job.setMapperClass(WordCountMap.class);
- job.setReducerClass(WordCountReduce.class);
- job.setInputFormatClass(TextInputFormat.class);
- job.setOutputFormatClass(TextOutputFormat.class);
- FileInputFormat.addInputPath(job, new Path(args[0]));
- FileOutputFormat.setOutputPath(job, new Path(args[1]));
- job.waitForCompletion(true);
- hadoop@ubuntu:~$ hadoop fs -cat wcoutput3/part-r-00000
- !! 2
- !ci.*.*.us 1
- !co.*.*.us 1
- !town.*.*.us 1
- "AS 22
- "Accept" 1
- "Accept-Language" 1
- "License"); 22
- "NOW" 1
- "WiFi" 1
- "Z" 1
- "all" 1
- "content" 1
- "delete 1
- "delimiter" 1
在Hadoop中常用的命令有如下几种:
hadoop fs -ls //列出文件
hadoop fs -put 文件名 文件在hdfs上地址
hadoop fs -get 文件名 //下载文件
hadoop fs -rm -r 文件目录 //删除某个目录
hadoop jar 文件.jar 执行的类名 //在集群上执行hadoop任务
yarn application -kill JobID号 //在集群上kill一个应用(别把别人提交的应用kill了)
yarn logs -applicationId app的ID号 //查看某个应用的日志
日志的查看也可以在你的hadoop安装目录下 logs中进行查看,里面有app的,有资源管理器、namenode、datanode、historyserver等。如果一个应用程序出现什么问题,都可以对日志文件进行查看来判断问题的所在。
Hadoop中MR程序的几种提交运行模式
1:在Windows的eclipse里面直接运行main方法,就会将job提交给本地执行器localjobrunner执行
----输入输出数据可以放在本地路径下(c:/wc/srcdata/)
----输入输出数据也可以放在hdfs中(hdfs://weekend110:9000/wc/srcdata)
2:在Linux的eclipse里面直接运行main方法,但是不要添加yarn相关的配置文件,也会提交给localjobrunner执行
----输入输出数据可以放在本地路径下(/home/Hadoop/wc/srcdata/)
----输入输出数据也可以放在hdfs中(hdfs://weekend110:9000/wc/srcdata)
集群模式运行
1:将工程打成jar包,上传到服务器,然后用 hadoop 命令提交 hadoop jar wc.jar cn.intsmaze.hadoop.mr.wordcount.WCRunner
程序编写好以后要打包成jar包放到 hadoop集群 上进行运行。这里打包的jar包名为wc.jar。
先把文件上传到linux目录,然后在该目录下使用指令将该jar分发到hadoop集群中并指定运行哪一个程序。
hadoop jar wc.jar cn.intsmaze.hadoop.mr.WCRunner(指定运行java类的完整路径)这个时候程序就执行了。
2:在linux的eclipse中直接运行main方法,也可以提交到集群中去运行,但是,必须采取以下措施:
----在工程src目录下加入 mapred-site.xml 和 yarn-site.xml (这两个文件在搭建hdfs时修改了的见hdfs文件夹下的搭建日志)
----将工程打成jar包(wc.jar),同时在main方法中添加一个conf的配置参数
Configuration conf = newConfiguration();
conf.set("mapreduce.job.jar","wc.jar");
JAR包的位置要在运行程序的工程里面。
3:在windows的eclipse中直接运行main方法,也可以提交给集群中运行,但是因为平台不兼容,需要做很多的设置修改(很麻烦忽略)
----要在windows中存放一份hadoop的安装包(解压好的)
----要将其中的lib和bin目录替换成根据你的windows版本重新编译出的文件
----再要配置系统环境变量 HADOOP_HOME 和 PATH
----修改YarnRunner这个类的源码