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

相關文章
相關標籤/搜索