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創建項目呢?