Centos7搭建zookeeper集群

来源:https://www.cnblogs.com/lyjing/archive/2018/02/02/8406821.html
-Advertisement-
Play Games

centos7與之前的版本都不一樣,修改主機名在/ect/hostname 和/ect/hosts 這兩個文件控制 首先修改/ect/hostname vi /ect/hostname 打開之後的內容是: localhost.localdomain 把它修改成你想要的名字就可以,比如: niukou ...


centos7與之前的版本都不一樣,修改主機名在/ect/hostname 和/ect/hosts 這兩個文件控制

首先修改/ect/hostname

vi /ect/hostname

打開之後的內容是:

localhost.localdomain

把它修改成你想要的名字就可以,比如: niukou.com

保存退出

然後修改/ect/hosts文件

vi /ect/hosts

打開之後的內容是:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

然後你在裡面加一行:

IP   niukou.com

保存退出,然後重啟機器,這時候你就可以通過hostname來訪問這台機器的服務了

 

 

 

CentOS 下SSH無密碼登錄的配置

 

最近學習Hadoop。它要求各節點之間通過SSH無密碼登錄,配置SSH的時候費了一番功夫,記錄下來,以備忘。

配置SSH無密碼登錄需要3步:

    1.生成公鑰和私鑰

    2.導入公鑰到認證文件,更改許可權

    3.測試

 

1.生成公鑰和私鑰

  

 

Shell代碼  
  1. ssh-keygen -t rsa

  
   預設在 ~/.ssh目錄生成兩個文件:
    id_rsa      :私鑰
    id_rsa.pub  :公鑰

2.導入公鑰到認證文件,更改許可權

    2.1 導入本機

Shell代碼  
  1. cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys  


 

    2.2 導入要免密碼登錄的伺服器

        首先將公鑰複製到伺服器

Shell代碼  
  1. scp ~/.ssh/id_rsa.pub xxx@host:/home/xxx/id_rsa.pub  


        然後,將公鑰導入到認證文件,這一步的操作在伺服器上進行

Shell代碼  
  1. cat ~/id_rsa.pub >> ~/.ssh/authorized_keys 


 

    2.3 在伺服器上更改許可權

      

Shell代碼  
  1. chmod 700 ~/.ssh
  2. chmod 600 ~/.ssh/authorized_keys  

   

3.測試

    ssh host,第一次登錄可能需要yes確認,之後就可以直接登錄了。

 

 

1、集群部署介紹

1.1 Hadoop簡介

Hadoop是Apache軟體基金會旗下的一個開源分散式計算平臺。以Hadoop分散式文件系統HDFS(Hadoop Distributed Filesystem)和MapReduce(Google MapReduce的開源實現)為核心的Hadoop為用戶提供了系統底層細節透明的分散式基礎架構。

對於Hadoop的集群來講,可以分成兩大類角色:Master和Salve。一個HDFS集群是由一個NameNode和若幹個DataNode組成的。其中NameNode作為主伺服器,管理文件系統的命名空間和客戶端對文件系統的訪問操作;集群中的DataNode管理存儲的數據。MapReduce框架是由一個單獨運行在主節點上的JobTracker和運行在每個從節點的TaskTracker共同組成的。主節點負責調度構成一個作業的所有任 務,這些任務分佈在不同的從節點上。主節點監控它們的執行情況,並且重新執行之前的失敗任務;從節點僅負責由主節點指派的任務。當一個Job被提交時,JobTracker接收到提交作業和配置信息之後,就會將配置信息等分發給從節點,同時調度任務並監控TaskTracker的執行。

從上面的介紹可以看出,HDFS和MapReduce共同組成了Hadoop分散式系統體繫結構的核心。HDFS在集群上實現分散式文件系統,MapReduce在集群上實現了分散式計算和任務處理。HDFS在MapReduce任務處理過程中提供了文件操作和存儲等支持,MapReduce在HDFS的基礎上實現了任務的分發、跟蹤、執行等工作,並收集結果,二者相互作用,完成了Hadoop分散式集群的主要任務。

1.2 環境說明

我的環境是在虛擬機中配置的,Hadoop集群中包括4個節點:1個Master,2個Salve,節點之間區域網連接,可以相互ping通,節點IP地址分佈如下:

 

虛擬機系統

機器名稱

IP地址

Ubuntu 13.04

Master.Hadoop

192.168.1.141

Ubuntu 9.11

Salve1.Hadoop

192.168.1.142

Fedora 17

Salve2.Hadoop

192.168.1.137

 

Master機器主要配置NameNode和JobTracker的角色,負責總管分散式數據和分解任務的執行;3個Salve機器配置DataNode 和TaskTracker的角色,負責分散式數據存儲以及任務的執行。其實應該還應該有1個Master機器,用來作為備用,以防止Master伺服器宕機,還有一個備用馬上啟用。後續經驗積累一定階段後補上一臺備用Master機器(可通過配置文件修改備用機器數)。

    註意:由於hadoop要求所有機器上hadoop的部署目錄結構要求相同(因為在啟動時按與主節點相同的目錄啟動其它任務節點),並且都有一個相同的用戶名賬戶。參考各種文檔上說的是所有機器都建立一個hadoop用戶,使用這個賬戶來實現無密碼認證。這裡為了方便,分別在三台機器上都重新建立一個hadoop用戶。

1.3 環境配置

Hadoop集群要按照1.2小節表格所示進行配置,下麵介紹如何修改機器名稱和配置hosts文件,以方便使用。

註意:我的虛擬機都採用NAT方式連接網路,IP地址是自動分配的,所以這裡就使用自動分配的IP地址而未特地修改為某些IP地址。

(1)修改當前機器名稱

假定我們發現我們的機器的主機名不是我們想要的。

1)在Ubuntu下修改機器名稱

修改文件/etc/hostname里的值即可,修改成功後用hostname命令查看當前主機名是否設置成功。

linuxidcimg002[12]

      另外為了能正確解析主機名,最好也修改/etc/hosts文件里對應的主機名 
      linuxidcimg003[12]

2)在Fedora下修改機器名稱

通過對"/etc/sysconfig/network"文件修改其中"HOSTNAME"後面的值,改成我們規定的名稱。

命令:vi /etc/sysconfig/network,修改如下: 
    linuxidcimg004[12] 
        linuxidcimg005[12]

    同樣為了能正確解析主機名,最好也修改/etc/hosts文件里對應的主機名。

(2)配置hosts文件(必須)

"/etc/hosts"這個文件是用來配置主機將用的DNS伺服器信息,是記載LAN內接續的各主機的對應[HostName  IP]用的。當用戶在進行網路連接時,首先查找該文件,尋找對應主機名對應的IP地址。

我們要測試兩台機器之間知否連通,一般用"ping 機器的IP",如果想用"ping 機器的主機名"發現找不見該名稱的機器(這也就是為什麼在修改主機名的同時最好修改該文件中對應的主機名),解決的辦法就是修改"/etc/hosts"這個文件,通過把LAN內的各主機的IP地址和HostName的一一對應寫入這個文件的時候,就可以解決問題。

例如:機器為"Master.Hadoop:192.168.1.141"對機器為"Salve1.Hadoop:192.168.1.142"用命令"ping"記性連接測試。測試結果如下: 
    linuxidcimg006[12]

從上圖中的值,直接對IP地址進行測試,能夠ping通,但是對主機名進行測試,發現沒有ping通,提示"unknown host——未知主機",這時查看"Master.Hadoop"的"/etc/hosts"文件內容會發現裡面沒有"192.168.1.142  Slave1.Hadoop"內容,故而本機器是無法對機器的主機名為"Slave1.Hadoop" 解析。

在進行Hadoop集群配置中,需要在"/etc/hosts"文件中添加集群中所有機器的IP與主機名,這樣Master與所有的Slave機器之間不僅可以通過IP進行通信,而且還可以通過主機名進行通信。所以在所有的機器上的"/etc/hosts"文件中都要添加如下內容:

192.168.1.141 Master.Hadoop

192.168.1.142 Slave1.Hadoop

192.168.1.137 Slave2.Hadoop

命令:vi /etc/hosts,添加結果如下: 
linuxidcimg007[12]

現在我們在進行對機器為"Slave1.Hadoop"的主機名進行ping通測試,看是否能測試成功。

linuxidcimg009[12]

從上圖中我們已經能用主機名進行ping通了,說明我們剛纔添加的內容,在區域網內能進行DNS解析了,那麼現在剩下的事兒就是在其餘的Slave機器上進行相同的配置。然後進行測試。

1.4 所需軟體

(1)JDK軟體

    下載地址:http://www.Oracle.com/technetwork/java/javase/index.html

    JDK版本:jdk-7u25-linux-i586.tar.gz

(2)Hadoop軟體

    下載地址:http://hadoop.apache.org/common/releases.html

    Hadoop版本:hadoop-1.1.2.tar.gz

2、SSH無密碼驗證配置

Hadoop運行過程中需要管理遠端Hadoop守護進程,在Hadoop啟動以後,NameNode是通過SSH(Secure Shell)來啟動和停止各個DataNode上的各種守護進程的。這就必須在節點之間執行指令的時候是不需要輸入密碼的形式,故我們需要配置SSH運用無密碼公鑰認證的形式,這樣NameNode使用SSH無密碼登錄並啟動DataName進程,同樣原理,DataNode上也能使用SSH無密碼登錄到 NameNode。

註意:如果你的Linux沒有安裝SSH,請首先安裝SSH

Ubuntu下安裝ssh:sudo apt-get install openssh-server

Fedora下安裝ssh:yum install openssh-server

2.1 SSH基本原理和用法

1)SSH基本原理

    SSH之所以能夠保證安全,原因在於它採用了公鑰加密。過程如下:

(1)遠程主機收到用戶的登錄請求,把自己的公鑰發給用戶。

(2)用戶使用這個公鑰,將登錄密碼加密後,發送回來。

(3)遠程主機用自己的私鑰,解密登錄密碼,如果密碼正確,就同意用戶登錄。

2)SSH基本用法

    假如用戶名為java,登錄遠程主機名為linux,如下命令即可:

    $ ssh java@linux

    SSH的預設埠是22,也就是說,你的登錄請求會送進遠程主機的22埠。使用p參數,可以修改這個埠,例如修改為88埠,命令如下:

    $ ssh -p 88 java@linux

    註意:如果出現錯誤提示:ssh: Could not resolve hostname linux: Name or service not known,則是因為linux主機未添加進本主機的Name Service中,故不能識別,需要在/etc/hosts里添加進該主機及對應的IP即可:

    linux    192.168.1.107

2.2 配置Master無密碼登錄所有Salve

1)SSH無密碼原理

Master(NameNode | JobTracker)作為客戶端,要實現無密碼公鑰認證,連接到伺服器Salve(DataNode | Tasktracker)上時,需要在Master上生成一個密鑰對,包括一個公鑰和一個私鑰,而後將公鑰複製到所有的Slave上。當Master通過SSH連接Salve時,Salve就會生成一個隨機數並用Master的公鑰對隨機數進行加密,併發送給Master。Master收到加密數之後再用私鑰解密,並將解密數回傳給Slave,Slave確認解密數無誤之後就允許Master進行連接了。這就是一個公鑰認證過程,其間不需要用戶手工輸入密碼。

2)Master機器上設置無密碼登錄

a. Master節點利用ssh-keygen命令生成一個無密碼密鑰對。

在Master節點上執行以下命令:

ssh-keygen –t rsa –P ''

運行後詢問其保存路徑時直接回車採用預設路徑。生成的密鑰對:id_rsa(私鑰)和id_rsa.pub(公鑰),預設存儲在"/home/用戶名/.ssh"目錄下。 
    linuxidcimg010[12]

查看"/home/用戶名/"下是否有".ssh"文件夾,且".ssh"文件下是否有兩個剛生產的無密碼密鑰對。

    linuxidcimg011[12]

b. 接著在Master節點上做如下配置,把id_rsa.pub追加到授權的key裡面去。

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

linuxidcimg012[12]

查看下authorized_keys的許可權,如果許可權不對則利用如下命令設置該文件的許可權:

chmod 600 authorized_keys

c. 用root用戶登錄修改SSH配置文件"/etc/ssh/sshd_config"的下列內容。

檢查下麵幾行前面”#”註釋是否取消掉:

RSAAuthentication yes # 啟用 RSA 認證

PubkeyAuthentication yes # 啟用公鑰私鑰配對認證方式

AuthorizedKeysFile  %h/.ssh/authorized_keys # 公鑰文件路徑 
    linuxidcimg013[12]

設置完之後記得重啟SSH服務,才能使剛纔設置有效。

    linuxidcimg014[12]   

退出root登錄,使用普通用戶驗證是否設置成功。

linuxidcimg015[12] 

從上圖中得知無密碼登錄本級已經設置完畢,接下來的事兒是把公鑰複製所

有的Slave機器上。

    註意:有時候在測試時可能會出現錯誤: Agent admitted failure to sign using the key.解決辦法是:ssh-add  ~/.ssh/id_rsa ,如下所示:

  linuxidcimg016[12]

    d.使用ssh-copy-id命令將公鑰傳送到遠程主機上(這裡以Slave1.Hadoop為例)。

linuxidcimg018[12]

e. 測試是否無密碼登錄其它機器成功。

linuxidcimg020[12]

到此為止,我們經過5步已經實現了從"Master.Hadoop"到"Slave1.Hadoop"SSH無密碼登錄,下麵就是重覆上面的步驟把剩餘的兩台(Slave2.Hadoop和Slave3.Hadoop)Slave伺服器進行配置。這樣,我們就完成了"配置Master無密碼登錄所有的Slave伺服器"。

接下來配置所有Slave無密碼登錄Master,其和Master無密碼登錄所有Slave原理一樣,就是把Slave的公鑰追加到Master的".ssh"文件夾下的"authorized_keys"中,記得是追加(>>)。

註意:期間可能會出現一些問題如下:

(1)如果在ssh連接時出現錯誤“ssh:connect to host port 22: Connection refused”,如下圖所示: 
linuxidcimg021[12]

則可能是因為遠程登錄的那台機器沒有安裝ssh服務或安裝了沒有開啟ssh服務,下麵到Slave3.Hadoop主機進行測試: 
linuxidcimg023[12]

為了一勞永逸,設置系統啟動時開啟服務:# systemctl enable sshd.service 
linuxidcimg025[12]

(2)如果在用命令ssh-copy-id時發現找不到該命令“ssh-copy-id:Command not found”,則可能是ssh服務的版本太低的原因,比如若你的機器是RedHat系統就可能該問題,解決辦法是:手動複製本地的pubkey內容到遠程伺服器,命令如下:

 cat ~/.ssh/id_rsa.pub | ssh [email protected] 'cat >> ~/.ssh/authorized_keys'

該命令等價於下麵兩個命令:

①在本地機器上執行:scp ~/.ssh/id_rsa.pub [email protected]:/~

②到遠程機器上執行:cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

linuxidcimg027[12]

3、Java環境安裝

所有的機器上都要安裝JDK,現在就先在Master伺服器安裝,然後其他伺服器按照步驟重覆進行即可。安裝JDK以及配置環境變數,需要以"root"的身份進行。

3.1 安裝JDK

首先用root身份登錄"Master.Hadoop"後在"/usr"下創建"java"文件夾,再將"jdk-7u25-linux-i586.tar.gz"複製到"/usr/java"文件夾中,然後解壓即可。查看"/usr/java"下麵會發現多了一個名為"jdk1.7.0_25"文件夾,說明我們的JDK安裝結束,刪除"jdk-7u25-linux-i586.tar.gz"文件,進入下一個"配置環境變數"環節。

3.2 配置環境變數

(1)編輯"/etc/profile"文件

    編輯"/etc/profile"文件,在後面添加Java的"JAVA_HOME"、"CLASSPATH"以及"PATH"內容如下:

# set java environment

export JAVA_HOME=/usr/java/jdk1.7.0_25/

export JRE_HOME=/usr/java/jdk1.7.0_25/jre

export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib

export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

或者

# set java environment

export JAVA_HOME=/usr/java/jdk1.7.0_25/

export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

以上兩種意思一樣,那麼我們就選擇第1種來進行設置。

linuxidcimg028[12]

(2)使配置生效

保存並退出,執行下麵命令使其配置立即生效。

source /etc/profile 或 . /etc/profile

linuxidcimg029[11]

3.3 驗證安裝成功

配置完畢並生效後,用下麵命令判斷是否成功。

java -version

linuxidcimg030[11]

從上圖中得知,我們確定JDK已經安裝成功。

3.4 安裝剩餘機器

這時用普通用戶hadoop通過scp命令格式把"/usr/java/"文件複製到其他Slave上面,剩下的事兒就是在其餘的Slave伺服器上按照上圖的步驟配置環境變數和測試是否安裝成功,這裡以Slave1.Master為例:

scp -r /usr/java [email protected]:/usr/ 

註意:有的機器庫函數版本較低,可能安裝不了高版本的JDK,比如有些Redhat9,此時不可以選擇較低版本的JDK進行安裝,因為所有集群中的JDK版本必須相同(經過測試),有兩種方法可解決:一是放棄該機器,選用另一臺能裝該版本的JDK的機子;二是選擇低版本的JDK,在所有機器上重新安裝。

4、Hadoop集群安裝

所有的機器上都要安裝hadoop,現在就先在Master伺服器安裝,然後其他伺服器按照步驟重覆進行即可。安裝和配置hadoop需要以"root"的身份進行。

4.1 安裝hadoop

首先用root用戶登錄"Master.Hadoop"機器,將下載的"hadoop-1.1.2.tar.gz"複製到/usr目錄下。然後進入"/usr"目錄下,用下麵命令把"hadoop-1.1.2.tar.gz"進行解壓,並將其重命名為"hadoop",把該文件夾的讀許可權分配給普通用戶hadoop,然後刪除"hadoop-1.0.0.tar.gz"安裝包。

cd /usr

tar –xzvf hadoop-1.1.2.tar.gz

mv hadoop-1.1.2 hadoop

chown –R hadoop:hadoop hadoop #將文件夾"hadoop"讀許可權分配給hadoop普通用戶

rm -rf hadoop-1.1.2.tar.gz

最後在"/usr/hadoop"下麵創建tmp文件夾,並把Hadoop的安裝路徑添加到"/etc/profile"中,修改"/etc/profile"文件,將以下語句添加到末尾,並使其生效(. /etc/profile):

# set hadoop path

export HADOOP_HOME=/usr/hadoop

export PATH=$PATH :$HADOOP_HOME/bin

linuxidcimg031[11]

4.2 配置hadoop

(1)配置hadoop-env.sh

該"hadoop-env.sh"文件位於"/usr/hadoop/conf"目錄下。

在文件中修改下麵內容:

export JAVA_HOME=/usr/java/jdk1.7.0_25

linuxidcimg032[11]

Hadoop配置文件在conf目錄下,之前的版本的配置文件主要是Hadoop-default.xml和Hadoop-site.xml。 由於Hadoop發展迅速,代碼量急劇增加,代碼開發分為了core,hdfs和map/reduce三部分,配置文件也被分成了三個core- site.xml、hdfs-site.xml、mapred-site.xml。core-site.xml和hdfs-site.xml是站在 HDFS角度上配置文件;core-site.xml和mapred-site.xml是站在MapReduce角度上配置文件。

 (2)配置core-site.xml文件

修改Hadoop核心配置文件core-site.xml,這裡配置的是HDFS master(即namenode)的地址和埠號。

<configuration>

    <property>

        <name>hadoop.tmp.dir</name>

        <value>/usr/hadoop/tmp</value>

        (備註:請先在 /usr/hadoop 目錄下建立 tmp 文件夾)

        <description>A base for other temporary directories.</description>

    </property>

<!-- file system properties -->

    <property>

        <name>fs.default.name</name>

       <value>hdfs://192.168.1.141:9000</value>

    </property>

</configuration>

備註:如沒有配置hadoop.tmp.dir參數,此時系統預設的臨時目錄為:/tmp/hadoo-hadoop。而這個目錄在每次重啟後都會被刪掉,必須重新執行format才行,否則會出錯。

linuxidcimg033[11]

(3)配置hdfs-site.xml文件

修改Hadoop中HDFS的配置,配置的備份方式預設為3。

<configuration>

    <property>

        <name>dfs.replication</name>

        <value>1</value>

        (備註:replication 是數據副本數量,預設為3,salve少於3台就會報錯)

    </property>

<configuration>

 linuxidcimg034[11]

(4)配置mapred-site.xml文件

修改Hadoop中MapReduce的配置文件,配置的是JobTracker的地址和埠。

<configuration>

    <property>

        <name>mapred.job.tracker</name>

        <value>http://192.168.1.141:9001</value>

    </property>

</configuration>

linuxidcimg035[11]

(5)配置masters文件

有兩種方案:

    (1)第一種

    修改localhost為Master.Hadoop

    (2)第二種

    去掉"localhost",加入Master機器的IP:192.168.1.141

為保險起見,啟用第二種,因為萬一忘記配置"/etc/hosts"區域網的DNS失效,這樣就會出現意想不到的錯誤,但是一旦IP配對,網路暢通,就能通過IP找到相應主機。

linuxidcimg036[11]

(6)配置slaves文件(Master主機特有)

    有兩種方案:

    (1)第一種

    去掉"localhost",每行添加一個主機名,把剩餘的Slave主機名都填上。

    例如:添加形式如下:

Slave1.Hadoop

Slave2.Hadoop

    (2)第二種

    去掉"localhost",加入集群中所有Slave機器的IP,也是每行一個。

    例如:添加形式如下

192.168.1.142

192.168.1.137

原因和添加"masters"文件一樣,選擇第二種方式。

linuxidcimg037[11]

現在在Master機器上的Hadoop配置就結束了,剩下的就是配置Slave機器上的Hadoop。

最簡單的方法是將 Master上配置好的hadoop所在文件夾"/usr/hadoop"複製到所有的Slave的"/usr"目錄下(實際上Slave機器上的slavers文件是不必要的, 複製了也沒問題)。用下麵命令格式進行。(備註:此時用戶可以為普通用戶也可以為root)   

scp -r /usr/hadoop root@伺服器IP:/usr/

例如:從"Master.Hadoop"到"Slave1.Hadoop"複製配置Hadoop的文件。

scp -r /usr/hadoop [email protected]:/usr/

以root用戶進行複製,當然不管是用戶root還是普通用戶,雖然Master機器上的"/usr/hadoop"文件夾用戶hadoop有許可權,但是Slave1上的hadoop用戶卻沒有"/usr"許可權,所以沒有創建文件夾的許可權。所以無論是哪個用戶進行拷貝,右面都是"root@機器 IP"格式。因為我們只是建立起了普通用戶的SSH無密碼連接,所以用root進行"scp"時,扔提示讓你輸入"Slave1.Hadoop" 伺服器用戶root的密碼。

linuxidcimg039[11]

    查看"Slave1.Hadoop"伺服器的"/usr"目錄下是否已經存在"hadoop"文件夾,確認已經複製成功。查看結果如下:

linuxidcimg040[11] 

從上圖中知道,hadoop文件夾確實已經複製了,但是我們發現hadoop許可權是root,所以我們現在要給"Slave1.Hadoop"伺服器上的用戶hadoop添加對"/usr/hadoop"讀許可權。

以root用戶登錄"Slave1.Hadoop",執行下麵命令。

chown -R hadoop:hadoop(用戶名:用戶組) hadoop(文件夾)

接著在"Slave1 .Hadoop"上修改"/etc/profile"文件,將以下語句添加到末尾,並使其有效(source /etc/profile):

# set hadoop environment

export HADOOP_HOME=/usr/hadoop

export PATH=$PATH :$HADOOP_HOME/bin

如果不知道怎麼設置,可以查看前面"Master.Hadoop"機器的"/etc/profile"文件的配置,到此為止在一臺Slave機器上的Hadoop配置就結束了。剩下的事兒就是照葫蘆畫瓢把剩餘的幾台Slave機器進行部署Hadoop。

4.3 啟動及驗證

(1)格式化HDFS文件系統

在"Master.Hadoop"上使用普通用戶hadoop進行操作。(備註:只需一次,下次啟動不再需要格式化,只需start-all.sh)

hadoop namenode -format

linuxidcimg041[11] 

從上圖中知道我們已經成功格式化了,但是美中不足就是出現了一個警告,從網上得知這個警告並不影響hadoop執行,但是也有辦法解決,詳情看後面的"常見問題FAQ"。

(2)啟動hadoop

在啟動前關閉集群中所有機器的防火牆,不然會出現datanode開後又自動關閉。使用下麵命令啟動。

start-all.sh

linuxidcimg043[11]

可以通過以下啟動日誌看出,首先啟動namenode 接著啟動datanode1,datanode2,…,然後啟動secondarynamenode。再啟動jobtracker,然後啟動tasktracker1,tasktracker2,…。

啟動 hadoop成功後,在 Master 中的 tmp 文件夾中生成了 dfs 文件夾,在Slave 中的 tmp 文件夾中均生成了 dfs 文件夾和 mapred 文件夾。

(3)驗證hadoop

(1)驗證方法一:用"jps"命令

在Master上用 java自帶的小工具jps查看進程。

linuxidcimg044[11]

在Slave2上用jps查看進程。

linuxidcimg045[12]

如果在查看Slave機器中發現"DataNode"和"TaskTracker"沒有起來時,先查看一下日誌的,如果是"namespaceID"不一致問題,採用"常見問題FAQ6.2"進行解決,如果是"No route to host"問題,採用"常見問題FAQ6.3"進行解決。

(2)驗證方式二:用"hadoop dfsadmin -report"

用這個命令可以查看Hadoop集群的狀態。

linuxidcimg046[11]

 

 

 

4.4 網頁查看集群

(1)訪問"http://192.168.1.141:50030"

linuxidcimg048[11]

(2)訪問"http://192.168.1.142:50070"

linuxidcimg050[11]

5、常見問題FAQ

5.1 關於 Warning: $HADOOP_HOME is deprecated.

hadoop安裝完之後敲入hadoop命令時,老是提示這個警告:

    Warning: $HADOOP_HOME is deprecated.

經查hadoop-1.1.2/bin/hadoop腳本和"hadoop-config.sh"腳本,發現腳本中對HADOOP_HOME的環境變數設置做了判斷,其實根本不需要設置HADOOP_HOME環境變數。

解決方案一:編輯"/etc/profile"文件,去掉HADOOP_HOME的變數設定,重新輸入hadoop fs命令,警告消失。

解決方案二:編輯"/etc/profile"文件,添加一個環境變數,之後警告消失:

    export HADOOP_HOME_WARN_SUPPRESS=1

5.2 解決"no datanode to stop"問題

當我停止Hadoop時發現如下信息:

   no datanode to stop

原因:每次namenode format會重新創建一個namenodeId,而tmp/dfs/data下包含了上次format下的id,namenode format清空了namenode下的數據,但是沒有清空datanode下的數據,導致啟動時失敗,有兩種解決方案:

第一種解決方案如下:

1)先刪除"/usr/hadoop/tmp"

rm -rf /usr/hadoop/tmp

2)創建"/usr/hadoop/tmp"文件夾

mkdir /usr/hadoop/tmp

3)刪除"/tmp"下以"hadoop"開頭文件

rm -rf /tmp/hadoop*

4)重新格式化hadoop

 

hadoop namenode -format

5)啟動hadoop

start-all.sh

使用第一種方案,有種不好處就是原來集群上的重要數據全沒有了。假如說Hadoop集群已經運行了一段時間。建議採用第二種。

第二種方案如下:

1)修改每個Slave的namespaceID使其與Master的namespaceID一致。

  或者

2)修改Master的namespaceID使其與Slave的namespaceID一致。

該"namespaceID"位於"/usr/hadoop/tmp/dfs/name/current/VERSION"文件中,前面藍色的可能根據實際情況變化,但後面紅色一般是不變的。

例如:查看"Master"下的"VERSION"文件

linuxidcimg051[19]

本人建議採用第二種,這樣方便快捷,而且還能防止誤刪。

5.3 Slave伺服器中datanode啟動後又自動關閉

查看日誌發下如下錯誤。

    ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Call to ... failed on local exception: java.net.NoRouteToHostException: No route to host

解決方案是:關閉防火牆

5.4 從本地往hdfs文件系統上傳文件

出現如下錯誤:

INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException: Bad connect ack with firstBadLink

INFO hdfs.DFSClient: Abandoning block blk_-1300529705803292651_37023

WARN hdfs.DFSClient: DataStreamer Exception: java.io.IOException: Unable to create new block.

解決方案是:

1)關閉防火牆

2)禁用selinux

    編輯 "/etc/selinux/config"文件,設置"SELINUX=disabled"

5.5 安全模式導致的錯誤

出現如下錯誤:

org.apache.hadoop.dfs.SafeModeException: Cannot delete ..., Name node is in safe mode

在分散式文件系統啟動的時候,開始的時候會有安全模式,當分散式文件系統處於安全模式的情況下,文件系統中的內容不允許修改也不允許刪除,直到安全模式結束。安全模式主要是為了系統啟動的時候檢查各個DataNode上數據塊的有效性,同時根據策略必要的複製或者刪除部分數據塊。運行期通過命令也可以進入安全模式。在實踐過程中,系統啟動的時候去修改和刪除文件也會有安全模式不允許修改的出錯提示,只需要等待一會兒即可。

解決方案是:關閉安全模式

hadoop dfsadmin -safemode leave

5.6 解決Exceeded MAX_FAILED_UNIQUE_FETCHES

出現錯誤如下:

Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out

程式裡面需要打開多個文件,進行分析,系統一般預設數量是1024,(用ulimit -a可以看到)對於正常使用是夠了,但是對於程式來講,就太少了。

解決方案是:修改2個文件。

1)"/etc/security/limits.conf"

    vi /etc/security/limits.conf

加上:

    soft nofile 102400

    hard nofile 409600

2)"/etc/pam.d/login"

    vim /etc/pam.d/login

添加:

    session required /lib/security/pam_limits.so

針對第一個問題我糾正下答案:

這是reduce預處理階段shuffle時獲取已完成的map的輸出失敗次數超過上限造成的,上限預設為5。引起此問題的方式可能會有很多種,比如網路連接不正常,連接超時,帶寬較差以及埠阻塞等。通常框架內網路情況較好是不會出現此錯誤的。

5.7 解決"Too many fetch-failures"

出現這個問題主要是結點間的連通不夠全面。

解決方案是:

1)檢查"/etc/hosts"

要求本機ip 對應伺服器名

要求要包含所有的伺服器ip +伺服器名

2)檢查".ssh/authorized_keys"

要求包含所有伺服器(包括其自身)的public key

5.8 處理速度特別的慢

出現map很快,但是reduce很慢,而且反覆出現"reduce=0%"。

解決方案如下:

結合解決方案5.7,然後修改"conf/hadoop-env.sh"中的"export HADOOP_HEAPSIZE=4000"

5.9 解決hadoop OutOfMemoryError問題

出現這種異常,明顯是jvm記憶體不夠得原因。

解決方案如下:要修改所有的datanode的jvm記憶體大小。

    Java –Xms 1024m -Xmx 4096m

一般jvm的最大記憶體使用應該為總記憶體大小的一半,我們使用的8G記憶體,所以設置為4096m,這一值可能依舊不是最優的值。

更多Hadoop相關信息見Hadoop 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=13

 


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

-Advertisement-
Play Games
更多相關文章
  • 項目結構: 首先引用 Microsoft.EntityFrameworkCore.Tools Microsoft.EntityFrameworkCore.Design 增加類DesignTimeDbContextFactory QHContext 類 編輯Qh.Data項目的csproj 增加 <I ...
  • 用C#編寫的天氣預報小工具 功能 1、查詢中國省份、城市及地區三級的天氣預報; 2、顯示1-7天一周的天氣預報及未來8-15天的天氣預報; 3、能定製地區的天氣預報。 界面 源代碼: 註: 1、軟體代碼為原創,如需轉載,請註明出處; 2、部分網路素材及軟體樣式參考“小熊吉米”的博客園博文(全國天氣預 ...
  • 核心尋峰演算法的原理參考Ronny,鏈接:投影曲線的波峰查找, C#翻譯原理代碼參考sowhat4999,鏈接:C#翻譯Matlab中findpeaks方法 前人種樹,後人乘涼。感謝原作者詳細的解釋說明。 這裡先把翻譯代碼貼一下(略微的修改了sowhat4999代碼中的幾個參數) 以上方法並沒有將峰距 ...
  • 演示產品源碼下載地址:http://www.jinhusns.com/Products/Download ...
  • 於是查看系統日誌: 具體信息如下:日誌名稱: System來源: Service Control Manager日期: 2015/11/29 16:53:06事件 ID: 7024任務類別: 無級別: 錯誤關鍵字: 經典用戶: 暫缺電腦: DESKTOP-MKK5408描述:IIS Admin S ...
  • 前言:布衣博主乃苦逼的Java程式猿一枚,雖然工作中不會涉及系統運維,但是開發的項目總還是要部署到伺服器做一些負載均衡、系統相容性測試、系統集成等等騷操作,而這些測試性的操作不可能直接SSH遠程運維的伺服器任我行般瞎搞一通的,所以在個人的開發機上虛擬機一套Linux系統做為測試伺服器也就成了程式猿的 ...
  • 守護進程的特點 守護進程(Daemon)是在後臺運行的一種特殊進程,它脫離於終端,從而這可避免進程被任何終端所產生的信號打斷,它在執行進程中的產生信息也不在任何終端上顯示。守護進程周期性地執行某種任務或等待處理某些發生的事件,Linux的大多數伺服器就是用守護進程實現的。 守護進程編程要點 1.屏蔽 ...
  • 英文原文: https://www.linuxatemyram.com/ 作者: "Vidar Holen" 譯者: "thinkam" 發生了什麼? Linux正借用你未使用的記憶體來做磁碟緩存。這使你的電腦看起來可用記憶體很少,但事實不是這樣!一切都很正常! 為什麼這麼做? 磁碟緩存使你的系統運行 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...