01 ssh免密安裝
02 jdk安裝
03 hadoop僞分布式安裝
04 hadoop全分布式
05 hadoop高可用
06 用hadoop的sdk進行開發
07 搭建yarn
上次在hdfs上面搭建了yarn對于不同用戶端的計算要求可以通過resource manager 和nodemanger協調在每個datenode節點上進行計算。理論的東西這裡不展開了,直接開始動手,大家可以也動手試試,真正能夠解決技術問題才能有提高對吧。如果條件有限的兄弟也可以看看,增加一些體驗的東西。遇到類似的問題也好有個思路。接下來我們在yarn的基礎上寫一個mapreduce的程式。
準備
這裡準備了一個txt文檔裡面有很多單詞,我們要計算這些單詞出現的次數。
這個文檔内主要是“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
選擇一個路徑儲存起來
然後把這個jar包上傳到hdfs的伺服器上面。我這裡用xftp上傳的,上傳的目錄是/opt/的。
在節點node01上運作這mapreduce jar
hadoop jar mywc.jar com.test.hadoop.mr.MyWC
操作完成以後可以去看處理以後的檔案
hdfs dfs -ls /data/wc/output
同時我們通過elclipse的插件也可以看到hdfs上有一個mapreduce之後生成的檔案
并且可以看到"hello"和"world"各自出現了多少次。
由于我這裡配置了node03和node04作為resourcemanager,這個時候node03作為主節點,是以可以通過背景看到這個運作的job
注意配置
整個過程比較簡單,建議大家動手做一下。我這裡遇到兩個配置上的坑和大家分享一下。如果沒有遇到類似的問題可以直接跳過了。
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三個伺服器上。
這裡的配置問題困擾了我很久,希望大家到這裡的時候能夠順利通過。
喜歡的點個關注,謝謝各位。