集羣HBase搭建
###集羣規劃###
首先是網絡狀況規劃,本次實戰咱們的集羣是一個master,兩個slave,以下圖:html
###材料列表###
把搭建一個hbase環境所需的全部材料列出來,以下表:java
軟件 | 版本 |
---|---|
OpenSSH | 5.3 |
jdk | 1.8 |
hadoop | 2.7.4 |
hbase | 1.2.6 |
zookeeper | 3.4.6 |
PS:文中用到的文件主要有如下這些,我已經上傳到github上:node
- docker鏡像對應的dockerfile,以及製做鏡像所需的材料;
- zookeeper-3.4.6;
- hadoop-2.7.4;
- hbase-1.2.6;
github的地址是:https://github.com/zq2599/zookeeper3.4.6-hadoop2.7.4-hbase-1.2.6git
###搭建步驟徹底列表###
先在此將整個搭建過程的每一步都列出來,以避免遺漏:github
- 啓動三個centos6.7鏡像的容器,容器名分別是:master、slave一、slave2;
- 給master、slave一、slave2分別安裝ssh服務;
- 從當前電腦經過scp命令將jdk1.8的安裝包上傳到三個容器,而後依次安裝jdk1.8;
- 配置hostname,編輯三個容器的/etc/sysconfig/network文件,修改HOSTNAME分別是master、slave一、slave2;
- 配置host,經過ip addr命令取得三個容器的ip,而後修改每一個/etc/hosts文件,都添加以下內容:
172.18.0.2 master
172.18.0.3 slave1
172.18.0.4 slave2 - master、slave一、slave2之間配置相互免密碼登陸:sshd_config、authorized_keys、id_rsa.pub文件;
- master、slave一、slave2上安裝zookeeper-3.4.6集羣,並啓動;
- 配置java和Hadoop環境變量:/etc/profile、hadoop-env.sh、yarn-env.sh;
- 修改hadoop相關配置文件:core-site.xml、hdfs-site.xml、mapred-site.xml、mapred-site.xml;
- 修改hadoop的slave配置:etc/hadoop/slaves;
- 保證以上的hadoop配置在三個容器上是一致的;
- 啓動hadoop,驗證;
- 修改/etc/profile,配置hbase;
- 配置hbase-site.xml、regionservers、hbase-env.sh;
- 啓動hbase,驗證;
###本次實戰用到的鏡像文件###
本次實戰用到的鏡像文件是我定製的,爲了加快實戰速度,裏面集成了以下功能:web
- 已經安裝了jdk1.8;
- ssh服務已經開通,能夠root身份登陸,密碼是password
- 可經過rsa證書免密碼ssh登陸;
執行如下命令便可下載該鏡像文件:docker
docker pull bolingcavalry/centos6.7-jdk1.8-ssh:0.0.1
這個鏡像已經包含了前面總結的14個步驟中的第二步和第三步,接下來的實戰中這兩部能夠省略了。shell
###製做docker-compose.yml文件###
新增一個docker-compose.yml文件,內容以下:apache
version: '2' services: master: image: bolingcavalry/centos6.7-jdk1.8-ssh:0.0.1 container_name: master ports: - "19010:22" - "50070:50070" - "8088:8088" - "16010:16010" restart: always slave1: image: bolingcavalry/centos6.7-jdk1.8-ssh:0.0.1 container_name: slave1 depends_on: - master ports: - "19011:22" restart: always slave2: image: bolingcavalry/centos6.7-jdk1.8-ssh:0.0.1 container_name: slave2 depends_on: - slave1 ports: - "19012:22" restart: always
如上述內容,咱們會建立master、slave一、slave2三個容器,它們的22端口分別映射到當前電腦的190十、190十一、19012三個端口上;centos
在docker-compose.yml文件所在目錄下執行docker-compose up -d命令,便可建立三個容器,以下圖:
###ssh登陸###
因爲master的22端口已經映射到19010端口,因此在當前電腦使用ssh工具執行命令ssh root@localhost -p 19010便可登陸到master容器,再執行ip addr便可查看master的ip,以下圖:
同理,再執行ssh root@localhost -p 19011和ssh root@localhost -p 19012能夠分別登陸slave1和slave2,而且獲取到他們的ip以下;
容器 | IP |
---|---|
master | 172.18.0.2 |
slave1 | 172.18.0.3 |
slave2 | 172.18.0.4 |
###配置hostname和hosts###
- 修改master的/etc/sysconfig/network文件,將原有的HOSTNAME=localhost.localdomain改爲HOSTNAME=master,對slave1和slave2也作修改,將HOSTNAME分別改爲slave1和slave2;
- 分別修改master、slave一、slave2的/etc/hosts文件,都添加相同的內容以下:
172.18.0.2 master 172.18.0.3 slave1 172.18.0.4 slave2
- 1
- 2
- 3
###master、slave一、slave2之間配置相互免密碼登陸###
- 分別修改master、slave一、slave2的/etc/ssh/sshd_config文件,找到下圖紅框中的兩行,刪除每行的註釋符號"#":
2. 分別在master、slave一、slave2上執行命令ssh-keygen -t rsa,一路回車下去,最終會在/root/.ssh目錄下生成rsa文件,以下圖:
3. 在master上執行以下三行命令,執行完畢後,三個容器的rsa公鑰都存在/root/.ssh/authorized_keys文件中了:
cat ~/.ssh/id_rsa.pub>> ~/.ssh/authorized_keys ssh root@slave1 cat ~/.ssh/id_rsa.pub>> ~/.ssh/authorized_keys ssh root@slave2 cat ~/.ssh/id_rsa.pub>> ~/.ssh/authorized_keys
- 1
- 2
- 3
第一行命令將master的公鑰寫入authorized_keys,第2、第三行分別ssh登陸slave一、slave2,將他們的公鑰寫入到master的authorized_keys文件中,因爲是ssh登陸,須要輸入密碼,這裏是"password"
4. 分別在slave一、slave2上執行如下命令,將master上的authorized_keys文件複製過來:
ssh root@master cat ~/.ssh/authorized_keys>> ~/.ssh/authorized_keys
- 1
因爲master的authorized_keys中包含了slave一、slave2的rsa公鑰,因此在slave1和slave2上執行以上命令的時候是不須要登陸的;
5. 如今三個容器的公鑰都已經放在每個容器上了,它們相互之間能夠免密碼登陸了,例如在slave1上執行ssh root@slave2便可登陸到slave2而不用輸入密碼,以下圖:
千萬注意:在slave1上驗證免密碼登陸slave2後,要執行exit目錄退出slave2,否者後面在該窗口的操做都是在操做slave2,而非slave1!!!
###在容器上建立所需目錄###
分別在master、slave一、slave2上建立如下目錄:
- /usr/local/work
- /opt/hbase
###安裝zookeeper-3.4.6集羣###
- 去zookeeper官網下載zookeeper-3.4.6.tar.gz,而後解壓到當前電腦;
- 在zookeeper-3.4.6/conf/目錄下建立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 an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/usr/local/work/zkdata # the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1 server.1=master:2887:3887 server.2=slave1:2888:3888 server.3=slave2:2889:3889
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
其實也就是修改了dataDir的值,還有最後三行是新增的,其餘內容都是從zoo_sample.cfg複製過來的;
3. 在當前電腦上,用ssh工具執行如下三行命令,將前面解壓的而且已經修改了zoo.cfg文件的zookeeper-3.4.6目錄複製到master、slave一、slave2上去:
scp -P 19010 -r ./zookeeper-3.4.6 root@localhost:/usr/local/work scp -P 19011 -r ./zookeeper-3.4.6 root@localhost:/usr/local/work scp -P 19012 -r ./zookeeper-3.4.6 root@localhost:/usr/local/work
- 1
- 2
- 3
執行每行命令都要輸入密碼"password"
4. 在master、slave一、slave2上建立目錄/usr/local/work/zkdata,在該目錄下建立文件myid,文件內容分別是是"1"、「2」、「3」;
5. 在master、slave一、slave2上依次執行啓動zookeeper的命令/usr/local/work/zookeeper-3.4.6/bin/zkServer.sh start;
6. 在每一個容器上分別執行如下命令能夠檢查zookeeper的集羣狀態:
如上圖所示,此容器目前是follower;
###下載hadoop###
去Hadoop官網下載hadoop-2.7.4.tar.gz,在當前電腦解壓;
###配置hadoop###
打開解壓後的hadoop-2.7.4文件夾,修改如下配置文件:
- 打開hadoop-2.7.4/etc/hadoop/hadoop-env.sh文件,在最前面加入如下內容:
export JAVA_HOME=/usr/java/jdk1.8.0_144
- 1
java環境信息就配置好了;
2. 打開hadoop-2.7.4/etc/hadoop/yarn-env.sh文件,在YARN_CONF_DIR的配置下面加入如下內容:
export JAVA_HOME=/usr/java/jdk1.8.0_144
- 1
以上是給yarn配置java環境信息;
3. 打開hadoop-2.7.4/etc/hadoop/core-site.xml文件,配置以下:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/hbase/hadoop-2.7.4/temp</value> </property> </configuration>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
/opt/hbase/是即將用來安裝hadoop的目錄;
4. 打開hadoop-2.7.4/etc/hadoop/hdfs-site.xml文件,配置以下:
<configuration> <property> <name>dfs.namenode.name.dir</name> <value>/opt/hbase/hadoop-2.7.4/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/opt/hbase/hadoop-2.7.4/dfs/data</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>master:9001</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> </configuration>
是hdfs相關的配置;
5. 打開hadoop-2.7.4/etc/hadoop/mapred-site.xml文件,配置以下:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>master:19888</value> </property> </configuration>
這些是關於mapreduce的配置;
6. 打開hadoop-2.7.4/etc/hadoop/yarn-site.xml文件,配置以下:
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>master:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>master:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>master:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>master:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>master:8088</value> </property> </configuration>
以上是yarn相關配置;
7. 打開hadoop-2.7.4/etc/hadoop/slaves文件,配置以下:
slave1 slave2
以上是配置hadoop集羣時的slave信息;
8. 在當前電腦打開ssh終端,進入hadoop-2.7.4文件夾所在目錄,執行如下三行命令,把包含了咱們剛剛配置好的文件的hadoop-2.7.4文件夾分別複製到master、slave一、slave2容器上去:
scp -P 19010 -r ./hadoop-2.7.4 root@localhost:/opt/hbase/hadoop-2.7.4 scp -P 19011 -r ./hadoop-2.7.4 root@localhost:/opt/hbase/hadoop-2.7.4 scp -P 19012 -r ./hadoop-2.7.4 root@localhost:/opt/hbase/hadoop-2.7.4
每一個命令都要求輸入密碼"password"
###配置hadoop相關環境變量###
在master、slave一、slave2上分別執行以下操做:
- 在/etc/profile文件中添加以下內容:
export JAVA_HOME=/usr/java/jdk1.8.0_144 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin export HADOOP_HOME=/opt/hbase/hadoop-2.7.4 export PATH=$PATH:$HADOOP_HOME/sbin export PATH=$PATH:$HADOOP_HOME/bin export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
以上是hadoop運行所需的環境變量;
2. 執行source /etc/profile使環境變量生效;
###啓動hadoop###
- 在master上執行以下命令格式化hdfs:
/opt/hbase/hadoop-2.7.4/bin/hdfs namenode -format
格式化結果以下圖所示:
2. 在master上執行以下命令啓動hadoop:
/opt/hbase/hadoop-2.7.4/sbin/start-all.sh
啓動信息以下圖所示:
3. 在master上輸入jps看當前全部java進程,以下圖:
上述進程齊全表示hadoop的master啓動成功;
4. 在slave一、slave2上分別輸入jps看當前全部java進程,以下圖:
上述進程齊全表示hadoop的slave啓動成功;
###配置Hbase###
在Hadoop官網下載hbase-1.2.6-bin.tar.gz,在當前電腦解壓後,進入hbase-1.2.6文件夾,修改如下配置:
- 打開hbase-1.2.6/conf/hbase-site.xml,修改配置以下:
<configuration> <property> <name>hbase.rootdir</name> <value>hdfs://master:9000/hbase</value> <description>The directory shared by region servers.</description> </property> <property> <name>hbase.hregion.max.filesize</name> <value>1073741824</value> <description> Maximum HStoreFile size. If any one of a column families' HStoreFiles has grown to exceed this value, the hosting HRegion is split in two. Default: 256M. </description> </property> <property> <name>hbase.hregion.memstore.flush.size</name> <value>1073741824</value> <description> Memstore will be flushed to disk if size of the memstore exceeds this number of bytes. Value is checked by a thread that runs every hbase.server.thread.wakefrequency. </description> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> <description>The mode the cluster will be in. Possible values are false: standalone and pseudo-distributed setups with managed Zookeeper true: fully-distributed with unmanaged Zookeeper Quorum (see hbase-env.sh) </description> </property> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> <description>Property from ZooKeeper's config zoo.cfg. The port at which the clients will connect. </description> </property> <property> <name>zookeeper.session.timeout</name> <value>120000</value> </property> <property> <name>hbase.zookeeper.property.tickTime</name> <value>6000</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>master,slave1,slave2</value> <description>Comma separated list of servers in the ZooKeeper Quorum. For example, "host1.mydomain.com,host2.mydomain.com,host3.mydomain.com". By default this is set to localhost for local and pseudo-distributed modes of operation. For a fully-distributed setup, this should be set to a full list of ZooKeeper quorum servers. If HBASE_MANAGES_ZK is set in hbase-env.sh this is the list of servers which we will start/stop ZooKeeper on. </description> </property> </configuration>
2. 打開hbase-1.2.6/conf/regionservers文件,配置以下:
master slave1 slave23. 打開hbase-1.2.6/conf/hbase-env.sh文件,找到 export JAVA_HOME=/usr/java/jdk1.6.0/這一行,改成當前jdk的路徑: ```shell export JAVA_HOME=/usr/java/jdk1.8.0_144 ``` 以上是hbase的集羣配置; 4. 在當前電腦打開ssh終端,進入hbase-1.2.6文件夾所在目錄,執行如下三行命令,把包含了咱們剛剛配置好的文件的hbase-1.2.6文件夾分別複製到master、slave一、slave2容器上去: ```shell scp -P 19010 -r ./hbase-1.2.6 root@localhost:/opt/hbase-1.2.6 scp -P 19011 -r ./hbase-1.2.6 root@localhost:/opt/hbase-1.2.6 scp -P 19012 -r ./hbase-1.2.6 root@localhost:/opt/hbase-1.2.6 ``` 每一個命令都要求輸入密碼"password"
###配置hbase相關環境變量###
在master、slave一、slave2上分別執行以下操做:
- 在/etc/profile文件中添加以下內容:
export HBASE_HOME=/opt/hbase-1.2.6 export PATH=$HBASE_HOME/bin:$PATH
以上是hbase運行所需的環境變量;
2. 執行source /etc/profile使環境變量生效;
###啓動hbase###
在master上執行start-hbase.sh命令啓動hbase(因爲hbase/bin已經添加到環境變量中,因此start-hbase.sh能夠在任何目錄下執行),啓動信息以下圖所示:
在master上執行jps查看java進程,能夠看到新增的HMaster、HRegionServer進程,以下圖:
在slave一、slave2上執行jps查看java進程,能夠看到新增的HRegionServer進程,以下圖:
###驗證hbase###
執行如下命令,能夠進入HBase的命令行模式:
hbase shell
見到的以下圖所示:
建立個表試試,輸入如下命令建立student表,行鍵是id,一個列族info:
create 'student','id','info'
提示以下圖:
在slave1上執行base shell進入命令行模式,再執行list命令查看錶信息,能夠看到剛剛在master上建立的student表,以下圖:
###web服務驗證###
在docker-compose.yml中咱們暴露了50070,8088,16010三個端口,如今當前電腦的瀏覽器上依次檢查這三個端口對應的web服務:
至此,在docker上搭建集羣HBase的實戰已經完成,文中用到的文件主要有如下這些,我已經上傳到github上:
- docker鏡像對應的dockerfile,以及製做鏡像所需的材料;
- zookeeper-3.4.6;
- hadoop-2.7.4;
- hbase-1.2.6;