Linux上搭建Hadoop2.6.3集群以及WIN7通过Eclipse开发MapReduce的demo
Linux上搭建Hadoop2.6.3集群以及WIN7通過Eclipse開發MapReduce的demo
近期為了分析國內航空旅游業常見安全漏洞,想到了用大數據來分析,其實數據也不大,只是生產項目沒有使用Hadoop,因此這里實際使用一次。
先看一下通過hadoop分析后的結果吧,最終通過hadoop分析國內典型航空旅游業廠商的常見安全漏洞個數的比例效果如下:
第一次正式使用Hadoop,肯定會遇到非常多的問題,參考了很多網絡上的文章,我把自己從0搭建到使用的過程記錄下來,方便以后自己或其他人參考。
之前簡單用過storm,適合實時數據的處理。hadoop更偏向靜態數據的處理,網上很多hadoop的教程,但有的版本比較老:比如有的是屬于hadoop1.x時代,有的本機是ubuntu上安裝,有的介紹理論,有的直接介紹代碼demo。我的電腦是WIN7,打算在測試服務器linux?Red?Hat系列下搭建集群,然后通過本機win7開發并聯調MapReduce程序。由于內容比較多,這篇博文主要寫理論和Hadoop偽集群/集群安裝過程以及Eclipse的插件安裝,后面有時間再寫一篇Eclipse開發的DEMO以及如何通過hadoop分析的航空旅游業典型安全漏洞。
下面主要寫以下部分,理論知識描述可能會有誤,主要是方便以后自己或別人參考:
一、Hadoop版本介紹
二、Hadoop名詞理論介紹
三、SSH無密碼登陸Linux
四、Hadoop單機安裝
五、Hadoop單機模式運行
六、Hadoop偽分布式部署
七、Hadoop集群部署
八、Eclipse插件安裝
九、安裝調試過程中我遇到的問題
?
?
一、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/
?
二、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是各個鍵對應的數據集合。
?
三、SSH無密碼登陸Linux
Ssh連接linux服務器,除了用賬戶密碼連接,還提供通過公鑰私鑰配對登錄的方式,這里讓SSH無密碼登錄Linux,主要是為了方便Hadoop的Master直接連接各個Slave機器。因此創建SSH無密碼登錄Linux和Hadoop的功能沒有關系,創建方式可以參考:
| 1 2 3 4 5 6 7 | cd?~/.ssh/?#進入當前用戶主目錄下的.ssh文件夾下 rm?./id_rsa*??#先刪除已經存在的id_rsa開頭的公鑰文件,可能沒有 ssh-keygen -t rsa??#創建公鑰文件,有提示,全部按確定即可 cat?./id_rsa.pub >> ./authorized_keys?#把生成的id_rsa.pub公鑰文件內容追加到當前目錄下authorized_keys文件 |
創建公鑰文件完成,測試可以試試:
| 1 | ssh?Master?#Master為當前機器名,或ssh 當前ip。如果不需要輸入密碼,則說明成功 |
然后執行:
| 1 | 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機器上。比如會有顯示:
| 1 | id_rsa.pub??????????????????????????????????? 100%? 391???? 0.4KB/s???00:00 |
然后再Slave1上把Master機器的公鑰文件放到用戶主目錄的/.ssh/authorized_keys文件里,在Slave1上操作的命令如下:
| 1 2 3 4 5 | mkdir?~/.ssh?#如果不存在則先創建 cat?~/id_rsa.pub >> ~/.ssh/authorized_keys rm?~/id_rsa.pub????#復制完就可以刪掉了 |
?
現在在Master機器上測試,因為把Master上生成的公鑰文件放到Slave1機器hadoop用戶的制定位置,就可以免密碼登錄Slave1機器了。
| 1 2 3 4 5 6 7 8 9 | [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寫入特定目錄。
?
四、Hadoop單機安裝
單機模式我在一臺測試服務器172.26.5.187上做的測試,把187服務器的主機名修改為Master,并修改Hosts文件機器名和IP映射,需要用root去執行命令:
| 1 | vi?/etc/sysconfig/network |
修改:HOSTNAME=Master
| 1 2 3 | vi?/etc/hosts 172.26.5.187 Master |
?
然后在187服務器上創建一個hadoop用戶:
| 1 2 3 4 5 6 7 | 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目錄,執行命令:
| 1 2 3 | rm?-rf?/usr/local/hadoop????# 刪掉舊的(如果存在) tar?-zxf ~/hadoop-2.6.3.tar.gz -C?/usr/local |
把文件夾修改為hadoop,執行命令,修改文件夾所屬用戶和組:
| 1 | chown?-R hadoop:hadoop?/usr/local/hadoop |
然后用hadoop登錄后執行:
| 1 2 3 | cd?/usr/local/hadoop ./bin/hadoop?version |
輸出結果:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | [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 |
表示安裝成功
?
五、Hadoop單機模式運行
把hadoop-2.6.3.tar.gz解壓到187服務器:/usr/local/hadoop后,執行命令:
| 1 2 3 | mkdir?./input cp?./etc/hadoop/*.xml ./input |
直接測試自帶的jar包程序,從input文件夾下的文件分析含有dfs..正則的字符串,如果有就輸出到output文件夾:
| 1 | [hadoop@Master hadoop]$./bin/hadoop?jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.3.jar?grep?./input?./output?'dfs[a-z]+' |
發現會有報錯,大意是說權限不夠,執行命令:
| 1 | chmod?-R 744 ./bin/??#改變當前目錄讀寫權限 |
再次執行:
| 1 | ./bin/hadoop?jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.3.jar?grep?./input?./output?'dfs[a-z]+' |
執行后輸出一串......
| 1 2 3 4 5 6 7 8 9 | ????????File Input Format Counters ????????????????Bytes Read=123 ????????File Output Format Counters ????????????????Bytes Written=23 .......... |
說明執行成功,查看:
| 1 2 3 | [hadoop@p5 hadoop]$?cat?./output/* 1?????? dfsadmin |
這里的數據實際為part-r-00000的內容
| 1 2 3 | [hadoop@p5 hadoop]$?ls?output part-r-00000? _SUCCESS |
注意,Hadoop?默認不會覆蓋結果文件,因此再次運行上面實例會提示出錯,需要先將?./output?刪除。
| 1 | rm?-r ./output |
單機模式運行成功。
?
六、Hadoop偽分布式部署
首先進入到/usr/local/hadoop下:
| 1 2 3 | [hadoop@Master hadoop]$?pwd /usr/local/hadoop |
修改core-site.xml和hdfs-site.xml配置文件,執行:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | 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?的格式化(只執行一次即可,以后不需要執行了):
| 1 | ./bin/hdfs?namenode -format |
成功的話,會看到?“successfully?formatted”?和?“Exiting?with?status?0″?的提示,若為?“Exiting?with?status?1″?則是出錯。
開啟?NaneNode?和?DataNode?守護進程:
| 1 | [hadoop@Master hadoop]$ ./sbin/start-dfs.sh |
可能會報錯:
bash:?./sbin/start-dfs.sh:?權限不夠
執行命令,添加執行權限:
| 1 | chmod?-R 744 ./sbin |
再執行./sbin/start-dfs.sh可能還會報錯:
localhost:?Error:?JAVA_HOME?is?not?set?and?could?not?be?found.
執行下面命令解決:
| 1 | [hadoop@Master hadoop]$?vi?./etc/hadoop/hadoop-env.sh |
新增:
| 1 | export?JAVA_HOME=/usr/java/jdk1.6.0_38 |
這里設置Jdk的路徑
再次執行:
| 1 2 3 4 5 | [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進程情況:
| 1 2 3 4 5 6 7 8 9 | [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文件夾:
| 1 2 3 4 5 | ./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目錄里, |
通過下面指令查看復制過去的文件夾:
| 1 | ./bin/hdfs?dfs -ls?input |
執行剛才單機版的測試jar包程序:
| 1 | ./bin/hadoop?jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar?grep?input output?'dfs[a-z.]+' |
執行后輸出一串..
| 1 2 3 4 5 6 7 | File Input Format Counters ????????Bytes Read=219 File Output Format Counters ????????Bytes Written=77 |
查看HDFS里output文件夾:
| 1 2 3 4 5 6 7 8 9 | ./bin/hdfs?dfs -cat?output/* 1?????? dfsadmin 1?????? dfs.replication 1?????? dfs.namenode.name.dir 1?????? dfs.datanode.data.dir |
截圖是之前沒有修改hostname,所以機器名還是p5。
?
發現已找到多個字符串,可以把HDFS里的文件取回到output文件夾:
| 1 2 3 4 5 | rm?-r ./output????# 先刪除本地的 output 文件夾(如果存在) ./bin/hdfs?dfs -get output ./output?????# 將 HDFS 上的 output 文件夾拷貝到本機 cat?./output/*??#查看當前用戶目錄下的output文件夾下內容 |
這里偽分布式程序就運行完成了。
?
上述通過?./sbin/start-dfs.sh?啟動?Hadoop,僅僅是啟動了?MapReduce?環境,我們可以啟動?YARN?,讓?YARN?來負責資源管理與任務調度。
修改文件:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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> |
執行命令:
| 1 2 3 | ./sbin/start-yarn.sh??????# 啟動YARN ./sbin/mr-jobhistory-daemon.sh start historyserver??# 開啟歷史服務器,才能在Web中查看任務運行情況 |
Jps查看:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [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?的腳本如下:
| 1 2 3 | ./sbin/stop-yarn.sh ./sbin/mr-jobhistory-daemon.sh stop historyserver |
?
七、Hadoop集群部署
使用172.26.5.187?做Master和172.26.5.20?做Slave?測試
先187上操作:
| 1 | [hadoop@Master ~]$?su?root |
密碼:
| 1 2 3 4 5 | [root@p5 hadoop]# vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=p5 |
修改:HOSTNAME=Master
再修改hosts文件
| 1 2 3 4 5 | [root@p5 hadoop]# vi /etc/hosts 172.26.5.187 Master 172.26.5.20 Slave1 |
?
然后在20服務器上操作:
| 1 2 3 4 5 6 7 | useradd?-m hadoop -s?/bin/bash?創建hadoop用戶,-m創建主目錄 -s?/bin/bash?指定用戶的登錄Shell passwd?hadoop mima... usermod?-g root hadoop |
然后root權限下:
| 1 2 3 4 5 | [root@Slave1 ~]# vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=p2 |
修改:HOSTNAME=Slave1
| 1 2 3 4 5 | [root@Slave1 ~]# vi /etc/hosts 172.26.5.20 Slave1 172.26.5.187 Master |
?
測試:
| 1 2 3 | ping?Master -c 3 ping?Slave1 -c 3 |
187和20都能ping通說明配置沒有問題了。
?
187?Master上操作(單機模式下已操作過):
| 1 2 3 4 5 6 7 | cd?~/.ssh rm?./id_rsa* ssh-keygen -t rsa???????# 一直按回車就可以 cat?./id_rsa.pub >> ./authorized_keys |
完成后可執行?ssh?Master?驗證一下(可能需要輸入?yes,成功后執行?exit?返回原來的終端)。接著在?Master?節點將上公匙傳輸到?Slave1?節點:
| 1 | scp?~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/ |
輸入完成后會提示傳輸完畢,如下圖所示:
| 1 | id_rsa.pub??????????????????????????????????? 100%? 391???? 0.4KB/s???00:00 |
?
接著在?Slave1??172.26.5.20節點上,將?ssh?公匙加入授權:
| 1 2 3 4 5 | mkdir?~/.ssh???????# 如果不存在該文件夾需先創建,若已存在則忽略 cat?~/id_rsa.pub >> ~/.ssh/authorized_keys rm?~/id_rsa.pub????# 用完就可以刪掉了 |
?
172.26.5.187上測試無密碼連接20服務器:
| 1 2 3 4 5 6 7 8 9 | [hadoop@Master .ssh]$?ssh?Slave1 [hadoop@Slave1 ~]$?exit??#exit回到187服務器 logout Connection to Slave1 closed. [hadoop@Master .ssh]$ |
?
187上執行:
| 1 2 3 | [hadoop@Master .ssh]$?vi?~/.bashrc export?PATH=$PATH:/usr/local/hadoop/bin:usr/local/hadoop/sbin |
修改187配置文件:
| 1 2 3 | [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目錄,修改配置文件:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | 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服務器。
| 1 2 3 4 5 6 7 | 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服務器上操作:
| 1 2 3 4 5 | rm?-rf?/usr/local/hadoop????# 刪掉舊的(如果存在) tar?-zxf ~/hadoop.master.tar.gz -C?/usr/local chown?-R hadoop:hadoop?/usr/local/hadoop |
?
然后在187上start啟動:
| 1 2 3 4 5 | [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服務器的防火墻,否則會導致端口訪問不通,莫名其妙的錯誤:
| 1 2 3 | [hadoop@Master?local]$ service iptables stop [hadoop@Slave1?local]$ service iptables stop |
?
再次187上start啟動后,然后在187上查詢如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | [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上查看:
| 1 2 3 4 5 6 7 8 9 10 11 | [hadoop@Master hadoop]$ jps 10499 ResourceManager 10801 Jps 10770 JobHistoryServer 10365 SecondaryNameNode 10188 NameNode |
?
20上查看:
| 1 2 3 4 5 6 7 | [hadoop@Slave1 ~]$ jps 4977 NodeManager 5133 Jps 4873 DataNode |
表示啟動成功了。
?
下面在集群上執行剛才測試過的自帶demo程序:
187服務器執行:(如果再次執行,需要先刪除:./bin/hdfs?dfs?-rm?-r?output????#?刪除?output?文件夾)
| 1 2 3 4 5 6 7 | 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上執行:
| 1 2 3 4 5 6 7 | [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.]+' |
?
集群測試成功!
?
八、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用程序執行程序,可能會報如下錯:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ..................................... 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即可.或者另一種方法:
放開/user/hadoop目錄的權限,命令如下:$ hadoop fs -chmod 777 /user/hadoop
?
?
windows下運行環境配置 (如果不生效,則需要重啟機器)?需要hadoop.dll,winutils.exe?
我是直接拷貝F:\hadoop\hadoop-common-2.2.0-bin-master\bin目錄下內容覆蓋F:\hadoop\hadoop-2.5.2\bin?
運行project
在eclipse中點擊WordCount.java,右鍵,點擊Run As—>Run Configurations,配置運行參數,即輸入和輸出文件夾?
hdfs://ubuntu-V01:9000/user/hadoop/input hdfs://ubuntu-V01:9000/user/hadoop/output?
如下圖所示:?
注意:如果output目錄已經存在,則刪掉或換個名字,如output01,output02 。。。?
?
九、安裝調試過程中我遇到的問題
問題在上面每個步驟都寫了,這里再匯總一下:
1、每次執行MapReduce程序需要刪除輸出目錄,比如:
需要先刪除:./bin/hdfs?dfs?-rm?-r?output????#?刪除?output?文件夾
?
2、報錯:java.net.NoRouteToHostException:?No?route?to?host
解決:可能是防火墻沒有關閉,導致網絡訪問連接問題。需要關閉集群所有服務器防火墻:service?iptables?stop(注意這里是直接關閉防火墻,生成環境最好針對端口開放特定訪問權限)
?
3、執行./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
?
4、./sbin/start-dfs.sh執行后,如果“NameNode”、”DataNode”?、“SecondaryNameNode”進程沒有啟動成功,則查看對應/usr/local/hadoop/logs/目錄下的日志。
?
5、/etc/hadoop/core-site.xml文件里fs.defaultFS如果配置為hdfs://localhost:9000等,有可能導致9000端口其他服務器不能telnet,導致莫名其妙的問題。
解決:通過在187上執行:netstat?-ntl,查看到比如如下:
| 1 | tcp??????? 0????? 0 127.0.0.1:9000????????????? 0.0.0.0:*?????????????????? LISTEN?? |
說明9000端口被127.0.0.1監聽,導致只能本機能連接9000端口,其他服務器不能連接,如果是:
| 1 | tcp??????? 0????? 0 0.0.0.0:9000????????????? 0.0.0.0:*?????????????????? LISTEN |
則表示任何機器都可以連接9000端口。
?
6、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?
轉載于:https://www.cnblogs.com/snowbook/p/5633950.html
總結
以上是生活随笔為你收集整理的Linux上搭建Hadoop2.6.3集群以及WIN7通过Eclipse开发MapReduce的demo的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle10G rac 10.2.0
- 下一篇: i春秋30强挑战赛pwn解题过程