近期爲了分析國內航空旅遊業常見安全漏洞,想到了用大數據來分析,其實數據也不大,只是生產項目沒有使用Hadoop,所以這裏實際使用一次。java
先看一下經過hadoop分析後的結果吧,最終經過hadoop分析國內典型航空旅遊業廠商的常見安全漏洞個數的比例效果以下:node
第一次正式使用Hadoop,確定會遇到很是多的問題,參考了不少網絡上的文章,我把本身從0搭建到使用的過程記錄下來,方便之後本身或其餘人蔘考。linux
以前簡單用過storm,適合實時數據的處理。hadoop更偏向靜態數據的處理,網上不少hadoop的教程,但有的版本比較老:好比有的是屬於hadoop1.x時代,有的本機是ubuntu上安裝,有的介紹理論,有的直接介紹代碼demo。個人電腦是WIN7,打算在測試服務器linux Red Hat系列下搭建集羣,而後經過本機win7開發並聯調MapReduce程序。因爲內容比較多,這篇博文主要寫理論和Hadoop僞集羣/集羣安裝過程以及Eclipse的插件安裝,後面有時間再寫一篇Eclipse開發的DEMO以及如何經過hadoop分析的航空旅遊業典型安全漏洞。git
下面主要寫如下部分,理論知識描述可能會有誤,主要是方便之後本身或別人參考:github
1、Hadoop版本介紹web
2、Hadoop名詞理論介紹redis
3、SSH無密碼登錄Linuxapache
4、Hadoop單機安裝ubuntu
5、Hadoop單機模式運行數組
6、Hadoop僞分佈式部署
7、Hadoop集羣部署
8、Eclipse插件安裝
9、安裝調試過程當中我遇到的問題
1、Hadoop版本介紹
Hadoop有1.x和2.x兩個版本,參考別人官方一點的說法:Hadoop 1.x由一個分佈式文件系統HDFS和一個離線計算框架MapReduce組成,HDFS由一個NameNode和多個DataNode組成,MapReduce由一個JobTracker和多個TaskTracker組成;而Hadoop 2.x則包含一個支持NameNode橫向擴展的HDFS,一個資源管理系統YARN和一個運行在YARN上的離線計算框架MapReduce,YARN它將JobTracker中的資源管理和做業控制功能分開,分別由組件ResourceManager和ApplicationMaster實現,其中,ResourceManager負責全部應用程序的資源分配,而ApplicationMaster僅負責管理一個應用程序。
他們的架構作了較大調整,內部細節感興趣能夠去研究,但對開發人員最直觀看到的就是配置文件的參數名稱不同了,具體能夠參考:
http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/
2、Hadoop名詞理論介紹
系統角色:ResourceManager ,ApplicationMaster , NodeManager
應用名稱:Job
組建接口:Mapper , Reducer
HDFS:Namenode ,Datanode
Hadop1.x時代系統角色有JobTracker和TaskTracker的概念,Hadoop2.X時代用Yarn替換了這兩個角色。TaskTracker 是 Map-reduce 集羣中每臺機器都有的一個部分,他作的事情主要是監視本身所在機器的資源狀況。TaskTracker 同時監視當前機器的 tasks 運行情況。TaskTracker 須要把這些信息經過 heartbeat 發送給 JobTracker,JobTracker 會蒐集這些信息以給新提交的 job 分配運行在哪些機器上。
ResourceManager 是一箇中心的服務,它作的事情是調度、啓動每個 Job 所屬的 ApplicationMaster、另外監控 ApplicationMaster 的存在狀況
NodeManager 功能比較專注,就是負責 Container 狀態的維護,並向 ResourceManager 保持心跳。
ApplicationMaster 負責一個 Job 生命週期內的全部工做,相似老的框架中 JobTracker。但注意每個 Job(不是每一種)都有一個 ApplicationMaster,它能夠運行在 ResourceManager 之外的機器上。
NameNode能夠看做是分佈式文件系統中的管理者,主要負責管理文件系統的命名空間、集羣配置信息和存儲塊的複製等。NameNode會將文件系統的Meta-data存儲在內存中,這些信息主要包括了文件信息、每個文件對應的文件塊的信息和每個文件塊在DataNode的信息等。
Datanode是文件系統的工做節點,他們根據客戶端或者是namenode的調度存儲和檢索數據,而且按期向namenode發送他們所存儲的塊(block)的列表。
hadoop系統中,master/slaves的通常對應關係是:
master---NameNode;ResourceManager ;
slaves---Datanode;NodeManager
在MapReduce中,一個準備提交執行的應用程序稱爲「做業(job)」,而從一個做業劃分出的運行於各個計算節點的工做單元稱爲「任務(task)」。
Mapper任務運行時,它把輸入文件切分紅行並把每一行提供給可執行文件進程的標準輸入傳到map函數。 同時,mapper收集可執行文件進程標準輸出的內容,並把收到的每一行內容轉化成key/value對,做爲mapper的輸出。 其中key的值爲距離文件第0個字符的距離,value爲該行的值。
Reducer類中reduce函數接受Map函數組裝的key/value,其中key爲Map輸出的鍵,values是各個鍵對應的數據集合。
3、SSH無密碼登錄Linux
Ssh鏈接linux服務器,除了用帳戶密碼鏈接,還提供經過公鑰私鑰配對登陸的方式,這裏讓SSH無密碼登陸Linux,主要是爲了方便Hadoop的Master直接鏈接各個Slave機器。所以建立SSH無密碼登陸Linux和Hadoop的功能沒有關係,建立方式能夠參考:
cd ~/.ssh/ #進入當前用戶主目錄下的.ssh文件夾下 rm ./id_rsa* #先刪除已經存在的id_rsa開頭的公鑰文件,可能沒有 ssh-keygen -t rsa #建立公鑰文件,有提示,所有按肯定便可 cat ./id_rsa.pub >> ./authorized_keys #把生成的id_rsa.pub公鑰文件內容追加到當前目錄下authorized_keys文件
建立公鑰文件完成,測試能夠試試:
ssh Master #Master爲當前機器名,或ssh 當前ip。若是不須要輸入密碼,則說明成功
而後執行:
scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/ #這條指令執行有前提,須要有一臺Slave1的機器,而且當前機器Hosts對Slave1機器作了IP 機器貓映射,而且Slave1機器有一個用戶名hadoop,而且用戶的文件目錄是/home/hadoop/。這條指令意思是把當前機器所屬用戶主目錄下.ssh文件夾下的id_rsa.put公鑰文件複製到遠程機器Slave1的/home/hadoop目錄下,而且訪問遠程機器的用戶名是hadoop。
輸入該指令後會要求輸入Slave1機器hadoop用戶的密碼,輸入成功後則會把id_rsa.pub文件傳遞到Slave1機器上。好比會有顯示:
id_rsa.pub 100% 391 0.4KB/s 00:00
而後再Slave1上把Master機器的公鑰文件放到用戶主目錄的/.ssh/authorized_keys文件裏,在Slave1上操做的命令以下:
mkdir ~/.ssh #若是不存在則先建立 cat ~/id_rsa.pub >> ~/.ssh/authorized_keys rm ~/id_rsa.pub #複製完就能夠刪掉了
如今在Master機器上測試,由於把Master上生成的公鑰文件放到Slave1機器hadoop用戶的制定位置,就能夠免密碼登陸Slave1機器了。
[hadoop@Master .ssh]$ ssh Slave1 [hadoop@Slave1 ~]$ exit #顯示不用密碼已經進入了Slave1機器,exit回到Master機器 logout Connection to Slave1 closed. [hadoop@Master .ssh]$ #顯示回到了Master機器
SSH無密碼登錄Linux就完成了。
前段時間Redis未受權訪問(就是無密碼)致使能夠遠程鏈接Redis後修改Redis持久文件,並寫入公鑰文件到特定目錄,致使能夠遠程無密碼鏈接到ssh,就是能夠經過這樣配置公鑰,並經過redis寫入特定目錄。
4、Hadoop單機安裝
單機模式我在一臺測試服務器172.26.5.187上作的測試,把187服務器的主機名修改成Master,並修改Hosts文件機器名和IP映射,須要用root去執行命令:
vi /etc/sysconfig/network
修改:HOSTNAME=Master
vi /etc/hosts 172.26.5.187 Master
而後在187服務器上建立一個hadoop用戶:
useradd -m hadoop -s /bin/bash 建立hadoop用戶,-m建立主目錄 -s /bin/bash 指定用戶的登陸Shell passwd hadoop mima.. #修改設置hadoop密碼 usermod -g root hadoop #加入root組
經過http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.6.3/hadoop-2.6.3.tar.gz 鏡像地址下載2.6.3版本。
把hadoop安裝到/usr/local/hadoop下,把hadoop-2.6.3.tar.gz放到/usr/local目錄,執行命令:
rm -rf /usr/local/hadoop # 刪掉舊的(若是存在) tar -zxf ~/hadoop-2.6.3.tar.gz -C /usr/local
把文件夾修改成hadoop,執行命令,修改文件夾所屬用戶和組:
chown -R hadoop:hadoop /usr/local/hadoop
而後用hadoop登陸後執行:
cd /usr/local/hadoop ./bin/hadoop version
輸出結果:
[hadoop@Master hadoop]$ ./bin/hadoop version Hadoop 2.6.3 Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r cc865b490b9a6260e9611a5b8633cab885b3d247 Compiled by jenkins on 2015-12-18T01:19Z Compiled with protoc 2.5.0 From source with checksum 722f77f825e326e13a86ff62b34ada This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-2.6.3.jar
表示安裝成功
5、Hadoop單機模式運行
把hadoop-2.6.3.tar.gz解壓到187服務器:/usr/local/hadoop後,執行命令:
mkdir ./input cp ./etc/hadoop/*.xml ./input
直接測試自帶的jar包程序,從input文件夾下的文件分析含有dfs..正則的字符串,若是有就輸出到output文件夾:
[hadoop@Master hadoop]$./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.3.jar grep ./input ./output 'dfs[a-z]+'
發現會有報錯,大意是說權限不夠,執行命令:
chmod -R 744 ./bin/ #改變當前目錄讀寫權限
再次執行:
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.3.jar grep ./input ./output 'dfs[a-z]+'
執行後輸出一串......
File Input Format Counters Bytes Read=123 File Output Format Counters Bytes Written=23 ..........
說明執行成功,查看:
[hadoop@p5 hadoop]$ cat ./output/* 1 dfsadmin
這裏的數據實際爲part-r-00000的內容
[hadoop@p5 hadoop]$ ls output part-r-00000 _SUCCESS
注意,Hadoop 默認不會覆蓋結果文件,所以再次運行上面實例會提示出錯,須要先將 ./output 刪除。
rm -r ./output
單機模式運行成功。
6、Hadoop僞分佈式部署
首先進入到/usr/local/hadoop下:
[hadoop@Master hadoop]$ pwd /usr/local/hadoop
修改core-site.xml和hdfs-site.xml配置文件,執行:
vi ./etc/hadoop/core-site.xml <configuration> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://172.26.5.187:9000</value> </property> </configuration> vi ./etc/hadoop/hdfs-site.xml <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/data</value> </property> </configuration>
配置完成後,執行 NameNode 的格式化(只執行一次便可,之後不須要執行了):
./bin/hdfs namenode -format
成功的話,會看到 「successfully formatted」 和 「Exiting with status 0″ 的提示,若爲 「Exiting with status 1″ 則是出錯。
開啓 NaneNode 和 DataNode 守護進程:
[hadoop@Master hadoop]$ ./sbin/start-dfs.sh
可能會報錯:
bash: ./sbin/start-dfs.sh: 權限不夠
執行命令,添加執行權限:
chmod -R 744 ./sbin
再執行./sbin/start-dfs.sh可能還會報錯:
localhost: Error: JAVA_HOME is not set and could not be found.
執行下面命令解決:
[hadoop@Master hadoop]$ vi ./etc/hadoop/hadoop-env.sh
新增:
export JAVA_HOME=/usr/java/jdk1.6.0_38
這裏設置Jdk的路徑
再次執行:
[hadoop@p5 hadoop]$ ./sbin/start-dfs.sh 16/01/06 16:05:50 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Starting namenodes on [localhost]
能夠忽略,並不會影響正常使用。
Jps查看當前java進程狀況:
[hadoop@p5 hadoop]$ jps 25978 Jps 25713 DataNode 25876 SecondaryNameNode 25589 NameNode
若是缺乏任何一個進程,都表示啓動失敗,須要./sbin/stop-dfs.sh中止後,檢查/usr/local/hadoop/logs/hadoop-hadoop-XXX-Master.log對應XXX名稱的日誌
瀏覽器輸入:http://172.26.5.187:50070/ 可訪問了
下面在僞分佈式下運行一個自帶的demo實例:
首先建立HTFS用戶目錄和input文件夾:
./bin/hdfs dfs -mkdir -p /user/hadoop ./bin/hdfs dfs -mkdir input ./bin/hdfs dfs -put ./etc/hadoop/*.xml input #複製當前目錄下/etc/hadoop/下的全部xml文件到HTFS的input目錄裏,
經過下面指令查看複製過去的文件夾:
./bin/hdfs dfs -ls input
執行剛纔單機版的測試jar包程序:
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
執行後輸出一串..
File Input Format Counters Bytes Read=219 File Output Format Counters Bytes Written=77
查看HDFS裏output文件夾:
./bin/hdfs dfs -cat output/* 1 dfsadmin 1 dfs.replication 1 dfs.namenode.name.dir 1 dfs.datanode.data.dir
截圖是以前沒有修改hostname,因此機器名仍是p5。
發現已找到多個字符串,能夠把HDFS裏的文件取回到output文件夾:
rm -r ./output # 先刪除本地的 output 文件夾(若是存在) ./bin/hdfs dfs -get output ./output # 將 HDFS 上的 output 文件夾拷貝到本機 cat ./output/* #查看當前用戶目錄下的output文件夾下內容
這裏僞分佈式程序就運行完成了。
上述經過 ./sbin/start-dfs.sh 啓動 Hadoop,僅僅是啓動了 MapReduce 環境,咱們能夠啓動 YARN ,讓 YARN 來負責資源管理與任務調度。
修改文件:
mv ./etc/hadoop/mapred-site.xml.template ./etc/hadoop/mapred-site.xml [hadoop@p5 hadoop]$ vi ./etc/hadoop/mapred-site.xml <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> [hadoop@p5 hadoop]$ vi ./etc/hadoop/yarn-site.xml <configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
執行命令:
./sbin/start-yarn.sh # 啓動YARN ./sbin/mr-jobhistory-daemon.sh start historyserver # 開啓歷史服務器,才能在Web中查看任務運行狀況
Jps查看:
[hadoop@Master hadoop]$ jps 27492 Jps 27459 JobHistoryServer 25713 DataNode 27013 ResourceManager 27283 NodeManager 25876 SecondaryNameNode 25589 NameNode
啓動成功後能夠在 http://172.26.5.187:8088/cluster 下查看任務運行狀況了。
若是不想啓動 YARN,務必把配置文件 mapred-site.xml 重命名,改爲 mapred-site.xml.template
關閉 YARN 的腳本以下:
./sbin/stop-yarn.sh ./sbin/mr-jobhistory-daemon.sh stop historyserver
7、Hadoop集羣部署
使用172.26.5.187 作Master和172.26.5.20 作Slave 測試
先187上操做:
[hadoop@Master ~]$ su root
密碼:
[root@p5 hadoop]# vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=p5
修改:HOSTNAME=Master
再修改hosts文件
[root@p5 hadoop]# vi /etc/hosts 172.26.5.187 Master 172.26.5.20 Slave1
而後在20服務器上操做:
useradd -m hadoop -s /bin/bash 建立hadoop用戶,-m建立主目錄 -s /bin/bash 指定用戶的登陸Shell passwd hadoop mima... usermod -g root hadoop
而後root權限下:
[root@Slave1 ~]# vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=p2
修改:HOSTNAME=Slave1
[root@Slave1 ~]# vi /etc/hosts 172.26.5.20 Slave1 172.26.5.187 Master
測試:
ping Master -c 3 ping Slave1 -c 3
187和20都能ping通說明配置沒有問題了。
187 Master上操做(單機模式下已操做過):
cd ~/.ssh rm ./id_rsa* ssh-keygen -t rsa # 一直按回車就能夠 cat ./id_rsa.pub >> ./authorized_keys
完成後可執行 ssh Master 驗證一下(可能須要輸入 yes,成功後執行 exit 返回原來的終端)。接着在 Master 節點將上公匙傳輸到 Slave1 節點:
scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/
輸入完成後會提示傳輸完畢,以下圖所示:
id_rsa.pub 100% 391 0.4KB/s 00:00
接着在 Slave1 172.26.5.20節點上,將 ssh 公匙加入受權:
mkdir ~/.ssh # 若是不存在該文件夾需先建立,若已存在則忽略 cat ~/id_rsa.pub >> ~/.ssh/authorized_keys rm ~/id_rsa.pub # 用完就能夠刪掉了
172.26.5.187上測試無密碼鏈接20服務器:
[hadoop@Master .ssh]$ ssh Slave1 [hadoop@Slave1 ~]$ exit #exit回到187服務器 logout Connection to Slave1 closed. [hadoop@Master .ssh]$
187上執行:
[hadoop@Master .ssh]$ vi ~/.bashrc export PATH=$PATH:/usr/local/hadoop/bin:usr/local/hadoop/sbin
修改187配置文件:
[hadoop@Master .ssh]$ cd /usr/local/hadoop/etc/hadoop [hadoop@Master hadoop]$ vi slaves
刪除localhost,新增一行:Slave1
文件 slaves,將做爲 DataNode 的主機名寫入該文件,每行一個。
187上cd到 /usr/local/hadoop/etc/hadoop目錄,修改配置文件:
vi core-site.xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://Master:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> </configuration> vi hdfs-site.xml <configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>Master:50090</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/data</value> </property> </configuration> vi mapred-site.xml <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</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> vi yarn-site.xml <configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>Master</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration> cd /usr/local rm -rf ./hadoop/tmp # 刪除 Hadoop 臨時文件 rm -rf ./hadoop/logs/* # 刪除日誌文件
而後把187上修改了配置文件後的hadoop文件夾壓縮後發送到Slave機器上,這裏上傳到20服務器。
tar -zcf ~/hadoop.master.tar.gz ./hadoop # 先壓縮到用戶主目錄下 cd ~ [hadoop@Master ~]$ scp ./hadoop.master.tar.gz Slave1:/home/hadoop #再複製到Salve1 hadoop.master.tar.gz 100% 187MB 11.0MB/s 00:17
複製完成後,到Slave1 20服務器上操做:
rm -rf /usr/local/hadoop # 刪掉舊的(若是存在) tar -zxf ~/hadoop.master.tar.gz -C /usr/local chown -R hadoop:hadoop /usr/local/hadoop
而後在187上start啓動:
[hadoop@Master hadoop]$ ./sbin/start-dfs.sh ./sbin/start-yarn.sh # 啓動YARN ./sbin/mr-jobhistory-daemon.sh start historyserver # 開啓歷史服務器,才能在Web中查看任務運行狀況
執行後可能會報錯:
namenode進程啓動不了,報錯:Storage directory /usr/local/hadoop/tmp/dfs/name does not exist,須要從新格式化namenode。
在187上執行:hdfs namenode -format
而後須要關閉187和20服務器的防火牆,不然會致使端口訪問不通,莫名其妙的錯誤:
[hadoop@Master local]$ service iptables stop [hadoop@Slave1 local]$ service iptables stop
再次187上start啓動後,而後在187上查詢以下:
[hadoop@Master hadoop]$ hdfs dfsadmin -report 16/01/21 17:55:44 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Configured Capacity: 52844687360 (49.22 GB) Present Capacity: 44751773696 (41.68 GB) DFS Remaining: 44741738496 (41.67 GB) DFS Used: 10035200 (9.57 MB) DFS Used%: 0.02% Under replicated blocks: 7 Blocks with corrupt replicas: 0 Missing blocks: 0 ------------------------------------------------- Live datanodes (1): Name: 172.26.5.20:50010 (Slave1) Hostname: Slave1 Decommission Status : Normal Configured Capacity: 52844687360 (49.22 GB) DFS Used: 10035200 (9.57 MB) Non DFS Used: 8092913664 (7.54 GB) DFS Remaining: 44741738496 (41.67 GB) DFS Used%: 0.02% DFS Remaining%: 84.67% Configured Cache Capacity: 0 (0 B) Cache Used: 0 (0 B) Cache Remaining: 0 (0 B) Cache Used%: 100.00% Cache Remaining%: 0.00% Xceivers: 1 Last contact: Thu Jan 21 17:55:44 CST 2016
若是顯示Live datanodes (1)表示有 1 個 Datanodes,表示啓動成功。
在這個過程當中,可能還會出現問題:
好比20服務器上DataNode和NodeManager進程啓動成功後自動死亡,查看日誌報錯:
Caused by: java.net.UnknownHostException: p2: p2...
說明多是機器名沒有修改爲功,推出shh,從新鏈接後修改/etc/sysconfig/network裏的HOSTNAME值便可。
最後啓動服務在187上查看:
[hadoop@Master hadoop]$ jps 10499 ResourceManager 10801 Jps 10770 JobHistoryServer 10365 SecondaryNameNode 10188 NameNode
20上查看:
[hadoop@Slave1 ~]$ jps 4977 NodeManager 5133 Jps 4873 DataNode
表示啓動成功了。
下面在集羣上執行剛纔測試過的自帶demo程序:
187服務器執行:(若是再次執行,須要先刪除:./bin/hdfs dfs -rm -r output # 刪除 output 文件夾)
hdfs dfs -mkdir -p /user/hadoop hdfs dfs -mkdir input hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input [hadoop@Master hadoop]$ hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
可能會報錯:java.net.NoRouteToHostException: No route to host
這時須要確保187和20服務器防火牆是否關閉,root權限下查看防火牆:
service iptables status
須要保證用root帳戶關閉防火牆:service iptables stop
在187上執行:
[hadoop@Master hadoop]$ ./bin/hdfs dfs -put ./etc/hadoop/*.xml input [hadoop@Master hadoop]$ ./bin/hdfs dfs -rm -r output [hadoop@Master hadoop]$ ./bin/hdfs dfs -ls input [hadoop@Master hadoop]$ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
集羣測試成功!
8、Eclipse插件安裝
要在 Eclipse 上編譯和運行 MapReduce 程序,須要安裝 hadoop-eclipse-plugin,https://github.com/winghc/hadoop2x-eclipse-plugin這裏有源代碼和release目錄下打好包的hadoop-eclipse-plugin-2.6.0.jar等3個版本的jar包。我是經過其餘渠道下載的hadoop-eclipse-plugin-2.6.3.jar版本的插件,安裝到MyEclipse裏。
在MyEclipse裏window->Preferences->Hadoop Map/Reduce,Hadoop installation directory選擇到win7本地的Hadoop文件夾,好比我吧Hadoop解壓後放到:D:\hadoop-2.6.3裏。
Window->Show View->Other選擇Map/Reduce,在面板中單擊右鍵,選擇 New Hadoop Location,在General選項裏,由於以前fs.defaultFS的值設置爲hdfs://172.26.5.187:9000,因此DFS Master 的 Port 寫爲9000,Location Name隨便寫,好比我寫成187Hadoop,Map/Reduce(V2) Master的Host寫172.26.5.187。最後點擊Finish則完成配置。
配置完成後Project Explorer 中有DFS Location。雙擊下面的187Hadoop則可查看187集羣下的HDFS文件了。
但經過WIN7鏈接遠程linux的Hadoop集羣會報錯,好比後面Myeclipse用程序執行程序,可能會報以下錯:
..................................... INFO client.RMProxy: Connecting to ResourceManager at Master/172.26.5.187:8032 INFO mapreduce.JobSubmitter: Cleaning up the staging area /tmp/hadoop-yarn/staging/SL/.staging/job_1452581976741_0001 Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=SL, access=EXECUTE, inode="/tmp":hadoop:supergroup:drwxrwx--- at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkFsPermission(FSPermissionChecker.java:271) ...................... Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=SL, access=EXECUTE, inode="/tmp":hadoop:supergroup:drwxrwx--- at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkFsPermission(FSPermissionChecker.java:271) ..........................
經過查看,user=SL,SL是我當前WIN7登陸的用戶名,網上介紹有幾種解決方案,我用了最簡單的解決方案,配置WIN7系統環境變量:HADOOP_USER_NAME=hadoop便可。
9、安裝調試過程當中我遇到的問題
問題在上面每一個步驟都寫了,這裏再彙總一下:
一、每次執行MapReduce程序須要刪除輸出目錄,好比:
須要先刪除:./bin/hdfs dfs -rm -r output # 刪除 output 文件夾
二、報錯:java.net.NoRouteToHostException: No route to host
解決:多是防火牆沒有關閉,致使網絡訪問鏈接問題。須要關閉集羣全部服務器防火牆:service iptables stop(注意這裏是直接關閉防火牆,生成環境最好針對端口開放特定訪問權限)
三、執行./sbin/start-dfs.sh報錯:localhost: Error: JAVA_HOME is not set and could not be found.
解決:i ./etc/hadoop/hadoop-env.sh,新增:
export JAVA_HOME=/usr/java/jdk1.6.0_38
四、./sbin/start-dfs.sh執行後,若是「NameNode」、」DataNode」 、「SecondaryNameNode」進程沒有啓動成功,則查看對應/usr/local/hadoop/logs/目錄下的日誌。
五、/etc/hadoop/core-site.xml文件裏fs.defaultFS若是配置爲hdfs://localhost:9000等,有可能致使9000端口其餘服務器不能telnet,致使莫名其妙的問題。
解決:經過在187上執行:netstat -ntl,查看到好比以下:
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
說明9000端口被127.0.0.1監聽,致使只能本機能鏈接9000端口,其餘服務器不能鏈接,若是是:
tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN
則表示任何機器均可以鏈接9000端口。
六、Myeclipse鏈接DFS Locations下的Hadoop集羣報錯:An internal error occurred during: "Map/Reduce location status updater".
187上cd到/usr/local/hadoop下執行:./bin/hdfs dfs -mkdir -p /user/root/input
./bin/hdfs dfs -mkdir -p /user/root/output,這裏還多是插件包問題或系統環境變量HADOOP_USER_NAME沒有設置爲Master機器鏈接的用戶名。
如需轉載,請註明來自:http://lawson.cnblogs.com