Ubuntu 16.04 Hadoop-2.7.3全分布模式 + eclipse hadoop
Ps1:主要答疑區在本帖最下方,疑點會標注出來。個人在配置過程中遇到的困難都會此列舉。
Ps2:本帖也是我自己原創的,最近從CSDN搬家過來。原帖地址
實驗介紹:
本次實驗主要介紹了Hadoop平臺的兩個核心工具,HDFS和Mapreduce,結合這兩個核心在Linux下搭建基于YARN集群的全分布模式的Hadoop架構。
實驗案例,基于Hadoop平臺下的Wordcount分詞統計的試驗
實驗需求:
1、PC機,局域網服務,Linux系統
背景介紹:
Hadoop實現了一個分布式文件系統,簡稱HDFS。HDFS有高容錯性的特點,并且設計用來部署在普PC機上,而且它提供高吞吐量來訪問應用程序的數據,適合那些有著超大數據集的應用程序。HDFS放寬了POSIX的要求,可以以流的形式訪問文件系統中的數據。 Hadoop的框架最核心的設計就是:HDFS和MapReduce。HDFS為海量的數據提供了存儲,則MapReduce為海量的數據提供了計算。開發者在熟練掌握了hadoop的使用后輕松地在Hadoop上開發和運行處理海量數據的應用程序NameNode
NameNode 是一個通常在 HDFS 實例中的單獨機器上運行的軟件。它負責管理文件系統名稱空間和控制外部客戶機的訪問。NameNode 決定是否將文件映射到 DataNode 上的復制塊上。對于最常見的 3 個復制塊,第一個復制塊存儲在同一機架的不同節點上,最后一個復制塊存儲在不同機架的某個節點上。實際的 I/O事務并沒有經過 NameNode,只有表示 DataNode 和塊的文件映射的元數據經過 NameNode。當外部客戶機發送請求要求創建文件時,NameNode 會以塊標識和該塊的第一個副本的 DataNode IP 地址作為響應,這個 NameNode 還會通知其他將要接收該塊的副本的 DataNode。 NameNode 在一個稱為 FsImage 的文件中存儲所有關于文件系統名稱空間的信息。這個文件和一個包含所有事務的記錄文件(這里是 EditLog)將存儲在 NameNode 的本地文件系統上。FsImage 和 EditLog 文件也需要復制副本,以防文件損壞或 NameNode 系統丟失。NameNode本身不可避免地具有SPOF單點失效的風險,主備模式并不能解決這個問題,通過Hadoop Non-stop namenode才能實現100% uptime可用時間。DataNode
DataNode 也是一個通常在 HDFS實例中的單獨機器上運行的軟件。Hadoop 集群包含一個 NameNode 和大量 DataNode。DataNode 通常以機架的形式組織,機架通過一個交換機將所有系統連接起來。Hadoop 的一個假設是:機架內部節點之間的傳輸速度快于機架間節點的傳輸速度。 DataNode 響應來自 HDFS 客戶機的讀寫請求。它們還響應來自 NameNode 的創建、刪除和復制塊的命令。NameNode 依賴來自每個 DataNode 的定期心跳(heartbeat)消息。每條消息都包含一個塊報告,NameNode 可以根據這個報告驗證塊映射和其他文件系統元數據。如果 DataNode 不能發送心跳消息,NameNode 將采取修復措施,重新復制在該節點上丟失的塊。
實驗步驟及結果:
1.搭建平臺(全分布式hadoop + eclipse Neon.1 + JDK1.8)
集群搭建:
主機兩臺(可拓展):
(1)兩個主機系統均為Ubuntu 16.04 LTS
詳情:
master 192.168.:103.26(虛擬機)
slave2 192.168.103.22(物理機)
注:
(1)slave1是在同學的筆記本上,因為他的筆記本總是飄忽不定,所以這次博客上就先不寫他的ip地址
(2)master是虛擬機的理由就是第一次嘗試怕配錯環境,導致崩潰,所以用了VMware為master,方便拯救平臺
(2)hadoop平臺版本都為最新穩定版2.7.3(解壓及安裝hadoop)
下載地址:Hadoop官網 hadoop.apache.org/releases.ht…
步驟1:點開網頁以后,點擊紅色箭頭所指的鏈接
步驟2:點開后如下圖
步驟3:選擇一個鏈接下載(個人推薦最后一個 tsinghua.edu.cn 清華大學鏈接源比較好)
步驟4:下載完后打開文件管理器,選擇Downloads文件夾(如果修改主要文件夾名字為中文的,應選擇“下載”)
步驟5:解壓到指定路徑
步驟5.1:在當前文件夾下右鍵 - 在終端打開 鍵入su root命令
步驟5.2:輸入root用戶密碼后,如下圖所示
步驟5.3:鍵入解壓命令
sudo tar zxvf hadoop-2.7.3.tar.gz -C /usr/local/hadoop 復制代碼(注意:如果提示hadoop文件夾不存在的,可以在root用戶下用cd命令到 /usr/local路徑下 鍵入 sudo mkdir /hadoop 創建夾)
步驟5.4:解壓后如下圖所示
(注意:路徑滿足如圖所示即可,或自行定義)
至此hadoop前期下載準備工作已經完成。接下準備java環境的配置
(3)JDK版本為java8-oracle(配置java環境)
(環境:系統穩定聯網狀態下)
步驟1:打開終端鍵入命令(root用戶模式可以不用加sudo前綴)
sudo add-apt-repository ppa:webupd8team/java復制代碼步驟2:出現一段文字后按回車繼續
步驟3:繼續鍵入命令
sudo apt-get update復制代碼步驟4:待系統加載完所有下載源
步驟5:鍵入安裝命令
sudo apt-get install oracle-java8-installer復制代碼步驟6:等待下載結束(過程稍微有點漫長)
這個版本的java默認安裝在 /usr/lib/jvm文件夾下
安裝結束后配置環境變量
終端輸入:
sudo gedit /etc/profile復制代碼步驟7:配置完后,按 ctrl + s 保存
步驟8:在終端中輸入
sudo source /etc/profile復制代碼使配置的環境變量生效
步驟9:和在Windows下配置一樣,在終端測試java和javac命令是否生效,在linux下可以多測試下jps命令看java進程號
至此java環境變量配置完畢
(4)SSH免密配置
SSH 是目前較可靠,專為遠程登錄會話和其他網絡服務提供安全性的協議。利用 SSH 協議可以有效防止遠程管理過程中的信息泄露問題。SSH最初是UNIX系統上的一個程序,后來又迅速擴展到其他操作平臺。
SSH在正確使用時可彌補網絡中的漏洞。SSH客戶端適用于多種平臺。
Ubuntu Linux下配置免密登錄主要依靠 ssh localhost的命令
!!注意,如果改過 /etc/hosts 下的內容需要重新配置(下圖是我的例子)
由于后期為了避免hadoop的一些端口和IP錯誤,所以我把localhost的名字改了,順帶把 /etc/hostname 的名字也改了。
改了上述的 hosts 和 hostname的名字后,記得重啟電腦或者虛擬機
192.168.91.45是我虛擬的IP的地址 名字叫master 相當于 沒有改變配置文件之前的 127.0.0.1 localhost
所以配置ssh免密的時候是鍵入 ssh master 而不是 ssh localhost
話不多說!
步驟0:SSH需要安裝OpenSSH-server(如果已經安裝則無需理會)
sudo apt-get install openssh-server復制代碼步驟1:在非root用戶模式下打開終端鍵入ssh localhost(或者是定義的用戶名)
步驟2:提示輸入密碼,輸入你的ssh密碼(自己記得住就好)
步驟3:輸入完以后,測試一下ssh localhost(或是自定義名字),輸入密碼后是否如下圖彈出一些信息
步驟4:如果下午所示后,則創建ssh成功
步驟5:創建免密登錄(不需要關閉終端),鍵入如下命令
ssh-keygen -t rsa復制代碼
步驟6:一直按回車直至出現RSA窗口即可
步驟7:鍵入命令
sudo cp .ssh/id_rsa.pub .ssh/authorized_keys復制代碼步驟8:驗證免密登錄,輸入ssh localhost(或者自定義的名字),是否還需要輸入密碼登錄
root用戶下:
步驟1:進入root用戶模式(用戶模式下在終端鍵盤入:su root,輸入root密碼即可)
步驟2:進入ssh配置文件
gedit /etc/ssh/sshd_config復制代碼
步驟3:把PermitRootLogin的字段改成 yes(原來的好像是Prohibit xxxx的),有點忘記了。總之改成yes就可以了
步驟4:保存退出終端
步驟5:打開新的終端鍵入命令
sudo service ssh restart復制代碼重啟ssh服務之后,打開終端
步驟6:進入root用戶模式下,鍵入 ssh localhost(或是你的自定義名字)
步驟7:輸入自定義ssh密碼后,與用戶模式下的類似
步驟8:鍵入 ssh-keygen -t rsa 創建RSA密鑰
步驟9:一直回車直至出現RSA密鑰圖,(如果提示Overwrite 輸入 y 即可)
步驟10:鍵入配置免密的命令
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys復制代碼步驟11:完成后,在root用戶模式輸入 ssh localhost(或自定義名字)后,如下圖所示即可。
至此,root用戶和普通用戶模式的ssh免密配置完成。
(4.1)SSH免密配置(節點篇)
需求:如果每個節點都需要下載安裝hadoop ,則大量耗費人力物力。
解決:所以需要一個SSH來遠程發送hadoop包分發給每個節點。
接下來來講解master打通每個節點的連接方式(單節點和多節點一樣,只要配置好就可以進行連接)
步驟1:在hosts文件中配置好各子節點的ip地址以及名稱(如下圖)
步驟2: 編輯好hosts文件保存并關閉,(root用戶模式下)打開終端輸入
ssh-copy-id -i ~/.ssh/id_rsa.pub root@slave* (星號代表子節點號碼,或者把slave*換成自定義的名稱)復制代碼步驟3:提示輸入,子節點的登錄密碼,輸入完成后,等待命令完成
步驟4:在終端中輸入 ssh slave*(或者自定義名字),如下圖:
步驟5:ssh打通master和子節點的通道,可以通過scp命令傳輸數據了。
至此,完成對于子節點的ssh免密訪問配置。
(5)hadoop平臺版本都為最新穩定版2.7.3(解壓及安裝hadoop)
hadoop配置下主要注意配置文件路徑的問題
主要包括:hadoop根目錄下 /etc/hadoop 里面的xml配置文件
例:hadoop-env.sh , hdfs-site.xml, mapred-site.xml , core-site.xml , yarn-site.xml
注:mapred-site.xml需要復制出來到本路徑,原本是mapred-site.xml.template 需要用 cp 命令復制并改名字
或者可以通過 gedit 命令創建一個新的mapred-site.xml,把模板內的內容復制過去,然后再進行配置
配置文件1:hadoop-env.sh(配置環境變量,讓hadoop識別)
配置文件2:core-site.xml
<configuration><property><name>fs.default.name</name><value>hdfs://master:8020</value></property><property><name>io.file.buffer.size</name><value>131072</value></property><property><name>hadoop.tmp.dir</name><value>/home/hadoop/tmp</value></property><property><name>hadoop.proxyuser.hadoop.hosts</name><value>*</value></property><property><name>hadoop.proxyuser.hadoop.group</name><value>*</value></property><property><name>dfs.permissions</name><value>false</value></property> </configuration>復制代碼
配置文件3:hdfs-site.xml
<configuration><property><name>dfs.namenode.secondary.http-address</name><value>master:9000</value></property><property><name>dfs.namenode.name.dir</name><value>file:/home/hadoop/dfs/name</value></property><property><name>dfs.datanode.data.dir</name><value>file:/home/hadoop/dfs/data</value></property><property><name>dfs.replication</name><value>3</value></property><property><name>dfs.webhdfs.enabled</name><value>true</value></property> </configuration>復制代碼
配置文件4: mapred-site.xml
<configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property><property><name>mapred.job.tracker</name><value>master:9001</value></property><property><name>mapred.job.tracker.http.address</name><value>master:50030</value></property><property><name>mapreduce.jobhistory.address</name><value>master:10020</value></property><property><name>mapreduce.jobhistory.webapp.address</name><value>master:19888</value></property> </configuration>復制代碼
配置文件5:yarn-site.xml
<configuration><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><property><name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name><value>org.apache.hadoop.mapred.ShuffleHandler</value></property><property><name>yarn.resourcemanager.address</name><value>master:8032</value></property><property><name>yarn.resourcemanager.scheduler.address</name><value>master:8030</value></property><property><name>yarn.resourcemanager.resource-tracker.address</name><value>master:8031</value></property><property><name>yarn.resourcemanager.admin.address</name><value>master:8033</value></property><property><name>yarn.resourcemanager.webapp.address</name><value>master:8088</value></property> </configuration>復制代碼
!!!注:如果是master節點(即服務器)需要添加多一個slaves文件指定slave
配置文件6:slaves(選)
slave2 192.168.90.33復制代碼
最后步驟:以上配置文件配置完畢后打開終端窗口,輸入
hadoop namenode -format復制代碼出現如下結果,沒有JAVA報錯即可
初始化hadoop namenode節點成功!
打開終端利用 cd 命令進入hadoop啟動命令文件下
cd /usr/local/hadoop/hadoop-2.7.3/sbin復制代碼
鍵入如下命令啟動hadoop(root用戶模式下)
./start-all.sh復制代碼關閉hadoop則鍵入命令關閉
./stop-all.sh復制代碼
輸入jps在master節點測試,如果如上圖所示則測試成功
在ssh slave2 節點輸入jps測試
通過hadoop 自帶命令
hadoop dfsadmin -report復制代碼
如上圖所示輸出Live Datanodes,說明有存活節點,死節點為空。
證明集群配置成功!
(6)集群安裝hadoop(完成Master節點的hadoop安裝以及SSH的搭建)
構建好master與各個slave之間的ssh通信,如下圖所示
步驟1:測試ssh命令與各節點間的通信
步驟2:確認本機的hadoop安裝地址
步驟3:
scp –r /usr/local/hadoop/ root@slaver2:/usr/local/hadoop 復制代碼把master上的hadoop分發給slave2節點(其他節點依次類推,只要搭好ssh就可以傳輸)。
傳輸過程有點久,耐心等候。
步驟4:在slave節點上配置環境變量
HADOOP_HOME=/usr/local/Hadoop PATH=$PATH:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin復制代碼步驟5:在master啟動hadoop進行測試
Namenode界面 50070端口
hadoop管理界面 8088端口
hadoop SecondaryNamenode 管理界面 端口9000
(7)hadoop Wordcount測試(完成eclipse和eclipse hadoop插件安裝)
步驟0:安裝eclipse和eclipse hadoop插件
步驟0.1:安裝eclipse
下載后,解壓到自定義路徑,解壓后如所示
在此給出eclipse hadoop插件下載(pan.baidu.com/s/1mi6UP5I)
下載后,把jar放到eclipse根目錄的dropins的目錄
在根目錄進入終端,進入root用戶模式,輸入
./eclipse復制代碼進入eclipse界面,完成安裝。
步驟1:啟動hadoop完成上述集群測試
步驟2:通過終端把測試數據 test.txt上傳到hdfs中 (test.txt為hadoop跟目錄下的NOTICE.txt)
步驟2.1:在hdfs目錄下創建input文件夾
hadoop fs -mkdir /input hadoop fs -put test.txt /input復制代碼如圖所示,則上傳成功。
如果權限不對的話可以修改權限
hadoop fs -chmod -R 777 /input/test.txt復制代碼
步驟3:打開eclipse,并完成mapreduce的wordcount代碼,完成eclipse hadoop的配置
步驟4:確保左上角的DFS Location能夠顯示hdfs中的文件目錄
WordCount代碼:
package org.apache.hadoop.examples;import java.io.IOException; import java.util.StringTokenizer;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class WordCount {public static class TokenizerMapperextends Mapper<Object, Text, Text, IntWritable>{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);}}}public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {private IntWritable result = new IntWritable();public void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {int sum = 0;for (IntWritable val : values) {sum += val.get();}result.set(sum);context.write(key, result);}}public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = Job.getInstance(conf, "word count");job.setJarByClass(WordCount.class);job.setMapperClass(TokenizerMapper.class);job.setCombinerClass(IntSumReducer.class);job.setReducerClass(IntSumReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.addInputPath(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));System.exit(job.waitForCompletion(true) ? 0 : 1);} }復制代碼
log4j日志文件:
log4j.rootLogger=debug, stdout, R #log4j.rootLogger=stdout, R log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout #log4j.appender.stdout.layout.ConversionPattern=%5p - %m%n log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=log4j.log log4j.appender.R.MaxFileSize=100KB log4j.appender.R.MaxBackupIndex=1 log4j.appender.R.layout=org.apache.log4j.PatternLayout #log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n log4j.appender.R.layout.ConversionPattern=%d %p [%c] - %m%n #log4j.logger.com.codefutures=DEBUG復制代碼
步驟5:配置Run Configuration
步驟6:右鍵Run As - Run On Hadoop(日志我選用了DEBUG模式測試,所以會很長,但是方便測試)
此時,master hdfs多出一個文件夾存放分詞結果
下列圖為結果部分截圖:
至此,從安裝到mapreduce Wordcount測試全部結束了。
hadoop2.7.6全模式下,結合eclipse hadoop插件配置,完成Wordcount測試。
實驗結果分析:
1、Wordcount項目代碼是結合Map-reduce的核心思想,以及對于Java輸入輸出流的認識所編寫,也參考了一下"大牛"博客編寫的,能夠基本實現分詞-詞頻統計。
2、小項目的分詞的效果顯然沒有Python Jieba分詞來的精確,但是基于Hadoop Mapreduce的運算,分詞一篇詞匯眾多的文檔只需要5秒。(如需查看請點開。文檔來源:Hadoop LICENSE.txt)
測試文檔
心得體會:
1、實驗完成結果到達預期目標,在搭建平臺的過程耗費了很多學習成本,主要花在安裝包的下載以及對于Linux系統的理解和hadoop配置文件的理解。
2、實驗完成的過程中與小組成員分工合作,在搭建過程中自學了linux的命令操作以及linux系統的一些工作原理。
3、在搭建hadoop平臺時,遇到很多匪夷所思的問題,通過hadoop平臺自帶的log文件,查看日志文件,百度搜索或者看國外網站的配置方式,再通過自己的嘗試,解決問題。
4、在搭建過程體會最深的就是hadoop對于端口的使用很謹慎,第一次在嘗試的時候沒有仔細看清楚官網文檔的端口設置,配置出錯,導致進度耽誤幾天,最后才發現是端口的問題。
5、在搭建完后對于linux系統也有深刻的體會,對于linux的權限設置,SSH,以及基本的文件操作命令等有基本的掌握經驗。
6、小組成員在第一次沖刺后決定更改軟件工程項目,主要是為了適應目前的學習任務以及工作任務。小組成員目前在分析 學校歷年學生體質測試數據 以及 網絡招聘崗位數據對應學校各二級學院的專業核心技能
Python Django項目屬于python后端項目,初期小組成員定題是為了學習除java后端以外的另外一直后端開發。但是后期因為繁重的分析任務以及報告,所以決定開始尋找新的出路,也順利在第三次沖刺前幾天完成實驗。
雖然可能與軟件工程的項目關系不太大,但是在搭建平臺的過程,小組成員也深刻體會到團隊合作的意義。以及對于大數據平臺的理解,不再是覺得深不可測,改變對于大數據平臺以及云計算的看法。
展望:
1、希望在接下來的寒假或者未來的時間點,完善自己的hadoop平臺,通過hadoop平臺提交小組的數據分析項目,利用Mapreduce并行化算法以及YARN集群分布式計算,提高數據分析的效率。
2、以及寫一個基于hadoop平臺的分布式爬蟲,提高大數據的讀取時間。
3、目前也在學習Spark,掌握與Mapreduce相類似的并行化運算框架,也希望在日后的使用中,結合HBase,Mapreduce/Spark搭建一個云計算平臺項目。
4、在未來的時間,花更多時間從理解hadoop的核心架構,到理解hadoop的外沿,學習Spark,HBase,Pig,Mahout,Hive等核心工具的使用。
5、最近時間關注大數據方向注意到關聯數據RDF的應用,也希望能嘗試利用Sqoop讀取關聯數據,進行數據分析。
總結
以上是生活随笔為你收集整理的Ubuntu 16.04 Hadoop-2.7.3全分布模式 + eclipse hadoop的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入谈一谈iOS模块独立运行
- 下一篇: ubuntu下修改网卡名称