此步驟是 U盤給Linux上掛載顯示,如無此需求請忽略此步。java
... Device Boot Start End Blocks Id System /dev/sdb1 * 1 2668 128016 6 FAT16
# 先建立一個掛載目錄 $ mkdir /mnt/usb # 若是是U盤文件格式爲 fat32,就用命令: $ mount -t vfat /dev/sdb1 /mnt/usb # 若是是U盤文件格式爲 ext2格式,就用命令: $ mount -t ext2 /dev/sda1 /mnt/usb # 若是是U盤文件格式爲 ntfs,就用命令: # 先安裝ntfs-3g: $ yum install ntfs-3g $ mount -t ntfs-3g /dev/sda1 /ntfs
$ df –lh
$ cd /mnt/usb
$ umount /mnt/usb
節點名稱 | IP地址 | 安裝服務 |
---|---|---|
hadoop001 | 192.168.0.10 | NameNode、DFSZKFailoverController(ZKFC) |
hadoop002 | 192.168.0.11 | DataNode、NodeManager、JournalNode、QuorumPeerMain、ZooKeeper |
hadoop003 | 192.168.0.12 | DataNode、NodeManager、JournalNode、QuorumPeerMain、ZooKeeper |
hadoop004 | 192.168.0.13 | ResourceManager |
hadoop005 | 192.168.0.14 | DataNode、NodeManager |
hadoop006 | 192.168.0.15 | DataNode、NodeManager |
hadoop007 | 192.168.0.16 | NameNode、DFSZKFailoverController(ZKFC) |
hadoop008 | 192.168.0.17 | DataNode、NodeManager、JournalNode 、QuorumPeerMain 、zookeeper --- JN用來同步兩個NN之間的數據,standbay的NN至關於SNN |
hadoop009 | 192.168.0.18 | ResourceManager |
hadoop010 | 192.168.0.19 | DataNode、NodeManager |
hadoop011 | 192.168.0.20 | DataNode、NodeManager |
hadoop012 | 192.168.0.21 | DataNode、NodeManager |
關於爲何沒有secondarynamenode,由於standby狀態的NameNode能夠完成checkpoint操做,所以不必配置Secondary NameNode、CheckpointNode、BackupNode。若是真的配置了,還會報錯。node
$ cd /hadoop/zookeeper-3.4.6/conf/ $ cp zoo_sample.cfg zoo.cfg $ vim zoo.cfg #修改如下內容長度 dataDir=/hadoop/zookeeper-3.4.6/tmp #在最後添加: server.1=hadoop104:2888:3888 server.2=hadoop105:2888:3888 server.3=hadoop106:2888:3888 #保存退出 注:2888是leader和follower通訊的端口,3888是投票用的端口
$ mkdir /hadoop/zookeeper-3.4.6/tmp
$ touch /hadoop/zookeeper-3.4.6/tmp/myid
#hadoop104機器: $ echo 1 > /hadoop/zookeeper-3.4.6/tmp/myid #hadoop105機器: $ echo 2 > /hadoop/zookeeper-3.4.6/tmp/myid #hadoop106機器: $ echo 3 > /hadoop/zookeeper-3.4.6/tmp/myid
2.1 配置$HADOOP_HOME/etc/hadoop目錄下的配置文件 core-site.xmlapache
$ vim core-site.xml #全部設置的文件夾都要提早建好(很重要) #【這裏的值指的是默認的HDFS路徑。當有多個HDFS集羣同時工做時,集羣名稱在這裏指定!該值來自於hdfs-site.xml中的配置】 <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://myha</value> </property> #【這裏的路徑默認是NameNode、DataNode、JournalNode等存放數據的公共目錄。用戶也能夠本身單獨指定這三類節點的目錄。】 <property> <name>hadoop.tmp.dir</name> <value>file:///home/hadoop/tmp</value> </property> #【io數據塊大小】 <property> <name>io.file.buffer.size</name> <value>131072</value> </property> #【FSImage文件和EditsLog文件能夠經過ID來互相關聯。在參數dfs.namenode.name.dir設置的路徑下,會保存FSImage文件和EditsLog文件,若是是QJM方式HA的話,EditsLog文件保存在參數dfs.journalnode.edits.dir設置的路徑下。】 <property> <name>dfs.journalnode.edits.dir</name><value>/home/hadoop/journaldata</value> #注意,不要加file </property> #【這裏是ZooKeeper集羣的地址和端口。注意,數量必定是奇數,且很多於三個節點】 <property> <name>ha.zookeeper.quorum</name> <value>hadoop002:2181,hadoop003:2181,hadoop008:2181</value> </property> </configuration>
$ vim hdfs-site.xml #【指定DataNode存儲block的副本數量。默認值是3個,咱們如今有4個DataNode,該值不大於4便可。】 <configuration> <property> <name>dfs.replication</name> <value>3</value> </property> #【使用federation時,HDFS集羣別名。名字能夠隨便起,多個集羣時相互不重複便可】 <property> <name>dfs.nameservices</name> <value>myha</value> </property> #【指定該集羣的namenode的機器】 <property> <name>dfs.ha.namenodes.myha</name> <value>hadoop001,hadoop007</value> </property> #【指定hadoop100的RPC地址】 <property> <name>dfs.namenode.rpc-address.myha.hadoop001</name> <value>hadoop001:9000</value> </property> #【指定hadoop100的http地址】 <property> <name>dfs.namenode.http-address.cluster1.hadoop001</name> <value>hadoop001:50070</value> </property> #【指定hadoop101的RPC地址】 <property> <name>dfs.namenode.rpc-address.myha.hadoop101</name> <value>hadoop101:9000</value> </property> #【指定hadoop101的http地址】 <property> <name>dfs.namenode.http-address.myha.hadoop101</name> <value>hadoop101:50070</value> </property> #【指定該集羣的兩個NameNode共享edits文件目錄時,使用的JournalNode集羣信息】 <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop002:8485;hadoop003:8485;hadoop008:8485/myha</value> </property> #【指定該集羣是否啓動自動故障恢復,即當NameNode出故障時,是否自動切換到另外一臺NameNode】 <property> <name>dfs.ha.automatic-failover.enabled.myha</name> <value>true</value> </property> #【指定該集羣出故障時,哪一個實現類負責執行故障切換】 <property> <name>dfs.client.failover.proxy.provider.myha</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> #【一旦須要NameNode切換,使用ssh方式進行操做】 <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> #【若是使用ssh進行故障切換,使用ssh通訊時用的密鑰存儲的位置】 <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>file:///root/.ssh/id_rsa</value> </property> #【connect-timeout鏈接超時】 <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///home/hadoop/tmp/dfs/name</value> </property> #【設置】 <property> <name>dfs.datanode.data.dir</name> <value>file:///home/hadoop/tmp/dfs/data</value> </property> </configuration>
$ vim mapred-site.xml <configuration> #【指定運行mapreduce的環境是yarn,與hadoop1大相徑庭的地方】 <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
$ vim yarn-site.xml <configuration> #【啓動HA高可用性】 <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> #【指定resourcemanager的名字,不能與zookeeper的命名相同】 <property> <name>yarn.resourcemanager.cluster-id</name> <value>yrc</value> </property> #【使用了2個resourcemanager,分別指定Resourcemanager的地址】 <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> #【自定ResourceManager1的地址】 <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>hadoop102</value> </property> #【自定ResourceManager2的地址】 <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>hadoop103</value> </property> #【制定Zookeeper機器】 <property> <name>yarn.resourcemanager.zk-address</name> <value>hadoop104:2181,hadoop105:2181,hadoop106:2181</value> </property> #【默認】 <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
注:若是在啓動的時候報bootstrap
#WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
能夠在hadoop/etc/hadoop/log4j.properties 文件中添加vim
log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERRO
注意:
在 hadoop/etc/hadoop 下記得創建 slave 文件bash
1) 啓動zookeeper集羣(在主機名hadoop00二、hadoop00三、hadoop008上啓動)app
$ cd cd /home/hadoop/apps/zookeeper/ $ bin/zkServer.sh start (逐個啓動) #查看狀態:一個leader,兩個follower bin//zkServer.sh status
$ cd $HADOOP_HOME $ sbin/hadoop-daemon.sh start journalnode
3) 驗證ssh
$ jps #顯示JouralNode + QuorumpeerMain
$ hdfs namenode -format
$ hdfs zkfc -formatZK
6) NameNode從hadoop001同步到hadoop007
1.在hadoop007執行 hdfs namenode bootstrapstandby
2.驗證 tmp下生成dfs
3.若是1失敗(在hadoop001執行) ide
ssh-keygen -f "~/.ssh/known_hosts" -R hadoop007
4.驗證 tmp下生成dfs
5.或者直接拷貝 tmp 目錄到 hadoop007oop
$ start-dfs.sh #驗證 jps
8) 啓動yarn(在hadoop004執行)
$ start-yarn.sh #驗證: jps #顯示ResourceManager + NodeManager
$ hadoop-daemon.sh start zkfc #驗證 jps #顯示DFSZKFailoverController
兩臺nomenode在 start-all.sh的時候,50070都是現實standby,在啓動zkfc的時候 nn1 顯示爲active
Hadoop使用的是log4j記錄日誌,咱們理所固然會想到去修改${HADOOP_HOME}/etc/hadoop/log4j.properties,可是改完重啓,你會發現然並卵!!!
尼瑪,這是爲啥,認真看了下log4j.properties的配置說明,發現一個關鍵點:
# Define some default values that can be overridden by system properties hadoop.root.logger=WARN,console
意思就是說,這裏的配置會被系統屬性覆蓋!
因而乎,查了下可能會設置系統屬性的腳本,發現須要修改如下2個文件,才能把默認的日誌級別改掉(我這裏只改的HDFS的,Yarn的自行參考便可):
第一處是${HADOOP_HOME}/etc/hadoop/hadoop-env.sh,把INFO改成WARN便可:
# Command specific options appended to HADOOP_OPTS when specifiedexport HADOOP_NAMENODE_OPTS="-Xmx30720m -Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-WARN,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-WARN,NullAppender} $HADOOP_NAMENODE_OPTS"
還有一處藏的比較深,是啓動腳本${HADOOP_HOME}/sbin/hadoop-daemon.sh,也須要這樣改一下:
export HADOOP_ROOT_LOGGER=${HADOOP_ROOT_LOGGER:-"WARN,RFA"}
最後在重啓下NameNode就能夠了。
線上配合Zookeeper作了HA,因此能夠平滑重啓,直接使用如下命令先重啓standby的NameNode,在將standby切換爲active,在重啓另外一臺NameNode就能夠了。
先重啓standbycd ${HADOOP_HOME}/sbin
./hadoop-daemon.sh stop namenode ./hadoop-daemon.sh start namenode
切換active節點,這裏的nn2將被切換爲active節點
hdfs haadmin -failover <nn1> <nn2>
最後重啓nn2就完事了,重啓方式同上
本文來自 QQ羣的大佬 @托馬斯維德 分享的。我就給整理 copy 過來了。謝謝大佬,謝謝你們!