分布式存儲和計算高可用HA集群:Hadoop + HBase + Flink

1. 簡述

  1. Hadoop:利用分布式集群實現 大數據文件存儲系統DFSMapReduce計算引擎
  2. HBase:基于Hadoop的DFS系統,實現 非關系型K-V鍵值對 形式存儲的 分布式數據庫
  3. Flink:基于Hadoop的DFS系統或實時輸入流,實現 批量作業處理流式數據處理分布式計算引擎,支持 實時處理

三者關系如下圖所示:
[圖片上傳失敗...(image-e16016-1568608205958)]

注意:由于hadoop、hbase、flink三者之間兼容問題,安裝前要先查好版本匹配情況,確定好匹配版本后再安裝,本文選擇版本情況:hadoop2.8.5 + hbase2.1.6 + flink1.7.2。

本文是在CentOs7系統上,安裝部署Hadoop2.8.5 + HBase2.1.6 + Flink1.7.2,構建大數據分部署存儲和計算引擎的集群系統。

2 JDK安裝

3 SSH免密登錄配置

在4臺CentOs7機器上配置相互之間的SSH免密登錄。

4 zookeeper安裝和驗證

在4臺CentOs7機器上安裝zookeeper,可以直接使用yum安裝。
安裝完后,配置環境變量、zoo.cfg配置文件、myid配置文件即可。

5 Hadoop安裝和驗證

5.1 部署規劃

共4臺CentOs7環境,規劃如下表所示:

機器名 安裝軟件 進程 說明
hadoop01-namenode jdk, zookeeper, hadoop, hbase, flink NameNode, JournalNode, DFSZKFailoverController, ResourceManager Namenode和ResourceManager控制節點,與hadoop02-namenode機器互為主備
hadoop02-namenode jdk, zookeeper, hadoop, hbase, flink NameNode, JournalNode, DFSZKFailoverController, ResourceManager, DataNode, NodeManager Namenode和ResourceManager控制節點,與hadoop01-namenode機器互為主備;Datanode數據存儲節點
hadoop03-datanode jdk, zookeeper, hadoop, hbase, flink DataNode, NodeManager Datanode數據存儲節點
hadoop04-datanode jdk, zookeeper, hadoop, hbase, flink DataNode, NodeManager Datanode數據存儲節點

說明:

  1. 在hadoop01-namenode和hadoop02-namenode兩機器上構建NameNode和ResourceManager的高可用HA,互為主備;
  2. 在Hadoop02-namenode、hadoop03-datanode、hadoop04-datanode三臺機器上做分布式文件存儲;

5.2 版本下載和安裝

說明:Hadoop版本安裝和配置(包括環境變量),僅在其中一臺上操作即可。安裝和配置完成后,整體拷貝到其他三臺機器上。本文中,是在hadoop01-namenode機器上安裝和配置hadoop2.8.5版本的,然后使用scp命令拷貝到其他三臺機器上。

  1. 下載Hadoop2.8.5b版本https://hadoop.apache.org/releases.html
    可直接在CentOs7環境上使用wget命令下載:

    wget https://www-us.apache.org/dist/hadoop/common/hadoop-2.8.5/hadoop-2.8.5.tar.gz 
    
    tar -zxvf ./hadoop-2.8.5.tar.gz -C /hadoop/
    

    使用tar命令解壓至/hadoop/目錄下。

    執行效果如下圖所示:
    在這里插入圖片描述
  2. 配置環境變量

      vi /etc/profile
      
      source /etc/profile
    

    /etc/profile環境變量中增加如下

      export HADOOP_HOME=/hadoop/hadoop-2.8.5/
      
      export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$HADOOP_HOME/lib:$ZOOKEEPER_HOME/bin
    

    命令執行效果圖如下所示:


    在這里插入圖片描述

5.3 配置文件修改

  1. 修改配置文件$HADOOP_HOME/etc/hadoop/core-site.xml

    <configuration>
       <property>
           <name>fs.defaultFS</name>
           <value>hdfs://mycluster</value>
       </property>
       <property>
           <name>hadoop.tmp.dir</name>
           <value>/hadoop/hadoop-2.8.5/tmp</value>
       </property>
       <property>
       <name>ha.zookeeper.quorum</name>
       <value>hadoop01-namenode:2181,hadoop02-namenode:2181,hadoop03-datanode:2181,hadoop04-datanode:2181</value>
       </property>
    </configuration>
    

    注意:該配置文件中涉及的/hadoop/hadoop-2.8.5/tmp文件夾要手工創建出來。

  2. 修改配置文件$HADOOP_HOME/etc/hadoop/hdfs-site.xml

      <configuration>
        <property>
            <name>dfs.replication</name>
            <value>2</value>
        </property>
        <property>
            <name>dfs.datanode.data.dir</name>
            <value>/hadoop/hadoop-2.8.5/data</value>
        </property>
        <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>hadoop01-namenode:8020</value>
        </property>
        <property>
          <name>dfs.namenode.rpc-address.mycluster.nn2</name>
          <value>hadoop02-namenode:8020</value>
        </property>
        <property>
          <name>dfs.namenode.http-address.mycluster.nn1</name>
          <value>hadoop01-namenode:9870</value>
        </property>
        <property>
          <name>dfs.namenode.http-address.mycluster.nn2</name>
          <value>hadoop02-namenode:9870</value>
        </property>
        <property>
          <name>dfs.namenode.shared.edits.dir</name>
          <value>qjournal://hadoop01-namenode:8485;hadoop02-namenode:8485/mycluster</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</value>
        </property>
        <property>
              <name>dfs.ha.fencing.ssh.private-key-files</name>
              <value>/root/.ssh/id_rsa</value>
        </property>
        <property>
          <name>dfs.journalnode.edits.dir</name>
          <value>/hadoop/hadoop-2.8.5/journalnode</value>
        </property>
        <property>
           <name>dfs.ha.automatic-failover.enabled</name>
           <value>true</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
             shell(/bin/true)
           </value>
         </property>
         <property>
             <name>dfs.ha.fencing.ssh.private-key-files</name>
             <value>/root/.ssh/id_rsa</value>
         </property>
         <property>
             <name>dfs.ha.fencing.ssh.connect-timeout</name>
             <value>30000</value>
         </property>
    </configuration>
    

    注意:該配置文件中涉及的/hadoop/hadoop-2.8.5/data、journalnode文件夾要手工創建出來。

  1. 修改配置文件$HADOOP_HOME/etc/hadoop/mapred-site.xml

        <configuration>
         <property>
             <name>mapreduce.framework.name</name>
             <value>yarn</value>
         </property>
         <property>
             <name>yarn.app.mapreduce.am.env</name>
             <value>HADOOP_MAPRED_HOME=/hadoop/hadoop-2.8.5</value>
         </property>
         <property>
             <name>mapreduce.map.env</name>
             <value>HADOOP_MAPRED_HOME=/hadoop/hadoop-2.8.5</value>
         </property>
         <property>
             <name>mapreduce.reduce.env</name>
             <value>HADOOP_MAPRED_HOME=/hadoop/hadoop-2.8.5</value>
         </property>
         <property>
            <name>mapreduce.application.classpath</name>
            <value>/hadoop/hadoop-2.8.5/share/hadoop/mapreduce/*, /hadoop/hadoop-2.8.5/share/hadoop/mapreduce/lib/*</value>
         </property>
     </configuration>
    
  2. 修改配置文件$HADOOP_HOME/etc/hadoop/yarn-site.xml

    <configuration>
      <property>  
         <name>yarn.resourcemanager.ha.enabled</name>  
         <value>true</value>  
      </property>
      <property>
          <name>yarn.nodemanager.aux-services</name>
          <value>mapreduce_shuffle</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>hadoop01-namenode</value>  
      </property>  
      <property>  
         <name>yarn.resourcemanager.hostname.rm2</name>  
         <value>hadoop02-namenode</value>  
      </property>
      <property>  
         <name>yarn.resourcemanager.zk-address</name>  
         <value>hadoop01-namenode:2181,hadoop02-namenode:2181,hadoop03-datanode:2181,hadoop04-datanode:2181</value>  
      </property> 
      <property>
          <name>yarn.resourcemanager.address.rm1</name>
          <value>hadoop01-namenode:8032</value>
      </property>
      <property>
          <name>yarn.resourcemanager.scheduler.address.rm1</name>
          <value>hadoop01-namenode:8030</value>
      </property>
      <property>
          <name>yarn.resourcemanager.webapp.address.rm1</name>
          <value>hadoop01-namenode:8088</value>
      </property>
      <property>
          <name>yarn.resourcemanager.address.rm2</name>
          <value>hadoop02-namenode:8032</value>
      </property>
      <property>
          <name>yarn.resourcemanager.scheduler.address.rm2</name>
          <value>hadoop02-namenode:8030</value>
      </property>
      <property>
          <name>yarn.resourcemanager.webapp.address.rm2</name>
          <value>hadoop02-namenode:8088</value>
      </property>
      <property>
          <name>yarn.nodemanager.vmem-check-enabled</name>
          <value>false</value>
      </property>
      <property>
      <name>yarn.nodemanager.resource.cpu-vcores</name>
      <value>8</value>
      </property>
      <property>
          <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
          <value>false</value>
       </property>
    </configuration>    
    
  3. 修改配置文件$HADOOP_HOME/etc/hadoop/slaves

    hadoop02-namenode
    hadoop03-datanode
    hadoop04-datanode
    
  4. 修改配置文件$HADOOP_HOME/etc/hadoop/yarn-env.sh、hadoop-env.sh
    增加下面配置項:

    export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-0.el7_6.x86_64
    export YARN_RESOURCEMANAGER_USER=root
    export HADOOP_SECURE_DN_USER=root
    export YARN_NODEMANAGER_USER=root
    

5.4 安裝同步到其他三臺機器上

  1. 將環境變量/etc/profile和安裝配置好的hadoop2.8.5版本拷貝至其他3臺CentOs7環境上:

    scp /etc/profile root@hadoop02-namenode:/etc/
    scp /etc/profile root@hadoop03-datenode:/etc/
    scp /etc/profile root@hadoop04-datenode:/etc/
     
     
    scp -r /hadoop/hadoop-2.8.5/ root@hadoop02-namenode:/hadoop/
    scp -r /hadoop/hadoop-2.8.5/ root@hadoop03-datanode:/hadoop/
    scp -r /hadoop/hadoop-2.8.5/ root@hadoop04-datanode:/hadoop/
    

    `注意:1. 為集群部署方便,集群中的所有機器環境上,jdk、zookeeper、hadoop軟件安裝目錄要保持一致。

    1. 環境變量拷貝主其他機器上后,需要在相應機器上執行source命令使之即可生效。`

5.4 啟動和驗證Hadoop

  1. 啟動zookeeper
    在集群全部機器上都啟動zookeeper:

    cd /usr/lib/zookeeper/bin
    ./zkServer.sh start
       
    ./zkServer.sh status
       
    

    命令執行效果如下截圖所示:


    在這里插入圖片描述
  2. 啟動JournalNode,對NameNode和ZK進行格式化
    A首先,啟動JournalNode進程:
    JournalNode規劃在hadoop01-namenode和hadoop02-namenode上,故需要在這兩個節點上都分別啟動JournalNode,以便能進行Namenode格式化:

    cd /hadoop/hadoop-2.8.5/sbin/
    ./hadoop-daemon.sh start journalnode
    

    如下截圖所示:
    [圖片上傳失敗...(image-aa6e3b-1568608205959)]
    B然后,對Namenode元數據進行格式化:

    cd /hadoop/hadoop-2.8.5/sbin/
    hdfs namenode -format
    

    格式化執行過程中,會有兩次確認Y/N,全部輸入Y回車即可。
    注意:namenode格式化在其中一臺機器上執行即可,本例中式在hadoop01-namenode機器上執行。執行完成后,在$HADOOP_HOME/tmp命令下生成集群DFS相關標識信息,使用scp命令將該目錄拷貝至其他三臺機器相同目錄下。

    scp -r /hadoop/hadoop-2.8.5/tmp/ root@hadoop02-namenode:/hadoop/hadoop-2.8.5/
    scp -r /hadoop/hadoop-2.8.5/tmp/ root@hadoop03-datanode:/hadoop/hadoop-2.8.5/
    scp -r /hadoop/hadoop-2.8.5/tmp/ root@hadoop04-datanode:/hadoop/hadoop-2.8.5/
    

    命令執行如下圖所示:


    在這里插入圖片描述

    C最后,格式化zk:

    cd /hadoop/hadoop-2.8.5/sbin/
    hdfs zkfc -formatZK
    

    注意:本步驟中的對Namenode和ZK格式化,僅在版本安裝后操作一次即可,以后正常啟動Hadoop時,不要進行此操作,否則會導致之前存儲的DFS數據丟失!!!正常使用情況下,只要依次執行start-dfs.sh和start-yarn.sh啟動腳本即可。

  3. 啟動并驗證分布式文件系統DFS
    A首先,啟動dfs分布式文件系統

    cd /hadoop/hadoop-2.8.5/sbin/
    ./start-dfs.sh
    

    命令執行效果如下截圖所示:


    在這里插入圖片描述

    B然后,訪問DFS的web管理頁面:http://http://10.141.212.140:9870

    在這里插入圖片描述

    在這里插入圖片描述

    C最后,使用HDFS命令,驗證文件上傳、下載、查看等操作:

    hdfs dfs -ls hdfs://mycluster/
    hdfs dfs -mkdir hdfs://mycluster/data
    hdfs dfs -ls hdfs://mycluster/
    hdfs dfs -put /usr/zhang0908/testhdfs/wordcount/words hdfs://mycluster/data/words
    hdfs dfs -cat hdfs://mycluster/data/words
    

    如下截圖所示:


    在這里插入圖片描述

    至此,Hadoop的分布式文件系統DFS安裝和啟動成功。

  4. 啟動并驗證YARN MapReduce分布式計算引擎

    A首先,啟動yarn:

    cd /hadoop/hadoop-2.8.5/sbin/
    ./start-yarn.sh
    

    命令執行效果如下圖所示:
    [圖片上傳失敗...(image-365cf0-1568608205959)]
    注意:在hadoop2.8.5版本中,ResourceManager不會自動在所有相關機器上啟動,需要到hadoop02-namenode機器上手工執行如上同樣的start-yarn.sh腳本來啟動ResourceManager任務管理進程。

    B然后,文Yarn任務管理頁面:http://10.141.212.140:8088


    在這里插入圖片描述

    C最后,使用HDFS命令,驗證Yarn分布式計算:
    以Hadoop自帶的單詞數量統計為例,執行啟動單詞統計任務的shell腳本如下:

     hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar wordcount hdfs://mycluster/data/words hdfs://mycluster/data/result/
    

    啟動和單詞統計任務的執行效果過程如下圖所示:

    在這里插入圖片描述

    查看單詞統計任務的執行結果:
    在這里插入圖片描述

    至此,如果僅僅要用Hadoop的分布式文件系統DFS和Hadoop自帶的Yarn-MapReduce分部式計算引擎,到這里就結束了,不需要進行下面的HBase分布式數據庫和Flink流式計算引擎的安裝操作。

6 HBase安裝和驗證

HBase分布式數據庫,是以Hadoop的分布式文件系統DFS為基礎的,所以,使用HBase前提需要安裝并啟動Hadoop的分布式文件系統DFS。

6.1 部署規劃

共4臺CentOs7環境,規劃如下表所示:

機器名 安裝軟件 進程 說明
hadoop01-namenode jdk, zookeeper, hadoop, hbase QuorumPeerMain, HMaster,
hadoop02-namenode jdk, zookeeper, hadoop, hbase QuorumPeerMain, HMaster, HRegionServer
hadoop03-datanode jdk, zookeeper, hadoop, hbase QuorumPeerMain, HRegionServer
hadoop04-datanode jdk, zookeeper, hadoop, hbase QuorumPeerMain, HRegionServer

說明:

  1. 在hadoop01-namenode和hadoop02-namenode兩機器上構建HMaster主備高可用HA;
  2. 在Hadoop02-namenode、hadoop03-datanode、hadoop04-datanode三臺機器上做基于DFS的數據存儲節點;

6.2 下載及安裝

注意,HBase與Hadoop有版本兼容問題,安裝前先確認下與之匹配的版本:
http://hbase.apache.org/book.html#configuration

本文選擇的是與hadoop2.8.5版本兼容配套的hbase2.1.6版本,
下載地址:https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.1.6/hbase-2.1.6-bin.tar.gz

在hadoop01-namenode機器上使用wget命令下載、解壓、配置完成后,再使用scp命令整體考本到其他三臺機器上即可。

wget https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.1.6/hbase-2.1.6-bin.tar.gz 
tar -zxvf hbase-2.1.6-bin.tar.gz -C /hadoop/

如下截圖所示:


在這里插入圖片描述

6.3 配置文件修改

  1. 修改系統環境變量
    系統環境變量/etc/profile中增加HBase的根目錄:$HBASE_HOME=/hadoop/hbase-2.1.6

    vi /etc/profile
    

    系統環境變量文件中增加內容,如下截圖所示:
    在這里插入圖片描述

    使環境變量修改即可生效:

    source /etc/profile
    
  1. 修改配置文件$HBASE_HOME/conf/hbase-env.sh

    增加JAVA_HOME和HBASE_CLASSPATH配置項:

    export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-0.el7_6.x86_64
    export HBASE_CLASSPATH=/hadoop/hbase-2.1.6/conf
    

    放開并修改HBASE_MANAGES_ZK配置項值為false:不使用HBase自帶的zookeeper,而使用外置的zookeeper:

    export HBASE_MANAGES_ZK=false
    
  2. 修改配置文件$HBASE_HOME\conf\hbase-site.xml
    增加以下配置:

     <property> 
         <name>hbase.cluster.distributed</name> 
         <value>true</value> 
     </property> 
     <property> 
         <name>hbase.rootdir</name> 
         <value>hdfs://mycluster/hbase</value> 
     </property> 
     <property> 
         <name>hbase.zookeeper.quorum</name> 
         <value>hadoop02-namenode:2181,hadoop03-datanode:2181,hadoop04-datanode:2181</value> 
     </property>
     <property>
       <name>hbase.unsafe.stream.capability.enforce</name>
       <value>false</value>
     </property>
    
  3. 修改配置文件$HBASE_HOME\conf\regionservers文件
    指定分布式數據存儲節點機器,類似于hadoop中的datanode概念,數量為基數個。

    hadoop02-namenode
    hadoop03-datanode
    hadoop04-datanodeex
    
  4. 新建$HBASE_HOME\conf\backup-masters文件
    HBase的高可用是建立在zookeeper監控管理上的,新建backup-masters文件,配置備用的HMaster節點:

    hadoop02-namenode
    
  5. 其他相關文件拷貝
    下面三個文件也需要拷貝下,否則hbase啟動會報錯:

    cp $HBASE_HOME/lib/client-facing-thirdparty/htrace-core-3.1.0-incubating.jar $HBASE_HOME/lib/
    cp $HADOOP_HOME/etc/hadoop/hdfs-site.xml $HBASE_HOME/conf/
    cp $HADOOP_HOME/etc/hadoop/core-site.xml $HBASE_HOME/conf/
    

6.4 安裝同步到其他三臺機器上

  1. 將環境變量/etc/profile和安裝配置好的HBase2.1.6版本拷貝至其他3臺CentOs7環境上即可,其他三臺機器無需逐一安裝:

    scp /etc/profile root@hadoop02-namenode:/etc/
    scp /etc/profile root@hadoop03-datenode:/etc/
    scp /etc/profile root@hadoop04-datenode:/etc/
        
    scp -r /hadoop/hbase-2.1.6/ root@hadoop02-namenode:/hadoop/
    scp -r /hadoop/hbase-2.1.6/ root@hadoop03-datanode:/hadoop/
    scp -r /hadoop/hbase-2.1.6/ root@hadoop04-datanode:/hadoop/
    

    `注意:1. 為集群部署方便,集群中的所有機器環境上,jdk、zookeeper、hadoop、hbase軟件安裝目錄要保持一致。

    1. 環境變量拷貝主其他機器上后,需要在相應機器上執行source命令使之即可生效。`


    在這里插入圖片描述

    在這里插入圖片描述

6.5 啟動及驗證

注意:HBase是在Hadoop的分布式文件系統DFS基礎上的,所以需要先啟動dfs后,再啟動hbase。啟動dfs方式參見傷處Hadoop安裝章節。

  1. 啟動Hbase

    cd /hadoop/hbase-2.1.6/bin/
    ./start-hbase.sh
    


    在這里插入圖片描述

    hadoop2-namenode機器既是HBase的HMaster備用節點,也是數據存儲HRegionServer節點,jps查看進程信息如下:


    在這里插入圖片描述
  2. 驗證HBase----訪問HBase的web管理頁面
    頁面查看HBase運行狀態:http://hadoop01-namenode:16010/
    如下截圖所示:

    在這里插入圖片描述

  3. 驗證HBase----命令行操作

    輸入hbase shell進入hbase 命令行模式,創建表、插入記錄、查詢記錄:

[root@hadoop01-namenode bin]# hbase shell
 SLF4J: Class path contains multiple SLF4J bindings.
 SLF4J: Found binding in [jar:file:/hadoop/hadoop-2.8.5/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
 SLF4J: Found binding in [jar:file:/hadoop/hbase-2.1.6/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
 SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
 SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
 HBase Shell
 Use "help" to get list of supported commands.
 Use "exit" to quit this interactive shell.
 For Reference, please visit: http://hbase.apache.org/2.0/book.html#shell
 Version 2.1.6, rba26a3e1fd5bda8a84f99111d9471f62bb29ed1d, Mon Aug 26 20:40:38 CST 2019
 Took 0.0028 seconds                                                                                                                                   
 hbase(main):001:0> list
 TABLE                                                                                                                                                 
 0 row(s)
 Took 0.3541 seconds                                                                                                                                   
 => []
 hbase(main):002:0> create 'test','cf1','cf2'
 Created table test
 Took 2.3501 seconds                                                                                                                                   
 => Hbase::Table - test
 hbase(main):003:0> put 'test','row1','cf1:name','zhang'
 Took 0.3023 seconds                                                                                                                                   
 hbase(main):004:0> put 'test','row1','cf1:age','30'
 Took 0.0215 seconds                                                                                                                                   
 hbase(main):005:0> put 'test','row1','cf2:graduate','1'
 Took 0.0212 seconds                                                                                                                                   
 hbase(main):006:0> scan 'test'
 ROW                                    COLUMN+CELL                                                                                                    
  row1                                  column=cf1:age, timestamp=1567150906738, value=30                                                              
  row1                                  column=cf1:name, timestamp=1567150896250, value=zhang                                                          
  row1                                  column=cf2:graduate, timestamp=1567150961294, value=1                                                          
 1 row(s)
 Took 0.1412 seconds                                                                                                                                   
 hbase(main):007:0> 

效果如下截圖所示:
[圖片上傳失敗...(image-5f4630-1568608205959)]

6.6 Java API連接和操作HBase數據庫

  1. pom.xml引入hbase相關jar包
       <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-hadoop-hbase</artifactId>
        <version>2.5.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-client</artifactId>
        <version>1.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-server</artifactId>
        <version>1.3.1</version>
    </dependency>
        <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-common</artifactId>
        <version>1.3.1</version>
    </dependency>
    
  2. application.yml中配置hbase相關信息
    hbase:
      zookeeper:
        quorum: 10.141.212.142,10.141.212.147,10.141.212.135
        property:
          clientPort: 2181
    
  3. 加載configuration和connection
       @Bean
    public Connection hbaseConnection() {
     org.apache.hadoop.conf.Configuration conf = new org.apache.hadoop.conf.Configuration();
     conf.set("hbase.zookeeper.quorum", zookeeperQuorum);
     conf.set("hbase.zookeeper.property.clientPort", clientPort);
     // conf.set("zookeeper.znode.parent", znodeParent);
     // conf.set("zookeeper.sasl.client", "false");
     // conf.set("hbase.master","10.141.212.140:60000");
     try {
         return ConnectionFactory.createConnection(conf);
     } catch (IOException e) {
         e.printStackTrace();
     }
     return null;
    }
    
  4. Java操作HBase數據庫樣例
    @Autowired
    private Connection conn;
    
    public void fetchDataFromHBase(String tableName, String rowKey, String day, String colFamily) {
     try {
         Table table = conn.getTable(TableName.valueOf(tableName));
         Get get = new Get(Bytes.toBytes(rowKey + day));
         get.addFamily(Bytes.toBytes(colFamily));
         Result rs = table.get(get);
         Cell[] cells = rs.rawCells();
         for (Cell cell : cells) {
             System.out.println(new String(CellUtil.cloneQualifier(cell)));
             System.out.println(new String(CellUtil.cloneFamily(cell)));
             System.out.println(new String(CellUtil.cloneRow(cell)));
             System.out.println(new String(CellUtil.cloneValue(cell)));
         }
         System.out.println("sdf");
     } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
     }
    }
    
    public void createAndPutData(String tableName) {
     try {
         Admin baseAdmin = conn.getAdmin();
         TableName tName = TableName.valueOf(tableName);
         HTableDescriptor  tableDesc = new HTableDescriptor(tName);
         HColumnDescriptor colDesc = new HColumnDescriptor("cf1");
         tableDesc.addFamily(colDesc);
         baseAdmin.createTable(tableDesc);
         Put put1 = new Put("0001".getBytes());
         put1.addColumn("cf1".getBytes(), "col1".getBytes(), "value1".getBytes());
         put1.addColumn("cf1".getBytes(), "col2".getBytes(), "value2".getBytes());
         put1.addColumn("cf1".getBytes(), "col3".getBytes(), "value3".getBytes());
         
         Put put2 = new Put("0002".getBytes());
         put2.addColumn("cf1".getBytes(), "col1".getBytes(), "value1".getBytes());
         put2.addColumn("cf1".getBytes(), "col2".getBytes(), "value2".getBytes());
         put2.addColumn("cf1".getBytes(), "col3".getBytes(), "value3".getBytes());
         
         Table hTable = conn.getTable(tName);
         
         hTable.put(put1);
         hTable.put(put2);
         
     } catch (IOException e) {
         e.printStackTrace();
     }
    }
    
    public void deleteRowData(String tableName, String rowKey) {
     TableName table = TableName.valueOf(tableName);
     Delete delete = new Delete(rowKey.getBytes());
    
     try {
         
         conn.getTable(table).delete(delete);
         
     } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
     }
     
    }
    

6.7 高可用HA說明及驗證

HBase是基于zookeeper實現高可用HA,即一個Active狀態的主HMaster,一個StandBy狀態的從HMaster。當Active狀態的主HMaster節點宕機時,zookeeper會自動將StandBy狀態的節點切換為Active。
如,kill掉hadoop01-namenode機器上的主HMaster節點:

[root@hadoop01-namenode bin]# 
[root@hadoop01-namenode bin]# jps
7456 Jps
3282 ResourceManager
2612 JournalNode
6774 HMaster
2809 DFSZKFailoverController
2363 NameNode
2159 QuorumPeerMain
[root@hadoop01-namenode bin]# kill -9 6774
[root@hadoop01-namenode bin]# 

如下圖所示,kill掉hadoop01-namenode機器上的HMaster進程后,hadoop02-namenode自動切換為Active狀態的Master節點。


在這里插入圖片描述

至此,高可用HA分布式數據庫HBase安裝及驗證完成。

7 Flink安裝和驗證

Flink有三種安裝方式:單機版、Standlone HA高可用集群、Yarn HA高可用集群。
單機版:多用于驗證階段,一般不用于實際業務場景;

Standlone HA高可用集群:依賴于zookeeper實現Master主備,進而實現HA高可用。初始時,即啟動時即確定出主備Master(JobManager)資源、任務處理機TaskManager資源,資源固定;

Yarn HA高可用集群:依賴于Hadoop Yarn實現動態創建、分配資源。配置方式與Standlone HA一致,只是任務啟動方式不同;

本文使用Standlone HA方式構建高可用計算引擎集群。

備注:

  1. Flink多用于歷史批任務處理和實時流數據批處理,而其中歷史批任務處理是以Hadoop DFS作為數據源的(HBase也可以),故安裝使用Flink前需要安裝好Hadoop DFS環境;如果是用于實時流數據處理,可以不用安裝啟動Hadoop DFS環境;
  2. Flink on Yarn是以Hadoop Yarn為基礎的,如果想部署Flink on Yarn的高可用環境,需先安裝好Hadoop Yarn環境;
  3. Flink與Hadoop有版本兼容問題,故要先選定好兼容版本再安裝,本文使用Flink1.7.2版本;

7.1 部署規劃

共4臺CentOs7環境,規劃如下表所示:

機器名 安裝軟件 進程
hadoop01-namenode jdk, zookeeper, hadoop, flink QuorumPeerMain, StandaloneSessionClusterEntrypoint,
hadoop02-namenode jdk, zookeeper, hadoop, flink QuorumPeerMain, StandaloneSessionClusterEntrypoint, TaskManagerRunner
hadoop03-datanode jdk, zookeeper, hadoop, flink QuorumPeerMain, TaskManagerRunner
hadoop04-datanode jdk, zookeeper, hadoop, flink QuorumPeerMain, TaskManagerRunner

說明:

  1. 在hadoop01-namenode和hadoop02-namenode兩機器上構建Cluster Master(JobManager)主備高可用HA;
  2. 在Hadoop02-namenode、hadoop03-datanode、hadoop04-datanode三臺機器上做任務處理節點;

7.2 下載及安裝

注意,Flink與Hadoop有版本兼容問題,安裝前先確認下與之匹配的版本;
本文選擇的是與hadoop2.8.5版本兼容配套的Apache Flink 1.7.2 with Hadoop? 2.8 for Scala 2.11 (asc, sha512)版本,注意是選擇with Hadoop版本。
下載地址:https://www-eu.apache.org/dist/flink/flink-1.7.2/flink-1.7.2-bin-hadoop28-scala_2.11.tgz

在hadoop01-namenode機器上使用wget命令下載、解壓、配置完成后,再使用scp命令整體考本到其他三臺機器上即可。

wget https://www-eu.apache.org/dist/flink/flink-1.7.2/flink-1.7.2-bin-hadoop28-scala_2.11.tgz  
tar -zxvf flink-1.7.2-bin-hadoop28-scala_2.11.tgz -C /hadoop/

7.3 配置文件修改

  1. 修改系統環境變量
    系統環境變量/etc/profile中增加Flink的根目錄:$FLINK_HOME=/hadoop/hbase-2.1.6
    并使生效。

    vi /etc/profile
    

    如下截圖所示:


    在這里插入圖片描述

    使環境變量即可生效:

    source /etc/profile
    


    在這里插入圖片描述
  2. 修改配置文件$FLINK_HOME/conf/flink-conf.yaml
    增加或修改下述配置項:

jobmanager.web.port: 8081
jobmanager.heap.size: 4096m
fs.overwrite-files: true
fs.output.always-create-directory: true
 
 taskmanager.heap.size: 4096m
 taskmanager.numberOfTaskSlots: 8
 parallelism.default: 8
 
 state.backend: filesystem
 state.backend.fs.checkpointdir: hdfs://mycluster/flink/checkpoints
 fs.hdfs.hadoopconf: /itcast3.1.0/hadoop-3.1.1/etc/hadoop
 recovery.mode: zookeeper
 recovery.zookeeper.quorum: hadoop01-namenode:2181,hadoop02-namenode:2181,hadoop03-datanode:2181,hadoop04-datanode:2181
 recovery.zookeeper.storageDir: hdfs://mycluster/flink/recovery
 recovery.zookeeper.path.root: /flink
 recovery.zookeeper.path.namespace: /flink
  1. 修改配置文件$FLINK_HOME/conf/masters
    配置高可用HA主備節點JobManager:
hadoop01-namenode:8081
hadoop02-namenode:8081
  1. 修改配置文件$FLINK_HOME/conf/slaves文件
    配置任務執行節點TaskManager:
 hadoop02-namenode
 hadoop03-datanode
 hadoop04-datanode

7.4 安裝同步到其他三臺機器上

  1. 將系統環境變量配置文件和Flink版本整體拷貝到其他三臺機器上即可,其他三臺機器無需逐一安裝。

注意:環境變量拷貝到其他機器后,要在相應志氣上執行source命令使即刻生效。

 scp /etc/profile root@hadoop02-namenode:/etc/
 scp /etc/profile root@hadoop03-datanode:/etc/
 scp /etc/profile root@hadoop04-datanode:/etc/
 
 scp /hadoop/flink-1.7.2/ root@hadoop02-namenode:/hadoop/
 scp /hadoop/flink-1.7.2/ root@hadoop03-datanode:/hadoop/
 scp /hadoop/flink-1.7.2/ root@hadoop04-datanode:/hadoop/

7.5 啟動及驗證

  1. 啟動Flink Standalone HA

有三種使用模式:
A. Flink Standalone HA高可用集群,用于處理實時數據流時,不依賴Hadoop dfs,可以直接起動即可;
B. Flink Standalone HA高可用集群,基于Hadoop的分布式文件系統作為任務的數據源,多用于歷史處理批量任務處理;
C. Flink on Yarn HA高可用集群,基于Hadoop的分布式文件系統DFS作為任務的數據源,Yarn管理資源JobManager、ApplicationMaster和TaskManager的動態申請創建,進而實現硬件資源的高利用率。

本例中,使用上述B方式,基于Hadoop的分布式文件系統作為任務的胡娟,進行批量任務執行,即需要先啟動hadoop dfs系統,再啟動flink集群,命令如下:

cd /hadoop/hadoop-2.8.5/sbin/
./start-dfs.sh

cd /hadoop/flink-1.7.2/bin/
./start-cluster.sh

啟動完成后,使用jps命令查詢hadoop01-namenode機器上的進程信息如下:

[root@hadoop01-namenode bin]# jps
8465 StandaloneSessionClusterEntrypoint
8561 Jps
7321 NameNode
7753 DFSZKFailoverController
7581 JournalNode
2159 QuorumPeerMain
[root@hadoop01-namenode bin]#

hadoop02-namenode機器上的進程信息如下:

[root@hadoop01-namenode bin]# jps
   [root@hadoop02-namenode hadoop]# jps
19937 DFSZKFailoverController
20929 TaskManagerRunner
20450 StandaloneSessionClusterEntrypoint
19830 JournalNode
19611 NameNode
19694 DataNode
21070 Jps
2159 QuorumPeerMain
[root@hadoop02-namenode hadoop]# 

hadoop03-datanode和hadoop04-datanode機器上的進程信息相同,如下所示:

[root@hadoop03-datanode hadoop]# jps
3698 QuorumPeerMain
28948 TaskManagerRunner
27962 DataNode
31310 Jps
[root@hadoop03-datanode hadoop]# 

上述命令執行如下截圖所示:


在這里插入圖片描述
  1. 驗證Flink

A. 首先通過web管理頁面確認Hadoop DFS運行正常:http://hadoop01-namenode:9870/

在這里插入圖片描述

B. 通過web管理頁面確認Flink運行正常:http://hadoop01-namenode:8081
[圖片上傳失敗...(image-47342b-1568608205959)]
C. 驗證Flink自帶的單詞統計批量任務
首先,上傳一個大文件至dfs系統中,本例中上傳了一個427.5M的日志log文件到dfs中;

hdfs dfs -put /usr/zhang0908/hadoopdata/tmp/kieker-001.log hdfs://mycluster/data/flink/wordcount/

其次,執行Flink單詞統計批量任務:

./flink run -m hadoop01-namenode:8081 ../examples/batch/WordCount.jar --input hdfs://mycluster/data/flink/wordcount/kieker-001.log --output hdfs://mycluster/data/flink/wordcount/output

查看任務執行結果:

hdfs dfs -ls hdfs://mycluster/data/flink/wordcount/output

執行過程如下截圖所示,從執行結果來看,該427.5M大小的日志文件,單詞統計共耗時36秒。


在這里插入圖片描述

批量任務執行過程中,在web管理頁面中可以看見該任務的執行過程詳細情況:


在這里插入圖片描述

8 安裝過程中碰到的坑

雖然hadoop大數據處理已經出來很久了,但總的感覺整個生態圈還不成熟、不穩定,存在各種版本、兼容和配置問題。

下面記錄了安裝過程中碰到的問題:

(1)DFS文件夾權限不夠

錯誤提示:


在這里插入圖片描述

解決方法:


在這里插入圖片描述

(2) yarn-site.xml配置問題

錯誤提示:


在這里插入圖片描述

在這里插入圖片描述

解決方法:

在hadoop3.X版本中,yarn-site.xml文件中需要顯示配置scheduler端口,增加以下配置:
在這里插入圖片描述

https://blog.csdn.net/danielchan2518/article/details/85887597

http://www.mamicode.com/info-detail-2419068.html

(3)集群機器時間同步

錯誤提示如下:
Application application_1567491341696_0003 failed 2 times in previous 10000 milliseconds due to Error launching appattempt_1567491341696_0003_000003. Got exception: org.apache.hadoop.yarn.exceptions.YarnException: Unauthorized request to start container. This token is expired. current time is 1567535049881 found 1567492518315 Note: System times on machines may be out of sync. Check system time and time zones. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl.instantiateExceptionImpl(SerializedExceptionPBImpl.java:171) at org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl.instantiateException(SerializedExceptionPBImpl.java:182) at org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl.deSerialize(SerializedExceptionPBImpl.java:106) at org.apache.hadoop.yarn.server.resourcemanager.amlauncher.AMLauncher.launch(AMLauncher.java:123) at org.apache.hadoop.yarn.server.resourcemanager.amlauncher.AMLauncher.run(AMLauncher.java:250) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) . Failing the application.

問題原因:

集群中機器時間不同步導致,主要是namenode和datanode機器時間不同。

解決辦法:

在每臺服務器執行如下兩個命令進行時間同步:
1)輸入“cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime”
2)輸入“ntpdate pool.ntp.org”

(4)HBase異常:hdfs未知

如下截圖所示:
regionserver啟動失敗,錯誤信息如下,找不到hdfs服務主機。


在這里插入圖片描述

解決方法:

復制hdfs-site.xml、core-site.xml到$HBASE_HOME/conf下。

(5)如下異常

java.lang.IllegalStateException: The procedure WAL relies on the ability to hsync for proper operation during component failures, but the underlying filesystem does not support doing so. Please check the config value of 'hbase.procedure.store.wal.use.hsync' to set the desired level of robustness and ensure the config value of 'hbase.wal.dir' points to a FileSystem mount that can provide it.

解決方法:

在hbase-site.xml增加配置 
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>

(6)hadoop集群啟動,在datanode上需要先啟動zookeeper,所以在hbase中需要禁用hbase自帶的zookeeper,使用hadoop datanode上的外置zookeeper。

方法:

(7)修改:vi conf/hbase-env.sh

export HBASE_MANAGES_ZK=false#設置為false,禁用hbase自帶的zookeeper

修改:vi conf/hbase-site.xml

增加下面的配置,否則regionserver會啟動失敗:

<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>

(8)復制htrace-core-3.1.0-incubating.jar到$HBASE_HOME/lib下

錯誤提示如下圖所示:


在這里插入圖片描述

解決方法:

cp $HBASE_HOME/lib/client-facing-thirdparty/htrace-core-3.1.0-incubating.jar $HBASE_HOME/lib/

(9)重置zookeeper的zNode:hbase

錯誤提示如下:

master.HMaster: hbase:meta,,1.1588230740 is NOT online; state={1588230740 state=OPEN,ts=1543610616273, server=regionserver1.domain.com,41213,1543389145213}; ServerCrashProcedures=true.Master startup cannot progress, in holding-pattern until region onlined

解決方法:
zookeeper節點都啟動的狀態下,任選一個節點執行以下命令:

zookeeper/bin/zkCli.sh -server localhost:2181
rmr  hbase

如下截圖所示:


在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

(10)Java API操作HBase,發起請求,但長時間無響應、無返回、無報錯日志

解決方法:

Java工程缺少相關Jar包導致出錯,但系統并沒有能打印出相應的錯誤提示或終止,導致長久無響應、無返回。
檢查確認下面的三個Jar包都已引入,如果都已引入依然長時間無響應,可將$HBASE_HOME/lib下的所有jar包引入工程。


在這里插入圖片描述

(11)Java API操作HBase,Windows環境下,控制臺報錯顯示HBase所在linux hostname無法識別

解決辦法:
在windows環境下,也需要在host配置文件中增加linux hbase所在環境的hostname與IP地址映射關系,同linux下的配置方式,如下截圖所示:
[圖片上傳失敗...(image-d22c53-1568608205959)]
ipconfig /flushdns -----即可生效,無效重啟電腦

(12) flink運行在yarn上需要額外下載的幾個jar包:

https://github.com/dounine/flink-1.8-depends/tree/master/lib
[圖片上傳失敗...(image-fedf71-1568608205959)]

(13)flink搭配hadoop的dfs使用,需要下載Apache Flink X.X.X with Hadoop? X.X for Scala X.XX版本,即with hadoop的版本,否則報hdfs文件系統找不到,如下截圖所示:


在這里插入圖片描述
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容