分布式存储和计算高可用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文件系统找不到,如下截图所示:


在这里插入图片描述
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容