CDH中配置HDFS HA 及shell 指令碼
最近又安裝 hadoop 叢集, 故嘗試了一下配置 HDFS 的 HA,CDH4支援Quorum-based Storage和shared 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指令碼一次性配置Linux中java環境變數
只需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),指文件系統管理的物理存儲資源不一定直接連接在本地節點上,而是通過計算機網