天天看點

eclipse遠端連接配接hadoop_1個檔案,3個類,mapreduce就是這麼簡單,動手搭建Hadoop(8)...準備編碼打包釋出注意配置

01 ssh免密安裝

02 jdk安裝

03 hadoop僞分布式安裝

04 hadoop全分布式

05 hadoop高可用

06 用hadoop的sdk進行開發

07 搭建yarn

上次在hdfs上面搭建了yarn對于不同用戶端的計算要求可以通過resource manager 和nodemanger協調在每個datenode節點上進行計算。理論的東西這裡不展開了,直接開始動手,大家可以也動手試試,真正能夠解決技術問題才能有提高對吧。如果條件有限的兄弟也可以看看,增加一些體驗的東西。遇到類似的問題也好有個思路。接下來我們在yarn的基礎上寫一個mapreduce的程式。

準備

這裡準備了一個txt文檔裡面有很多單詞,我們要計算這些單詞出現的次數。

eclipse遠端連接配接hadoop_1個檔案,3個類,mapreduce就是這麼簡單,動手搭建Hadoop(8)...準備編碼打包釋出注意配置

這個文檔内主要是“hello”,“world”組成,我們來統計這兩個單詞出現的次數。這裡我們提前把這個要處理的檔案生成并且上傳到對應的目錄上去。/user/root/hello.txt

這裡我們通過eclipse連接配接hdfs資料庫,并且上傳檔案。

編碼

這裡我們需要做mapreduce的操作。map 是對單詞做統計,每個單詞出現一次就标記一個1,reduce就是對map的結果進行分類計算,也就是做累加的操作。這裡我們建立了一個 叫做“com.test.hadoop.mr”的包,并且建立了三個java 類檔案。

MyWC檔案,主要負責生成mapreduce任務,并且制定輸入輸出檔案,并且關聯mapper和reducer類。

public class MyWC {

public static void main(String[] args) throws Exception{

Configuration conf = new Configuration(true);

Job job = Job.getInstance(conf);

job.setJarByClass(MyWC.class);

//mapreduce 任務名字

job.setJobName("myjob01");

//需要處理的檔案

Path input = new Path("/user/root/hello.txt");

FileInputFormat.addInputPath(job, input);

//處理以後的輸出檔案

Path output = new Path("/data/wc/output");

//為了實驗友善每次運作都删除之前輸出的檔案。

if (output.getFileSystem(conf).exists(output)){

output.getFileSystem(conf).delete(output,true);

}

//把任務和輸出的檔案做綁定

FileOutputFormat.setOutputPath(job, output);

//設定mapper 類

job.setMapperClass(MyMapper.class);

job.setMapOutputKeyClass(Text.class);

job.setMapOutputValueClass(IntWritable.class);

//設定reducer類

job.setReducerClass(MyReducer.class);

//執行任務

job.waitForCompletion(true);

}

}

mapper類

public class MyMapper extends Mapper {

private final static IntWritable one = new IntWritable(1);

private Text word = new Text();

public void map(Object key, Text value, Context context) throws IOException, InterruptedException {

StringTokenizer itr = new StringTokenizer(value.toString());

while (itr.hasMoreTokens()) {

word.set(itr.nextToken());

context.write(word, one);

}

}

}

reducer類

public class MyReducer extends Reducer {

private IntWritable result = new IntWritable();

public void reduce(Text key, Iterable values,

Context context) throws IOException, InterruptedException {

int sum = 0;

for (IntWritable val : values) {

sum += val.get();

}

result.set(sum);

context.write(key, result);

}

}

打包釋出

針對我們寫的jar包com.test.hadoop.mr 右鍵選擇export,然後選擇JAR file

eclipse遠端連接配接hadoop_1個檔案,3個類,mapreduce就是這麼簡單,動手搭建Hadoop(8)...準備編碼打包釋出注意配置

選擇一個路徑儲存起來

eclipse遠端連接配接hadoop_1個檔案,3個類,mapreduce就是這麼簡單,動手搭建Hadoop(8)...準備編碼打包釋出注意配置

然後把這個jar包上傳到hdfs的伺服器上面。我這裡用xftp上傳的,上傳的目錄是/opt/的。

eclipse遠端連接配接hadoop_1個檔案,3個類,mapreduce就是這麼簡單,動手搭建Hadoop(8)...準備編碼打包釋出注意配置

在節點node01上運作這mapreduce jar

hadoop jar mywc.jar com.test.hadoop.mr.MyWC
eclipse遠端連接配接hadoop_1個檔案,3個類,mapreduce就是這麼簡單,動手搭建Hadoop(8)...準備編碼打包釋出注意配置

操作完成以後可以去看處理以後的檔案

hdfs dfs -ls /data/wc/output
eclipse遠端連接配接hadoop_1個檔案,3個類,mapreduce就是這麼簡單,動手搭建Hadoop(8)...準備編碼打包釋出注意配置

同時我們通過elclipse的插件也可以看到hdfs上有一個mapreduce之後生成的檔案

eclipse遠端連接配接hadoop_1個檔案,3個類,mapreduce就是這麼簡單,動手搭建Hadoop(8)...準備編碼打包釋出注意配置

并且可以看到"hello"和"world"各自出現了多少次。

由于我這裡配置了node03和node04作為resourcemanager,這個時候node03作為主節點,是以可以通過背景看到這個運作的job

eclipse遠端連接配接hadoop_1個檔案,3個類,mapreduce就是這麼簡單,動手搭建Hadoop(8)...準備編碼打包釋出注意配置

注意配置

整個過程比較簡單,建議大家動手做一下。我這裡遇到兩個配置上的坑和大家分享一下。如果沒有遇到類似的問題可以直接跳過了。

mapreduce 需要配置運作的路徑這裡如果沒有配置運作程式會報錯

node01配置如下

vi /usr/hadoop-3.1.2/etc/hadoop/mapred-site.xml

yarn.app.mapreduce.am.env

HADOOP_MAPRED_HOME=/usr/hadoop-3.1.2

mapreduce.map.env

HADOOP_MAPRED_HOME=/usr/hadoop-3.1.2

mapreduce.reduce.env

HADOOP_MAPRED_HOME=/usr/hadoop-3.1.2

mapreduce.application.classpath

/usr/hadoop-3.1.2/share/hadoop/mapreduce/*, /usr/hadoop-3.1.2/share/hadoop/mapreduce/lib/*

配置完畢以後分發到node02,node03,node04上去。

針對yarn-site.xml檔案的配置,這裡我們使用node03和node04作為兩個resourcemanager,互為主備是以需要指定兩個伺服器的通訊端口,當接到mapreduce的請求之後,resourcemanager 會把他們分發到對應的datenode上面由nodemanager協助計算。是以這裡需要配置端口,以及classpath。

在node01運作

vi /usr/hadoop-3.1.2/etc/hadoop/yarn-site.xml

yarn.application.classpath

/usr/hadoop-3.1.2/etc/hadoop/, /usr/hadoop-3.1.2/share/hadoop/common/*, /usr/hadoop-3.1.2/share/hadoop/common/lib/*, /usr/hadoop-3.1.2/share/hadoop/hdfs/*, /usr/hadoop-3.1.2/share/hadoop/hdfs/lib/*, /usr/hadoop-3.1.2/share/hadoop/yarn/*, /usr/hadoop-3.1.2/share/hadoop/yarn/lib/*

yarn.resourcemanager.address.rm1

node03:8032

yarn.resourcemanager.scheduler.address.rm1

node03:8030

yarn.resourcemanager.webapp.address.rm1

node03:8088

yarn.resourcemanager.resource-tracker.address.rm1

node03:8031

yarn.resourcemanager.admin.address.rm1

node03:8033

yarn.resourcemanager.ha.admin.address.rm1

node03:23142

yarn.resourcemanager.address.rm2

node04:8032

yarn.resourcemanager.scheduler.address.rm2

node04:8030

yarn.resourcemanager.webapp.address.rm2

node04:8088

yarn.resourcemanager.resource-tracker.address.rm2

node04:8031

yarn.resourcemanager.admin.address.rm2

node04:8033

yarn.resourcemanager.ha.admin.address.rm2

node04:23142

完成配置以後将此檔案分發到node02,node03,node04三個伺服器上。

這裡的配置問題困擾了我很久,希望大家到這裡的時候能夠順利通過。

喜歡的點個關注,謝謝各位。

繼續閱讀