
一系統版本及相關軟件:
CentOS6.7 64位 2.6.32-573.el6.x86_64,選擇安裝時為mini選項,不安裝圖形界面
hadoop-2.7.1.tar.gz
jdk-7u79-linux-x64.tar.gz
zookeeper-3.4.9.tar.gz
apache-hive-2.1.1-bin.tar.gz
hbase-1.2.4-bin.tar.gz
hadoop-2.7.1 與 hbase-1.2.4 版本匹配
Hadoop集群、NameNode+HA、ResourceManager+HA、Hive使用MYSQL管理元數據、HBase+HA、使用ZooKeeper來管理Hadoop集群
集群規划
| 主機名 |
IP地址 |
應用軟件 |
運行進程(運行jps后的顯示) |
| Node01 |
192.168.1.1 |
Jdk hadoop |
DFSZKFailoverController NameNode |
| Node02 |
192.168.1.2 |
Jdk hadoop |
DFSZKFailoverController NameNode |
| Node03 |
192.168.1.3 |
Jdk hadoop hbase |
ResourceManager Main HMaster |
| Node04 |
192.168.1.4 |
Jdk hadoop hbase |
HMaster ResourceManager |
| Node05 |
192.168.1.5 |
Jdk hadoop hbase zookeeper |
QuorumPeerMain HRegionServer DataNode NodeManager JournalNode |
| Node06 |
192.168.1.6 |
Jdk hadoop hbase zookeeper |
JournalNode NodeManager HRegionServer QuorumPeerMain DataNode |
| Node07 |
192.168.1.7 |
Jdk hadoop hbase zookeeper hive mysql |
HRegionServer JournalNode DataNode QuorumPeerMain NodeManager |
說明:
1、本次搭建,安排了兩個NameNode節點,分別是1、2號機,兩台NameNode,一台處於active狀態,另一台處於standby狀態。ActiveNameNode對外提供服務,Standby NameNode不對外提供服務,僅同步active namenode狀態,以便能夠在它失敗時進行 快速切換。
2、Hadoop 官方提供了兩種 HDFSHA的解決方案,一種是NFS,另一種是QJM。在本次搭建中,我們使用QJM,主備NameNode通過JournalNode同步數據,只要成功寫入多數JournalNode即認為寫入成功,所以要配置奇數個JournalNode,我們配置了3個。
3、本次搭建上,配置了2個ResourceManager,一個是Active,一個是Standby,狀態由zookeeper進行協調
二、安裝步驟大概有以下幾個部分組成,開通用戶、時鍾同步、關閉防火牆、配置JAVA運行環境、hadoop安裝、zookeeper、hive、mysql、hbase等相關軟件的安裝。
2.1、開能用戶,開通一個專屬用戶hduser,以后所有用戶都以這個普通用戶的權限進行操作,提高安全性,在7台機器都開通同樣的用戶名,設置同樣的口令,編輯 /etc/sudoers文件,給用戶hduser開放部分root權限。
2.2、編輯 /etc/hosts,在1號機上編輯,等設置好無密碼登錄后,復制到其它6台機器上
cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.1 node01
192.168.1.2 node02
192.168.1.3 node03
192.168.1.4 node04
192.168.1.5 node05
192.168.1.6 node06
192.168.1.7 node07
2.3、實現機器間無密登,錄配置免密碼登陸
首先要配置node01到node02、node03、node04、node05、node06、node07的免密碼登陸在node01上生產一對鑰匙
ssh-keygen -t rsa
將公鑰拷貝到其他節點,包括自己
ssh-coyp-id node01
ssh-coyp-id node02
ssh-coyp-id node03
ssh-coyp-id node04
ssh-coyp-id node05
ssh-coyp-id node06
ssh-coyp-id node07
配置node03到node04、node05、node06、node07的免密碼登陸,在node03上生產一對鑰匙
ssh-keygen -t rsa
將公鑰拷貝到其他節點
ssh-coyp-id node04
ssh-coyp-id node05
ssh-coyp-id node06
ssh-coyp-id node07
兩個namenode之間要配置ssh免密碼登陸,配置node02到node01的免登陸,在node02上生產一對鑰匙
ssh-keygen -t rsa
ssh-coyp-id-i node01
2.4、時鍾同步,本次搭建以1號機的時鍾為准,1號機開通ntpd服務
[hduser@node01~]$ service ntpd status
ntpd (pid 21729) is running...
其它6部機器運行ntpdate命令,以此類似
[hduser@node02 ~]$ sudo ntpdate node01
[sudo] password for hadoop:
6 Mar 14:24:28 ntpdate[10817]: step timeserver 192.168.1.1 offset -23.277136 sec
為確保時鍾同步,應將該命令寫入計划任務
2.5、安裝lrzsz工具,用於上傳下載文件,安裝openssh-clients,以便可以執行scp命令
sudo yum install lrzsz
安裝lrzsz,使用rz或sz命令可以方便地上傳和下載文件
sudo yum install openssh-clients
安裝openssh-clients,可以方便地使用scp 命令遠程拷貝目錄和文件
2.6、安裝JDK
在1號機中,解壓釋放jdk-7u79-linux-x64.tar.gz,指定放在/home/hadoop下,編輯/etc/profile文件,在文件尾部加上
############################
export JAVA_HOME=/home/hadoop/jdk1.7.0_79
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=$JAVA_HOME/bin:$PATH
############################
export HADOOP_HOME=/home/hadoop/hadoop-2.7.1
export PATH=$HADOOP_HOME/bin:$PATH
export PATH=$HADOOP_HOME/sbin:$PATH
export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH
在這里只需要上半部分就可以,下半部分是給hadoop准備的,編輯完成后用source命令使之生效,在任務路徑下執行java 命令,都可以如下顯示
[node01 ~]$ java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build24.79-b02, mixed mode)
說明在1號中,已經完成java的運行環境的准備工作
2.7、安裝HDFS+HA
HDFS是通過分布的集群來存儲文件的,存儲的文件被切成一塊一塊的block,存儲文件的block存放在若干台datanode上的,映射關系由namenode進行管理,每一個block在集群中存儲多個副本。前面講到過,使用JournalNode來確保主備NameNode的數據同步,由Zookeeper來解決ResourceManager的單一故障點問題。
2.7.1、安裝配置zookeeper集群
zookeeper是google的chubby一個開源的實現,是hadoop分布式協調服務,chubby是一種為了實現mapreduce或bigdata而構建的內部的工具。zookeeper首先是一個集群,提供少量數據的儲存和管理,zookeeper不能存業務數據,只能存儲狀態信息,zookeeper由奇數個節點組成,每個節點的角色分Fllower、Leader兩種,Leader為主節點,負責寫操作,當超過一半的節點操作成功,就認為本次操作成功,擔任什么角色不是事先分配,啟動時各個節點地位平等,至於擔任什么角色通過選舉機制決定
2.7.1.1 在5號機上運行,解壓 tar-zxvf zookeeper-3.4.9.tar.gz
2.7.1.2 修改配置
cd ./zookeeper-3.4.9/conf/
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
$ cat zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting anacknowledgement
syncLimit=5
# the directory where the snapshot isstored.
# do not use /tmp for storage, /tmp here isjust
# example sakes.
#dataDir=/tmp/zookeeper
dataDir=/home/hadoop/zookeeper-3.4.9/data
# the port at which the clients willconnect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle moreclients
#maxClientCnxns=60
#
# Be sure to read the maintenance sectionof the
# administrator guide before turning onautopurge.
#
#http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain indataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable autopurge feature
#autopurge.purgeInterval=1
server.5=node05:11605:11615
server.6=node06:11605:11615
server.7=node07:11605:11615
紅色部為修改的部分
然后創建一個data文件夾
mkdir ./zookeeper-3.4.9/data
再創建一個空文件
touch ./zookeeper-3.4.9/data/myid
最后向該文件寫入ID
echo 5 > ./zookeeper-3.4.9/data/myid
2.7.1.3將配置好的zookeeper拷貝到其他節點(node06、node07)
scp -r /home/hadoop/zookeeper-3.4.5/ node06:/home/hadoop/
scp -r /home/hadoop/zookeeper-3.4.5/ node07:/home/hadoop/
注意:修改node06、node07對應/home/hadoop/zookeeper-3.4.9/data/myid內容
node06:
echo 6 > /home/hadoop/zookeeper-3.4.9/data/myid
node07:
echo 7 > /home/hadoop/zookeeper-3.4.9/data/myid
2.7.1.4 啟動測試zookeeper集群
$ pwd
/home/hadoop/zookeeper-3.4.9/bin
./zkServer.sh start
#查看狀態:一個leader,兩個follower
./zkServer.sh status
$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config:/home/hadoop/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: follower
2.7.2 安裝配置hadoop集群(在1號機上操作)
2.7.2.1 解壓在目錄/home/hadoop/下運行tar -zxvf hadoop-2.7.1.tar.gz
2.7.2.2 配置HDFS的環境變量,在/etc/profile下增加
export HADOOP_HOME=/home/hadoop/hadoop-2.7.1
export PATH=$HADOOP_HOME/bin:$PATH
export PATH=$HADOOP_HOME/sbin:$PATH
export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH
或是
export JAVA_HOME=/home/hadoop/jdk1.7.0_79
export HADOOP_HOME=/home/hadoop/hadoop-2.7.1
exportPATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
2.7.2.3 進入hadoop的配置目錄/home/hadoop/hadoop-2.7.1/etc/hadoop
編輯hadoop-env.sh
export JAVA_HOME=/home/hadoop/jdk1.7.0_79
2.7.2.4 編輯core-site.xml
$cat core-site.xml
<?xml version="1.0"encoding="UTF-8"?>
<?xml-stylesheettype="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the"License");
youmay not use this file except in compliance with the License.
Youmay obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS"BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Seethe License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific propertyoverrides in this file. -->
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1/</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop-2.7.1/tmp</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>node05:2181,node06:2181,node07:2181</value>
</property>
</configuration>
2.7.2.5編輯hdfs-site.xml
cat hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice為ns1,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!--ns1下面有兩個NameNode,分別是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!--nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>node01:9000</value>
</property>
<!--nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>node01:50070</value>
</property>
<!--nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>node02:9000</value>
</property>
<!--nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>node02:50070</value>
</property>
<!--指定NameNode的元數據在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node05:8485;node06:8485;node07:8485/ns1</value>
</property>
<!--指定JournalNode在本地磁盤存放數據的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/hadoop-2.7.1/journaldata</value>
</property>
<!--開啟NameNode失敗自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--配置失敗自動切換實現方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!--使用sshfence隔離機制時需要ssh免登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!--配置sshfence隔離機制超時時間 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
如果是直接復制以上配置,需要將中文注釋刪除。
2.7.2.6 編輯mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>node01:9001</value>
</property>
<property>
<name>mapred.map.tasks</name>
<value>20</value>
</property>
<property>
<name>mapred.reduce.tasks</name>
<value>4</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>node01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node01:19888</value>
</property>
</configuration>
2.7.2.7 編輯 yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node03</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node04</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node05:2181,node06:2181,node07:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
2.7.2.8修改slaves(slaves是指定子節點的位置,因為要在node01上啟動HDFS、在node03啟動yarn,所以node01上的slaves文件指定的是datanode的位置,node03上的slaves文件指定的是nodemanager的位置)
[node01 hadoop]$ cat slaves
#localhost
node05
node06
node07
[node03]$ cat slaves
#localhost
node05
node06
node07
2.7.2.9 將配置好的hadoop拷貝到其它節點
scp -r hadoop-2.7.1/ node02:/home/hadoop/
scp -r hadoop-2.7.1/ node03:/home/hadoop/
其它幾個節點類似
同時也要把 /etc/profile /etc/hosts 兩個文件復制到所有節點機上
2.7.2.10 hadoop格式化
在1號上執行 hdfs namenode -fromat,注意格式化后會在根據core-site.xml中的hadoop.tmp.dir配置生成個文件,/home/hadoop/hadoop-2.7.1/tmp,然后將/home/hadoop/hadoop-2.7.1/tmp拷貝到2號機的/home/hadoop/hadoop-2.7.1/下。
scp-r tmp/ node02:/home/hadoop/hadoop-2.7.1/
如果首次格式化失敗,重新格式化需要執行一下命令:
hdfs namenode -format -force
2.8、HA部分
2.8.1 啟動 zookeeper集群
分別在node05、node06、node07上運行
/home/hadoop/zookeeper-3.4.9/bin/zkServer.sh start
查看狀態
./zkServer.sh status
2.8.2 啟動journalnode
分別在node05、node06、node07上運行
/home/hadoop-2.7.1/sbin ./hadoop-daemon.sh start journalnode
運行jps命令檢驗,node05、node06、node07上多了JournalNode進程
2.8.3格式化ZKFC,在node01上執行
hdfs zkfc -formatZK
2.8.4 啟動HDFS,noded01上執行
sbin/start-dfs.sh
運行jps命令檢驗
2.8.5啟動YARN(#####注意#####:是在node03上執行start-yarn.sh,把namenode和resourcemanager分開是因為性能問題,因為他們都要占用大量資源,所以把他們分開了,他們分開了就要分別在不同的機器上啟動)
sbin/start-yarn.sh
運行jps命令檢驗
2.8.6測試HDFS
hadoop-2.7.1配置完畢,可以統計瀏覽器訪問:
http://192.168.1.1:50070
NameNode'node01:9000' (active)
http://192.168.1.2:50070
NameNode'node2:9000' (standby)
驗證HDFS HA
首先向hdfs上傳一個文件
hadoopfs -put /etc/profile /profile
hadoopfs -ls /
然后再kill掉active的NameNode
kill-9 <pid of NN>
通過瀏覽器訪問:http://192.168.1.2:50070
NameNode'node02:9000' (active)
這個時候node02上的NameNode變成了active
在執行命令:
hadoopfs -ls /
-rw-r--r-- 3 root supergroup 1926 2014-02-06 15:36 /profile
剛才上傳的文件依然存在!!!
手動啟動那個掛掉的NameNode
sbin/hadoop-daemon.sh start namenode
通過瀏覽器訪問:http://192.168.1.1:50070
NameNode'node01:9000' (standby)
驗證YARN:
運行一下hadoop提供的demo中的WordCount程序:
hadoopjar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar wordcount/profile /out,這個試驗還沒有做
測試集群工作狀態的一些指令:
bin/hdfs dfsadmin -report 查看hdfs的各節點狀態信息
bin/hdfs haadmin -getServiceState nn1 獲取一個namenode節點的HA狀態
sbin/hadoop-daemon.sh start namenode 單獨啟動一個namenode進程
./hadoop-daemon.sh start zkfc 單獨啟動一個zkfc進程
三、hive+mysql 的安裝與配置
在7號機上運行,hive依賴hdfs,注意要先啟動zookeeper,hive本質上翻譯工具,本次搭建用mysql來管理元數據
下載 apache-hive-2.1.1-bin.tar.gz
tar -zxvf apache-hive-2..1.1.tar.gz
cp hive-default.xml.template hive-site.xml
vi hive-site.xml
<?xml version="1.0"encoding="UTF-8" standalone="no"?>
<?xml-stylesheettype="text/xsl" href="configuration.xsl"?><!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except incompliance with
the License. You may obtain acopy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS"BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
--><configuration>
<!-- WARNING!!! This file is auto generated for documentationpurposes ONLY! -->
<!-- WARNING!!! Any changes you make to this file will be ignored byHive. -->
<!-- WARNING!!! You must make your changes in hive-site.xmlinstead. -->
<!-- Hive Execution Parameters -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.1.7:3306/hive?useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hadoop111</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
<description>
Enforce metastore schema version consistency.
True: Verify that version information stored in metastore matches withone from Hive jars. Also disableautomatic
schema migration attempt. Users are required to manully migrate schemaafter Hive upgrade which ensures
proper metastore schema migration. (Default)
False: Warn if the version information stored in metastore doesn't matchwith one from in Hive jars.
</description>
</property>
<property>
<name>hive.querylog.location</name>
<value>/home/hive/hive-2.1.1/iotmp/${user.name}</value>
<description>Location of Hive run time structured log file</description>
</property>
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/home/hive/hive-2.1.1/iotmp/${user.name}/operation_logs</value>
<description>Top level directory where operation logs are stored if logging functionality is enabled</description>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/home/hive/hive-2.1.1/iotmp/${user.name}</value>
<description>Local scratch space for Hive jobs</description>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/home/hive/hive-2.1.1/iotmp/${hive.session.id}_resources</value>
<description>Temporary local directory for added resources in the remote file system.</description>
</property>
</configuration>
在/home/hive/hive-2.1.1下新建一個文件夾iotmp
注意配置文件中需要指定使用mysql來管理metastore.db,指定驅動,指定mysql 的用戶名和密碼
如果報com.mysql.jdbc.Driver找不到的錯誤,請下載
sudo yum install mysql-connector-java
編輯hive-env.sh
cp hive-env.sh.template hive-env.sh
vi hive-env.sh
在尾部加上
export HADOOP_HOME=/home/hadoop/hadoop-2.7.1
#export HIVE_HOME=/home/hadoop/hive
export HIVE_CONF_DIR=/home/hadoop/hive/conf
export HIVE_AUX_JARS_PATH=/home/hadoop/hive/lib
手動創建hive數據庫
對mysql 進行連接測試
schematool -initSchema -dbType mysql
運行 ./hive
注意要確認mysql開啟遠程登錄
四、hbase安裝
下載hbase-1.2.4-bin.tar.gz
解壓、釋放
配置hbase集群,要修改3個文件(首先zk集群已經安裝好了)
注意:要把hadoop的hdfs-site.xml和core-site.xml 放到hbase/conf下,這是因為hbase要使用hdfs客戶端的API,要調用配置文件
修改hbase-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_79
//告訴hbase使用外部的zk
export HBASE_MANAGES_ZK=false
vim hbase-site.xml
<configuration>
<!-- 指定hbase在HDFS上存儲的路徑 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://ns1/hbase</value>
</property>
<!-- 指定hbase是分布式的 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定zk的地址,多個用“,”分割 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop-node5:2181,hadoop-node6:2181,hadoop-node7:2181</value>
</property>
</configuration>
vim regionservers
hadoop-node5
hadoop-node6
hadoop-node7
拷貝hbase到其他節點
scp -r hbase-1.2.4/hadoop-node3:/home/hadoop/
350 scp -r hbase-1.2.4/ hadoop-node4:/home/hadoop/
359 scp -r hbase-1.2.4/ hadoop-node0x05:/home/hadoop/
363 scp -r hbase-1.2.4/ hadoop-node0x05:/home/hadoop/
364 scp -r hbase-1.2.4/ hadoop-node0x06:/home/hadoop/
365 scp -r hbase-1.2.4/ hadoop-node0x07:/home/hadoop/
將配置好的HBase拷貝到每一個節點並同步時間。
啟動所有的hbase
分別啟動zk
./zkServer.sh start
啟動hbase集群
start-dfs.sh
啟動hbase,在主節點上運行:
start-hbase.sh
通過瀏覽器訪問hbase管理頁面
http://hadoop-node3:16010/master-status
為保證集群的可靠性,要啟動多個HMaster
hbase-daemon.sh start master
測試,3、4號機運行jps后,應該有三個進程
16783 HMaster
19535 Jps
3905 ResourceManager
5、6、7號機運行jps應該有五個進程
$ jps
17101 QuorumPeerMain
5497 Jps
5314 HRegionServer
26076 DataNode
26210 NodeManager
25994 JournalNode
注意,同步時間也很重要,下面是由於沒有同步時間造成的錯誤
ERROR [B.defaultRpcServer.handler=0,queue=0,port=16000] master.MasterRpcServices: Region server hadoop-
node7,16020,1488528679958 reported a fa
tal error:
ABORTING region server hadoop-node0x07,16020,1488528679958: Unhandled:
org.apache.hadoop.hbase.ClockOutOfSyncException: Server hadoop-node0x07,16020,1488528679958 has be
en rejected; Reported time is too far out of sync with master. Time difference of 30475ms > max allowed of 30000ms
at org.apache.hadoop.hbase.master.ServerManager.checkClockSkew(ServerManager.java:409)
at org.apache.hadoop.hbase.master.ServerManager.regionServerStartup(ServerManager.java:275)
at org.apache.hadoop.hbase.master.MasterRpcServices.regionServerStartup(MasterRpcServices.java:361)
at org.apache.hadoop.hbase.protobuf.generated.RegionServerStatusProtos$RegionServerStatusService
$2.callBlockingMethod(RegionServerStatusProtos.java:8615)
at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2180)
at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:112)
at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:133)
at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:108)
at java.lang.Thread.run(Thread.java:745)
Cause:
org.apache.hadoop.hbase.ClockOutOfSyncException: org.apache.hadoop.hbase.ClockOutOfSyncException: Server hadoop-
node0x07,16020,1488528679958 has been rejected; Reported
time is too far out of sync with master. Time difference of 30475ms > max allowed of 30000ms
at org.apache.hadoop.hbase.master.ServerManager.checkClockSkew(ServerManager.java:409)
at org.apache.hadoop.hbase.master.ServerManager.regionServerStartup(ServerManager.java:275)
at org.apache.hadoop.hbase.master.MasterRpcServices.regionServerStartup(MasterRpcServices.java:361)
at org.apache.hadoop.hbase.protobuf.generated.RegionServerStatusProtos$RegionServerStatusService
$2.callBlockingMethod(RegionServerStatusProtos.java:8615)
at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2180)
at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:112)
at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:133)
at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:108)
at java.lang.Thread.run(Thread.java:745)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
運行ntpdate后解決問題
五機架感知
Rack awareness 機架感知
1、什么是機架感知,hadoop的策略是什么
這是Hadoop的機架感知機制。
機架感知(RackAwareness)
通常,大型Hadoop集群會分布在很多機架上。在這種情況下,
-- 希望不同節點之間的通信能夠盡量發生在同一個機架之內,而不是跨機架。
-- 為了提高容錯能力,名稱節點會盡可能把數據塊的副本放到多個機架上。
綜合考慮這兩點的基礎上Hadoop設計了機架感知功能。
機架感知設計思想
首先,一個重要的假設前提是HDFS運行於一個具有樹狀網絡拓撲結構的集群上。
例如集群由多個數據中心組成,每個數據中心里有多個機架,而每個機架上有多台計算機(數據節點)

網絡拓撲(NetworkTopology)
在Hadoop里,以類似於一種文件目錄結構的方式來表示節點。
例如,R1的位置可以表示為 /D1/R1,而H12的位置可以表示為 /D2/R4/H12。
當數據節點啟動的時候,需要通過一種機制來明確它在集群中的位置,才能構建完整的網絡拓撲圖。
因此,首先它需要確認它的上級節點(通常也就是機架)的位置。數據節點程序支持選項”-p<id>”或”-parent<id>”從命令行讀入上級節點位置。
如果沒有指定這個選項,那么會使用一個默認的上級節點。
至於如何獲取上級節點信息,由實施Hadoop的機構自行決定。一個常用的做法是使用腳本打印當前機器的上級節點信息到標准輸出stdout。
這樣數據節點啟動的時候就可以獲取到上級節點的信息(Hadoop應該是通過接口’DNSToSwitchMapping’來解析這個信息,具體請參考手冊的Class說明)。
數據節點會把它的位置信息發給名稱節點。
當名稱節點收到數據節點的位置信息以后,它會先檢查網絡拓撲中是否已經有這個數據節點的記錄。
如果有,它會把舊的記錄刪除,加入新的節點位置信息。
副本放置(ReplicaPlacement)
數據塊的副本放置策略的目的是在以下兩者之間取得平衡:
-- 使數據的可靠性和可用性最大化
-- 使寫入數據產生的開銷最小化
因此,當一個新的數據塊被創建的時候,遵循以下規則:
-- 第1個副本放置於本地節點
-- 第2個副本放置於不同的機架
-- 第3個副本放置於本地機架的不同節點
-- 其余的副本在遵循以下限制的前提下隨機放置
-- 1個節點最多放置1個副本
-- 如果副本數少於2倍機架數,不可以在同一機架放置超過2個副本
當重新復制一個數據塊的時候,遵循以下規則:
-- 如果已有1個副本,把第2個副本放置在不同的機架
-- 如果已有2個副本且處於同一機架,把第3個副本放置在不同的機架
-- 如果已有2個副本但不處於同一機架,把第3個副本放置在和第1個副本相同的機架
-- 當可用副本數超過2個的時候,隨機放置
當發生數據讀取的時候,名稱節點首先檢查客戶端是否位於集群中。
如果是的話,就可以按照由近到遠的優先次序決定由哪個數據節點向客戶端發送它需要的數據塊。
也就是說,對於擁有同一數據塊副本的節點來說,在網絡拓撲中距離客戶端近的節點會優先響應
2、編輯hadoop的配置文件 core-site.xml
<property>
<name>net.topology.script.file.name</name>
<value>/home/hadoop/hadoop-2.7.1/rack.py</value>
</property>
其中rack.py可以采有其它編程語言,例如shell,c等,路徑也可改變,但要注意權限問題
3、在指定目錄下編輯rack.py
#!/usr/bin/python
import sys
if sys.argv[1]=="192.168.137.13":
print "/hadoop-rackA"
elif sys.argv[1]=="192.168.137.14":
print "/hadoop-rackB"
elif sys.argv[1]=="192.168.137.15":
print "/hadoop-rackB"
else:
print "/default-rack"
保存后,加上執行權限
4、測試
stop-dfs.sh
start-dfs.sh
hdfs dfsadmin -printTopology
[hadoop@hadoop-namenode hadoop]$ hdfs dfsadmin -printTopology
Rack: /hadoop-rackA
192.168.137.13:50010 (hadoop-datanode1)
Rack: /hadoop-rackB
192.168.137.14:50010 (hadoop-datanode2)
192.168.137.15:50010 (hadoop-datanode3)
原文地址:https://blog.csdn.net/lepton126/article/details/60866664
