5.马士兵_云计算

1.yarn-site.xml须要复制到各个slave中去。须要全部的机器上是同步的,要么即便能启,也连接不上的。javascript

2.正常状况各个阶段都是能够自定义开发的,只不过split和shuffle有默认的实现,咱们主要仍是先开发map和reduce。java

3.map的输入K是序列号,V就是拆分后的一行内容。为了咱们传递运算序列化的便利性,hadoop本身实现了对应的包装类,如Long(LongWritable),Sting(Text)。node

package com;linux

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;c++

public class WordMapper extends Mapper<LongWritable, Text, KEYOUT, VALUEOUT>{
    
}
4.补充一句,mapreduce不用非得放linux上才能执行,mapreduce,yarn,hadoop他们相互独立,谁离了谁都能相互执行。apache

5.map/reduce程序能够在单机上写,可是运算会分布式运算,由于赶上大文件,一个机器合并不了了。fork join就是拆分运算后合并结果的。c#

6.运行获得输出结果。.隐藏文件,crc校验文件。这个执行的时候,由于是本地,因此控制台会出现本地工做的INFO:windows

2017-05-01 22:59:59,387 INFO  [LocalJobRunner Map Task Executor #0] mapred.LocalJobRunner (LocalJobRunner.java:run(224)) - Starting task: attempt_local1711731912_0001_m_000000_0app

输入:maven

java c
c c++
java c#
test hello
java js
javascript c
 

结果:shuffle是拍好序的统计结果。

c    3
c#    1
c++    1
hello    1
java    3
javascript    1
js    1
test    1
7.下面是一个map/reduce的测试程序:

package com;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class Test {

    public static void main(String[] args) throws Exception{
          Configuration conf = new Configuration();
          
            Job job = Job.getInstance(conf);
             
            job.setMapperClass(WordMapper.class);
            job.setReducerClass(WordReducer.class);
            
            //mapper
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(IntWritable.class);
            
            //若是mapper 和reducer用的key 和 value类型相同,上面就能够不用写了
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(LongWritable.class);
             
            //本地路径的好处是
//            FileInputFormat.setInputPaths(job, "F:/BaiduNetdiskDownload/bigdata_test/test.txt");
//            FileOutputFormat.setOutputPath(job, new Path("F:/BaiduNetdiskDownload/bigdata_test/out"));
            
            FileInputFormat.setInputPaths(job, "hdfs://192.168.56.100:9000/wcinput");//会计算全部目录的文件
            FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.56.100:9000/wcoutput1"));//固然也能够依然放在本地
             
            job.waitForCompletion(true);//输出控制台
    }

}
可是上面这种方式是吧数据拉到本地来运算,因此就不须要yarn来支持了,那怎么在集群中运行呢?

8.而后配置好下面一堆,理论就能够远程集群运行了。

  conf.set("fs.defaultFS", "hdfs://192.168.56.100:9000/");//配置好了前缀下面就不须要带路径前缀
          
//          conf.set("mapreduce.job.jar", "target/wc.jar");
          conf.set("mapreduce.framework.name", "yarn");
          conf.set("yarn.resourcemanager.hostname", "192.168.56.100");
          conf.set("mapreduce.app-submission.cross-platform", "true");//跨平台操做

9.但实际运行时,有权限异常的问题。那怎么处理呢?办法1:run java时配置参数默认访问的用户名为root骗过去。-DHADOOP_USER_NAME=root。办法2:设置hdfs的权限为777(不推荐)。

Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=set_free, access=EXECUTE, inode="/tmp/hadoop-yarn/staging/set_free/.staging/job_1493733905343_0001":root:supergroup:drwx------

10.能够问题依然来了,咱们顺利进入远程调用了,但出了下面的错。

Caused by: java.net.ConnectException: Call From DESKTOP-FHNQ7MS/192.168.56.1 to 0.0.0.0:10020 failed on connection exception: java.net.ConnectException: Connection refused: no further information; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused

;这个错误说的是咱们是在远程集群中运算了,能够你指定的WordMapper.class,WordReducer.class咱们集群中却没找到。由于只有咱们windows知道。怎么弄呢?原来咱们正常运行时是经过把java打包成jar文件,而后把jar文件传给ResourceManger,由RM分发给NM才能够。

11.简单的作法,conf.set("mapreduce.job.jar", "wc.jar");//相对路径,绝对路径均可,用这个配置来指定咱们要计算的jar文件。而后咱们就能够上传jar执行了。

12.总结:1.本地计算,能够调试。2.小规模数据拉到本地执行。3.大规模数据用jar发送给RM,RM给不一样的NM上面,在集群中运行了。

13.若是有第三方的依赖jar包,那么把jar包也一并上传上去。

14.如何用maven创建项目呢?

相关文章
相关标签/搜索