Linux上搭建Hadoop2.6.3集群以及WIN7通過Eclipse開發MapReduce的demo

来源:http://www.cnblogs.com/Lawson/archive/2016/01/21/5149537.html
-Advertisement-
Play Games

近期為了分析國內航空旅游業常見安全漏洞,想到了用大數據來分析,其實數據也不大,只是生產項目沒有使用Hadoop,因此這裡實際使用一次。先看一下通過hadoop分析後的結果吧,最終通過hadoop分析國內典型航空旅游業廠商的常見安全漏洞個數的比例效果如下:第一次正式使用Hadoop,肯定會遇到非常多的...


近期為了分析國內航空旅游業常見安全漏洞,想到了用大數據來分析,其實數據也不大,只是生產項目沒有使用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的功能沒有關係,創建方式可以參考:

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寫入特定目錄。

 

四、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

  

表示安裝成功

 

五、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

  

單機模式運行成功。

 

六、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

   

七、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.]+'

     

集群測試成功!

 

八、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即可。

 

 

九、安裝調試過程中我遇到的問題

問題在上面每個步驟都寫了,這裡再彙總一下:

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,查看到比如如下:

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埠。

 

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 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.第一篇 概述
  • 常見的資料庫連接問題無外乎是在資料庫伺服器本地可以連接SQL Server,但通過其他伺服器就不可以連接。但這次我卻碰到了相反的情況,在伺服器本地無法通過IP/實例名連接,但從其他伺服器卻可以。而且每次重啟後問題短暫消失,不多久後,又重現。我還是第一次碰到這樣的問題。通過深究後找到了根本原因:竟然....
  • 1.常用的分散式文件系統有NFS
  • 一測試伺服器資料庫(Oracle Database 10g Release 10.2.0.5.0 - 64bit Production)突然訪問不了,檢查發現資料庫處於掛起模式(hang mode),檢查告警日誌,發現有“ksvcreate: Process(m000) creation faile...
  • CouchDB是眾多稱作NoSQL解決方案中的一員。與眾不同的是,CouchDB是一個面向文檔的資料庫,在它裡面所有文檔域(Field)都是以鍵值對的形式存儲的。域(Field)可以是一個簡單的鍵值對、列表或者是map。
  • 1. 簡介說明 我們知道oracle中sqlplus裡面執行dml語句;是需要提交commit;若錯了;也可以回滾rollback; 然而在postgresql裡面預設是自動提交;執行完就馬上提交了,不能回滾,這樣容易導致誤操作的發生,有沒有什麼辦法避免這個風險呢?當然有,在psql中預設是...
  • SQL Server代理是所有實時資料庫的核心。代理有很多不明顯的用法,因此系統的知識,對於開發人員還是DBA都是有用的。這系列文章會通俗介紹它的很多用法。SQL Server代理作業有一系列的一個或多個作業步驟組成。一個作業步驟會分配給特定的作業子系統,用來標識將要進行的作業步驟工作種類。每個作業...
  • 1、use_concat網上說法:CONCATENATION和UNION/UNION ALL操作比較類似,根據OR查詢條件,將一個查詢分解為兩個或更多的部分,然後在去掉兩個部分重覆的記錄。由於CONCATENATION執行計劃需要去掉重覆的記錄,因此和UNION ALL不同。和UNION也不同的是,...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...