1. 程式人生 > >CDH中配置HDFS HA 及shell 指令碼

CDH中配置HDFS HA 及shell 指令碼

最近又安裝 hadoop 叢集, 故嘗試了一下配置 HDFS 的 HA,CDH4支援Quorum-based Storageshared storage using NFS兩種HA方案,而CDH5只支援第一種方案,即 QJM 的 HA 方案。

叢集規劃

我一共安裝了三個節點的叢集,對於 HA 方案來說,三個節點準備安裝如下服務:

  • cdh1:hadoop-hdfs-namenode(primary) 、hadoop-hdfs-journalnode、hadoop-hdfs-zkfc
  • cdh2:hadoop-hdfs-namenode(standby)、hadoop-hdfs-journalnode、hadoop-hdfs-zkfc
  • cdh3: hadoop-hdfs-journalnode

根據上面規劃,在對應節點上安裝相應的服務。

安裝步驟

停掉叢集

停掉叢集上所有服務。

$ sh /opt/cmd.sh ' for x in `ls /etc/init.d/|grep spark` ; do service $x stop ; done'
​$ sh /opt/cmd.sh ' for x in `ls /etc/init.d/|grep impala` ; do service $x stop ; done'
$ sh /opt/cmd.sh ' for x in `ls /etc/init.d/|grep hive` ; do service $x stop ; done'
$ sh /opt/cmd.sh ' for x in `ls /etc/init.d/|grep hbase` ; do service $x stop ; done' $ sh /opt/cmd.sh ' for x in `ls /etc/init.d/|grep hadoop` ; do service $x stop ; done'

cmd.sh程式碼內容見Hadoop叢集部署許可權總結一文中的/opt/shell/cmd.sh。

停止客戶端程式

停止服務叢集的所有客戶端程式,包括定時任務。

備份 hdfs 元資料

a,查詢本地配置的檔案目錄(屬性名為 dfs.name.dir 或者 dfs.namenode.name.dir或者hadoop.tmp.dir )

grep -C1 hadoop.tmp.dir /etc/hadoop/conf/hdfs-site.xml

#或者
grep -C1 dfs.namenode.name.dir /etc/hadoop/conf/hdfs-site.xml

通過上面的命令,可以看到類似以下資訊:

<property>
<name>hadoop.tmp.dir</name>
<value>/data/dfs/nn</value>
</property>

b,對hdfs資料進行備份

cd /data/dfs/nn
tar -cvf /root/nn_backup_data.tar .

安裝服務

在 cdh1、cdh2、cdh3 上安裝 hadoop-hdfs-journalnode

$ ssh cdh1 'yum install hadoop-hdfs-journalnode -y '
$ ssh cdh2 'yum install hadoop-hdfs-journalnode -y '
$ ssh cdh3 'yum install hadoop-hdfs-journalnode -y '

在 cdh1、cdh2 上安裝 hadoop-hdfs-zkfc:

ssh cdh1 "yum install hadoop-hdfs-zkfc -y "
ssh cdh2 "yum install hadoop-hdfs-zkfc -y "

修改配置檔案

修改/etc/hadoop/conf/core-site.xml,做如下修改:

<property>
	<name>fs.defaultFS</name>
	<value>hdfs://mycluster:8020</value>
</property>
<property>
	<name>ha.zookeeper.quorum</name>
	<value>cdh1:21088,cdh2:21088,cdh3:21088</value>
</property>

修改/etc/hadoop/conf/hdfs-site.xml,刪掉一些原來的 namenode 配置,增加如下:

<!--  hadoop  HA -->
<property>
	<name>dfs.nameservices</name>
	<value>mycluster</value>
</property>
<property>
	<name>dfs.ha.namenodes.mycluster</name>
	<value>nn1,nn2</value>
</property>
<property>
	<name>dfs.namenode.rpc-address.mycluster.nn1</name>
	<value>cdh1:8020</value>
</property>
<property>
	<name>dfs.namenode.rpc-address.mycluster.nn2</name>
	<value>cdh2:8020</value>
</property>
<property>
	<name>dfs.namenode.http-address.mycluster.nn1</name>
	<value>cdh1:50070</value>
</property>
<property>
	<name>dfs.namenode.http-address.mycluster.nn2</name>
	<value>cdh2:50070</value>
</property>
<property>
	<name>dfs.namenode.shared.edits.dir</name>
	<value>qjournal://cdh1:8485,cdh2:8485,cdh3:8485/mycluster</value>
</property>
<property>
	<name>dfs.journalnode.edits.dir</name>
	<value>/data/dfs/jn</value>
</property>
<property>
	<name>dfs.client.failover.proxy.provider.mycluster</name>
	<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
	<name>dfs.ha.fencing.methods</name>
	<value>sshfence(hdfs)</value>
</property>
<property>
	<name>dfs.ha.fencing.ssh.private-key-files</name>
	<value>/var/lib/hadoop-hdfs/.ssh/id_rsa</value>
</property>
<property>
	<name>dfs.ha.automatic-failover.enabled</name>
	<value>true</value>
</property>

同步配置檔案

將配置檔案同步到叢集其他節點:

$ sh /opt/syn.sh /etc/hadoop/conf /etc/hadoop/

在journalnode的三個節點上建立目錄:

$ ssh cdh1 'mkdir -p /data/dfs/jn ; chown -R hdfs:hdfs /data/dfs/jn'
$ ssh cdh2 'mkdir -p /data/dfs/jn ; chown -R hdfs:hdfs /data/dfs/jn'
$ ssh cdh3 'mkdir -p /data/dfs/jn ; chown -R hdfs:hdfs /data/dfs/jn'

配置無密碼登陸

在兩個NN上配置hdfs使用者間無密碼登陸:

對於 cdh1:

$ passwd hdfs
$ su - hdfs
$ ssh-keygen
$ ssh-copy-id  cdh2

對於 cdh2:

$ passwd hdfs
$ su - hdfs
$ ssh-keygen
$ ssh-copy-id   cdh1

啟動journalnode

啟動cdh1、cdh2、cdh3上的 hadoop-hdfs-journalnode 服務

$ ssh cdh1 'service hadoop-hdfs-journalnode start'
$ ssh cdh2 'service hadoop-hdfs-journalnode start'
$ ssh cdh3 'service hadoop-hdfs-journalnode start'

初始化共享儲存

在namenode上初始化共享儲存,如果沒有格式化,則先格式化:

hdfs namenode -initializeSharedEdits

啟動NameNode:

$ service hadoop-hdfs-namenode start

同步 Standby NameNode

cdh2作為 Standby NameNode,在該節點上先安裝namenode服務

$ yum install hadoop-hdfs-namenode -y

再執行:

$ sudo -u hdfs hadoop namenode -bootstrapStandby

如果是使用了kerberos,則先獲取hdfs的ticket再執行:

$ kinit -k -t /etc/hadoop/conf/hdfs.keytab hdfs/[email protected]
$ hadoop namenode -bootstrapStandby

然後,啟動 Standby NameNode:

$ service hadoop-hdfs-namenode start

配置自動切換

在兩個NameNode上,即cdh1和cdh2,安裝hadoop-hdfs-zkfc

$ ssh cdh1 'yum install hadoop-hdfs-zkfc -y'
$ ssh cdh2 'yum install hadoop-hdfs-zkfc -y'

在任意一個NameNode上下面命令,其會建立一個znode用於自動故障轉移。

$ hdfs zkfc -formatZK

如果你想對zookeeper的訪問進行加密,則請參考 Enabling HDFS HA 中 Securing access to ZooKeeper 這一節內容。

然後再兩個 NameNode 節點上啟動zkfc:

$ ssh cdh1 "service hadoop-hdfs-zkfc start"
$ ssh cdh2 "service hadoop-hdfs-zkfc start"

測試

分別訪問 http://cdh1:50070/ 和 http://cdh2:50070/ 檢視誰是 active namenode,誰是 standyby namenode。

檢視某Namenode的狀態:

#檢視cdh1狀態
$ sudo -u hdfs hdfs haadmin -getServiceState nn1
active

#檢視cdh2狀態
$ sudo -u hdfs hdfs haadmin -getServiceState nn2
standby

執行手動切換:

$ sudo -u hdfs hdfs haadmin -failover nn1 nn2
Failover to NameNode at cdh2/192.168.56.122:8020 successful

再次訪問 http://cdh1:50070/ 和 http://cdh2:50070/ 檢視誰是 active namenode,誰是 standyby namenode。

配置HBase HA

先停掉 hbase,然後修改/etc/hbase/conf/hbase-site.xml,做如下修改:

<!-- Configure HBase to use the HA NameNode nameservice -->
<property>
    <name>hbase.rootdir</name>
    <value>hdfs://mycluster:8020/hbase</value>       
  </property>

在 zookeeper 節點上執行/usr/lib/zookeeper/bin/zkCli.sh

$ ls /hbase/splitlogs
$ rmr /hbase/splitlogs

最後啟動 hbase 服務。

配置 Hive HA

執行下面命令將hive的metastore的root地址的HDFS nameservice。

$ /usr/lib/hive/bin/metatool -listFSRoot 
Initializing HiveMetaTool..
Listing FS Roots..
hdfs://cdh1:8020/user/hive/warehouse  

$ /usr/lib/hive/bin/metatool -updateLocation hdfs://mycluster hdfs://cdh1 -tablePropKey avro.schema.url 
-serdePropKey schema.url  

$ metatool -listFSRoot 
Listing FS Roots..
Initializing HiveMetaTool..
hdfs://mycluster:8020/user/hive/warehouse

配置 Impala

不需要做什麼修改,但是一定要記住 core-site.xml 中 fs.defaultFS 引數值要帶上埠號,在CDH中為 8020。

配置 YARN

配置 Hue

配置 Llama


相關推薦

CDH配置HDFS HA shell 指令碼

最近又安裝 hadoop 叢集, 故嘗試了一下配置 HDFS 的 HA,CDH4支援Quorum-based Storage和shared storage using NFS兩種HA方案,而CDH5只支援第一種方案,即 QJM 的 HA 方案。 叢集規劃 我一共安裝了三個節點的叢集,對於 HA 方案來說

Linux下批量修改檔案字尾名shell指令碼匹配檔名稱變數寫法

rename .txt.COMPLETED  .txt   *.txt.COMPLETED 為了完整起見,我這裡再用一些例子加以說明 ${ } 的一些特異功能: 假設我們定義了一個變數為: fi

Linux的四個簡單shell指令碼

1.列印Hello World! #!/bin/bash #Program: # This program shows "Hello World!" in your screen. #History: #2018/11/17 caiyuting First release P

Hadoop(25)-高可用叢集配置,HDFS-HA和YARN-HA

一. HA概述 1. 所謂HA(High Available),即高可用(7*24小時不中斷服務)。 2. 實現高可用最關鍵的策略是消除單點故障。HA嚴格來說應該分成各個元件的HA機制:HDFS的HA和YARN的HA。 3. Hadoop2.0之前,在HDFS叢集中NameNode存在單點故障(SPOF

centos刪除openJDK,安裝jdk(離線版)shell指令碼安裝

1.環境 jdk1.8.0_191 centos7.5 2.為什麼要用離線 很多客戶現場都不能聯通外網,只能進行離線安裝。這裡即將用兩種方式安裝jdk,一種是手動的離線安裝,一種是指令碼安裝。 3.手動安裝jdk 3.1 檢視jdk版本資訊 java -versi

Java服務部署上linux主機shell指令碼啟停

今天在工作中需要將自己寫的http服務端和客戶端程式碼分別打包部署上linux主機並以shell指令碼形式啟停,如下為操作流程及總結。 1,java程式打包: 選擇專案–>Export–>Runnable JAR file 2,將jar包放

Linux學習之核心shell指令碼

列舉常見核心引數及引數的意義 關閉ipv6 net.ipv6.conf.all.disable_ipv6 = 1 關閉路由轉發 net.ipv4.ip_forward = 0 最大限度使用實體記憶體 vm.swappiness = 0 ARP快取的存活時間 ne

Linux系統命令Shell指令碼學習筆記五:字元處理

管道 管道可以把一個命令的輸出內容當作下一個命令的輸入內容,兩個命令之間只需要使用管道符號連線即可,由管道連線起來的程序可以自動執行。 ls -l /etc/init.d | more 檢視目錄下檔案的詳細資訊,但會因為輸出內容過多而造成翻屏,先輸出的內容就會看不到了,利用

webstorm配置nodejs環境npm

———————————————————————————————————————————————————————— ——nodejs安裝及環境配置 1.nodejs官網,下載windows平臺node

配置Apache2.x 支援shell指令碼和Python編寫CGI程式+測試程式

1.安裝apache <span style="font-size:18px;">[email protected]:~$ aptitude search apache p apache2

Java執行linux命令shell指令碼

import java.io.*; import java.util.*; import org.apache.log4j

Linux通過cat EOF新建檔案並新增或追加內容方法並在shell指令碼配置環境變數時使用

cat << EOF >實現新建檔案並新增內容 [email protected]:/opt# cat << EOF >abcd.txt > 1 > 2 > 3 > eof > EOF [email

詳解CentOS定時執行釋放記憶體的Shell指令碼相關原理

本文由荒原之夢原創,原文連結:http://zhaokaifeng.com/?p=748 本文總體結構: 第一部分:本文中釋放系統記憶體的原理 第二部分:建立用於釋放記憶體的Shell指令碼並加入到系統定時任務 第三部分:詳細分析Shell指令碼中的每一條指令 第四部

shell指令碼一次性配置Linuxjava環境變數

只需bash一下,很輕鬆有木有QAQ詳見程式碼:#!bin/bash nowLoad=`pwd` goalPath="/usr/java" #我們把jdk放在這兒 environmentPath="/home/kzl/.bash_profile" #kzl是我的使用者名

shell指令碼makefile的特殊變數

shell指令碼中的特殊變數 1. $# 傳遞到指令碼的引數個數 2. $* 以一個單字串顯示所有向指令碼傳遞的引數。與位置變數不同,此選項引數可超過9個3. $$ 指令碼執行的當前程序ID號4. $! 後臺執行的最後一個程序的程序ID號5. [email p

shell指令碼修改配置檔案引數

shell指令碼修改配置檔案中引數指令碼:change_ejabberd.sh內容如下:注意:cut的用法:cut命令主要是接受三個定位方法:第一,位元組(bytes),用選項-b第二,字元(characters),用選項-c第三,域(fields),用選項-f

Azkaban實戰,Command型別單一job示例,任務執行外部shell指令碼,Command型別多job工作flow,HDFS操作任務,MapReduce任務,HIVE任務

1.Azkaban實戰 Azkaba內建的任務型別支援command、java Command型別單一job示例 1、建立job描述檔案 vi command.job #command.job type=command

Shell指令碼(三)-Shell的變數、函式read命令

在Shell指令碼中,通常需要在Shell命令使用其他資料來處理資訊。這就需要使用變數來實現,變數可以將資訊臨時儲存在Shell執行環境中,以便和指令碼中的其他命令一起使用。變數的型別系統變數:系統變數通常寫在/etc/profile或/etc/profile.d中,對所有使

shell指令碼獲取配置檔案的內容

1、獲取配置檔案中的內容。 步驟是1,2,3. 2.刪除一個檔案中的內容,然後追加自己需要的內容,這裡的先將檔案中的內容刪除,然後新增1234進去。  3.在某行的前一行或後一行新增內容 具休操作如下: #匹配行前加 sed -i '/allow 361

大數據【二】HDFS部署文件讀寫(包含eclipse hadoop配置

throw 大數據 我的電腦 ssh 生效 manager 方法 slave .sh 一  原理闡述 1‘  DFS     分布式文件系統(即DFS,Distributed File System),指文件系統管理的物理存儲資源不一定直接連接在本地節點上,而是通過計算機網