Hadoop高可用搭建-完整可用包含安装各种版本


这几年,容器技术不断迭代更新,为大数据提供了更广阔的发展空间。大数据已不只是互联网刚需,也是各传统行业的刚需。为了追赶技术的发展,降低内卷损耗,技术人员需要更快的学习大数据相关的知识提升自己的技术栈,为自己创造价值。
折腾了好久,终于把hadoop+hbase+yarn+flink的环境搭建起来了,有什么不明白的可以加Q184377367 注明:大数据

版本

flink-1.13.5
hadoop 3.2.2
hbase.2.3.5
zookeeper 3.4.14

修改主机名

  • 修改hosts法
    依次在每台服务器上设置hosts配置
    vim /etc/hosts

    192.168.40.134 node1
    192.168.40.138 node2
    192.168.40.139 node3

SSH免密码登录设置

为了方便在各个服务器上相互传输文件,还需要设置SSH免登。

  • 生成公钥
      cd ~
      ssh-keygen -t rsa
      一路回车

      会在 ~.ssh 目录生成两个文件

      cd .ssh

      ll 查看一下

      id_rsa  #私钥

      id_rsa.pub # 公钥

     cat id_rsa.pub                       # 查看生成的公钥
    #将当前服务器权限写入authorized_keys 其他服务器有次文件后 就可以免登到当前服务器
     cat id_rsa.pub >> authorized_keys    # 加入授权
     chmod 600 authorized_keys    # 修改文件权限,如果不修改文件权限,那么其它用户就能查看该授权
  • 将sshkey文件拷贝到node2 node3
      scp authorized_keys root@node2:~/.ssh/
      scp authorized_keys root@node3:~/.ssh/

     // 出现传输大小的字样表示成功了
      // node2需要创建好 ~.ssh目录(如果没有的话)
  • 测试在node1登录node2

    ssh node2

    所有服务器全部重启
    nice 没有什么问题

  • SSH免登梳理

    在node1 生成了私钥和公钥后 执行了授权指令 cat id_rsa.pub >> authorized_keys ++id_rsa.pub++ 就是公钥文件,写入
    到了++authorized_keys++ ,然后自己登陆自己 ssh node1 就OK了,接着把++authorized_keys++ 发给Node2 node3 然后都执行
    权限指令chmod 600 authorized_keys
    在node1 上就可以任意登陆NODE2 和 NODE3了。
    由此可见,
    1 我们需要在node1 node2 node3 分别生成公钥,
    2 发给NODE1,NODE1执行授权,把node2和node3的公钥追加到++authorized_keys++
    3 再发给node2 node3 ,这样三个节点 互相 任意 都可以免ssh密码登录了。
    其中 2 说的 发给node1授权,这个其实无所谓在哪儿授权,只要有三个服务器的公钥授权内容就行了。
    这样三台服务器都有相互的公钥授权,所以就可以任意交互登录了.

zookeeper

同步到其他服务器

cd /usr/local/apps/
# scp -r ./hadoop-3.2.2/ root@node2:/usr/local/apps/

为每个服务器配置zookeeper的工作目录

配置完成后让配置文件生效
source /etc/profile

启动zk

zkServer.sh

正常情况下的输出

ZooKeeper JMX enabled by default
Using config: /usr/local/apps/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: leader

查看ZK的选举服务

jps

QuorumPeerMain 这个就是ZK的选举服务,每个启动ZK的服务器上都会有

查看zookeeper状态
zkServer.sh status

  • 问题
    Error contacting service. It is probably not running.
    1 ZK搭建的是高可用的话,其他服务器上的ZK不启动的话就会出现这个问题
    2 关闭防火墙

hadoop配置

hdfs-site.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>





        
        
                dfs.datanode.data.dir
                /opt/hadoop/data/dfs/datanode
                datanode本地文件存放地址
        
        
        
                dfs.replication
                3
                文件副本数
        
        
        
                dfs.namenode.name.dir
                /opt/hadoop/data/dfs/namenode
                namenode本地文件存放地址
        
        
        
                dfs.permissions.enabled
                false
                是否开启目录权限
        
        
        
                dfs.nameservices
                ns1
                提供服务的NS逻辑名称,与core-site.xml里的对应
        
        
        
                dfs.ha.namenodes.ns1
                hd1,hd2
                列出该逻辑名称下的NameNode逻辑名称
        
        
        
                dfs.namenode.rpc-address.ns1.hd1
                node1:9000
                指定NameNode的RPC位置
        
        
        
                dfs.namenode.http-address.ns1.hd1
                node1:50070
                指定NameNode的Web Server位置
        
        
        
                dfs.namenode.rpc-address.ns1.hd2
                node2:9000
                指定NameNode的RPC位置
        
        
        
                dfs.namenode.http-address.ns1.hd2
                node2:50070
                指定NameNode的Web Server位置
        
        
        
                dfs.namenode.shared.edits.dir
                qjournal://node1:8485;node2:8485/ns1
                指定用于HA存放edits的共享存储,通常是namenode的所在机器
        
        
        
                dfs.journalnode.edits.dir
                /opt/hadoop/data/dfs/journaldata/
                journaldata服务存放文件的地址
        
 
        
                dfs.ha.fencing.methods
                sshfence
                指定HA做隔离的方法,缺省是ssh,可设为shell,稍后详述
        
 
        
                dfs.client.failover.proxy.provider.ns1
                org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
                指定客户端用于HA切换的代理类,不同的NS可以用不同的代理类
        
 
        
         dfs.client.failover.proxy.provider.auto-ha
         org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
        
 
        
                dfs.ha.automatic-failover.enabled
                true
        
        
        
                fs.trash.interval
                2880
                回收周期
        
        
                dfs.datanode.balance.bandwidthPerSec
                104857600
        
        
                dfs.namenode.handler.count
                77
        
        
        
                dfs.blocksize
                134217728
                文件块的大小
        
        
        
                dfs.datanode.max.transfer.threads
                8192
                相当于linux下的打开文件最大数量,文档中无此参数,当出现DataXceiver报错的时候,需要调大。默认256
        
        
        
                dfs.datanode.du.reserved
                2147483648
                每个存储卷保留用作其他用途的磁盘大小
        
        
                dfs.datanode.fsdataset.volume.choosing.policy
                org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy
                存储卷选择策略
        
 
        
                dfs.datanode.available-space-volume-choosing-policy.balanced-space-threshold
                2147483648
                允许的卷剩余空间差值,2G
        
        
                dfs.client.read.shortcircuit
                true
        
        
                dfs.domain.socket.path
                /opt/hadoop/data/dn_socket_PORT
        


core-site.xml 配置

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>






        
        
                io.native.lib.available
                true
                开启本地库支持
        
        
        
                fs.defaultFS
                hdfs://ns1
                默认文件服务的协议和NS逻辑名称,和hdfs-site里的对应此配置替代了1.0里的fs.default.name
        
        
                hadoop.tmp.dir
                /opt/hadoop/data/tmp
        
        
        
                io.compression.codecs
                org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.SnappyCodec
                相应编码的操作类
        
 
        
                io.file.buffer.size
                131072
                SequenceFiles在读写中可以使用的缓存大小
        
        
        
                ha.zookeeper.quorum
                node1:2181,node2:2181,node2:2181
                HA使用的zookeeper地址
        
        
                ipc.client.connection.maxidletime
                60000
        
        
                mapreduce.output.fileoutputformat.compress.type
                BLOCK
        
        
                io.seqfile.compressioin.type
                BLOCK
        
        
                hadoop.proxyuser.root.groups
                hadoop
                hdfs dfsadmin –refreshSuperUserGroupsConfiguration,yarn rmadmin –refreshSuperUserGroupsConfiguration使用这两个命令不用重启就能刷新
        
        
                hadoop.proxyuser.root.hosts
                localhost
        

 



编辑workers文件 /usr/local/apps/hadoop-3.2.2/etc/hadoop/workers

这儿的名字和etc/hosts中一样

node1
node2
node3

start-dfs.sh stop-dfs.sh start-all.sh stop-all.sh

# 分别在这些文件的开头加上
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

etc/hadoop/hadoop-env.sh

顶部加上

export HDFS_ZKFC_USER=root
export HDFS_JOURNALNODE_USER=root
JAVA_HOME=/usr/local/apps/jdk1.8.0_181
同步配置文件到其他服务器

在/usr/local/apps/hadoop-3.2.2/etc/hadoop目录下执行

scp -r ./hadoop-env.sh root@node2:/usr/local/apps/hadoop-3.2.2/etc/hadoop目录下执行
scp -r ./hadoop-env.sh root@node3:/usr/local/apps/hadoop-3.2.2/etc/hadoop

将整个hadoop目录分发的其他服务器(因为sbin下的目录也修改过了..)

cd /usr/local/apps/
# scp -r ./hadoop-3.2.2/ root@node2:/usr/local/apps/

注意/etc/profile 中需要协商hadoop的配置,关于这个文件的配置在本文底部

启动hdfs

初始化zk集群

hdfs zkfc -formatZK

验证是否初始化成功

输出zookeeper指令 其实是ZK的客户端
zkCli.sh

在zk客户端的命令模式下 输入
ls /
这个时候会看到 [zookeeper,hadoop-ha] 两个应用
zookeeper 为搭建zookeeper集群时创建的
hadoop-ha 为hdfs zkfc -formatZK创建的

启动zookeeper

zkServer.sh start

启动 journalnode (同步两台namenode信息)

  • 在hd1上启动journalnode
    hadoop-daemon.sh start journalnode
  • 在hd2上启动journalnode
    hadoop-daemon.sh start journalnode

对hd1上的namenode进行格式化(第一次启动前执行,以后不用每次启动都执行)

hadoop namenode -format

启动hd1上的namenode

hadoop-daemon.sh start namenode

第二个namenode同步第一个namenode状态(第一次启动前执行,以后不用每次都执行)

hadoop namenode -bootstrapStandby

在hd2上启动namenode

hadoop-daemon.sh start namenode

启动ZKFC

# 在 node1和 node2分别启动ZKFC,这时两个namenode,一个变成active,一个变成standby
hadoop-daemon.sh start zkfc
# 查看HA状态
hdfs haadmin -getServiceState hd1
standby
hdfs haadmin -getServiceState hd2
active

启动namenode

  • 先格式化node1上的namenode
    hadoop namenode -format
  • 在启动Node1上的hdfs
hadoop-daemon.sh start namenode
  • 第二个namenode同步第一个namenode状态(第一次启动前执行,以后不用每次都执行)
hadoop namenode -bootstrapStandby
  • 在node2上执行 如果上一个步骤不执行,会出现错误!
hadoop-daemon.sh start namenode

启动datanode

# 在 标记为active的namenode节点上执行
#  注意这里是hadoop-daemons.sh而不是hadoop-daemon.sh
#  每台服务器都有datanode.
hadoop-daemons.sh start datanode 

验证hdfs

  • 验证web访问
    http://node1:50070

在WEB界面上可以查看到每台服务器的高可用状态

  • 验证集群名称

后续hbase访问时,必须要能正常访问
执行下面的命令时,需要保证集群中有namenode是active的..
hadoop fs -ls hdfs://ns1
没有输出的就表示能正常使用集群的地址

小结

第二次启动时直接用start-dfs 可以省略上面的步骤了

yarn高可用

规划

node1 node2 node3
resmanager resmanager
nodemanager nodemanager nodemanager

nodemanager 应该是每台服务器自动就有的管理服务

yarn-site.xml


        
        
                yarn.scheduler.minimum-allocation-vcores
                1
                单个任务可申请的最小虚拟CPU个数
        
 
        
                yarn.scheduler.maximum-allocation-vcores
                3
                单个任务可申请的最大虚拟CPU个数,此参数对应yarn.nodemanager.resource.cpu-vcores,建议最大为一个物理CPU的数量
        
 
        
                yarn.nodemanager.resource.memory-mb
                1024
                该节点上可分配的物理内存总量
        
 
        
                yarn.nodemanager.resource.cpu-vcores
                3
                该节点上YARN可使用的虚拟CPU个数,一个物理CPU对应3个虚拟CPU
        
 
        
                yarn.scheduler.maximum-allocation-mb
                43008
                单个任务可申请的最多物理内存量
        
        
 
        
        
                yarn.resourcemanager.ha.enabled
                true
                是否开启yarn ha
        
 
        
                yarn.resourcemanager.ha.automatic-failover.embedded
                true
                ha状态切换为自动切换
        
 
        
                yarn.resourcemanager.ha.rm-ids
                rm1,rm2
                RMs的逻辑id列表
        
        
                yarn.resourcemanager.hostname.rm1
                node1
         
 
        
                yarn.resourcemanager.hostname.rm2
                node2
        
        
                yarn.resourcemanager.zk-address
                node1:2181,node2:2181,node3:2181
                ha状态的存储地址
        
        
 
        
        
                yarn.resourcemanager.address.rm1
                node1:8032
                ResourceManager 对客户端暴露的地址。客户端通过该地址向RM提交应用程序,杀死应用程序等
        
 
        
                yarn.resourcemanager.scheduler.address.rm1
                node1:8030
                ResourceManager 对ApplicationMaster暴露的访问地址。ApplicationMaster通过该地址向RM申请资源、释放资>源等。
        
 
        
                yarn.resourcemanager.webapp.https.address.rm1
                node1:8089
        
 
        
                yarn.resourcemanager.webapp.address.rm1
                node1:8088
                ResourceManager对外web ui地址。用户可通过该地址在浏览器中查看集群各类信息。
        
 
        
                yarn.resourcemanager.resource-tracker.address.rm1
                node1:8031
                ResourceManager 对NodeManager暴露的地址.。NodeManager通过该地址向RM汇报心跳,领取任务等。
        
 
        
                yarn.resourcemanager.admin.address.rm1
                node1:8033
                ResourceManager 对管理员暴露的访问地址。管理员通过该地址向RM发送管理命令等
        
        
 
        
        
                yarn.resourcemanager.address.rm2
                node2:8032
                ResourceManager 对客户端暴露的地址。客户端通过该地址向RM提交应用程序,杀死应用程序等
        
 
        
                yarn.resourcemanager.scheduler.address.rm2
                node2:8030
                ResourceManager 对ApplicationMaster暴露的访问地址。ApplicationMaster通过该地址向RM申请资源、释放资>源等。
        
 
        
                yarn.resourcemanager.webapp.https.address.rm2
                node2:8089
        
 
        
                yarn.resourcemanager.webapp.address.rm2
                node2:8088
                ResourceManager对外web ui地址。用户可通过该地址在浏览器中查看集群各类信息。
        
 
        
                yarn.resourcemanager.resource-tracker.address.rm2
                node2:8031
                ResourceManager 对NodeManager暴露的地址.。NodeManager通过该地址向RM汇报心跳,领取任务等。
        
 
        
                yarn.resourcemanager.admin.address.rm2
                node2:8033
                ResourceManager 对管理员暴露的访问地址。管理员通过该地址向RM发送管理命令等
        
        
 
        
        
                yarn.resourcemanager.scheduler.class
                org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
                调度器实现类
        
 
        
                yarn.scheduler.fair.allocation.file
                fair-scheduler.xml
                自定义XML配置文件所在位置,该文件主要用于描述各个队列的属性,比如资源量、权重等
        
 
        
                yarn.scheduler.fair.user-as-default-queue
                true
                当应用程序未指定队列名时,是否指定用户名作为应用程序所在的队列名。如果设置为false或者未设置,所有未知队列的应用程序将被提交到default队列中,默认值为true
        
 
        
                yarn.scheduler.fair.preemption
                true
                是否支持抢占
        
 
        
                yarn.scheduler.fair.sizebasedweight
                false
                在一个队列内部分配资源时,默认情况下,采用公平轮询的方法将资源分配各各个应用程序,而该参数则提供了外一种资源分配方式:按照应用程序资源需求数目分配资源,即需求资源数量越多,分配的资源越多。默认情况下,该参数值为false
        
 
        
                yarn.scheduler.increment-allocation-mb
                256
                内存规整化单位,默认是1024,这意味着,如果一个Container请求资源是700mB,则将被调度器规整化为 (700mB / 256mb) *  256mb=768mb
        
 
        
                yarn.scheduler.assignmultiple
                true
                是否启动批量分配功能。当一个节点出现大量资源时,可以一次分配完成,也可以多次分配完成。默认情况下,参数值为false
        
 
        
                yarn.scheduler.fair.max.assign
                10
                如果开启批量分配功能,可指定一次分配的container数目。默认情况下,该参数值为-1,表示不限制
        
 
        
                yarn.scheduler.fair.allow-undeclared-pools
                false
                如果提交的队列名不存在,Scheduler会自动创建一个该队列,默认开启
        
        
 
 
        
        
                yarn.nodemanager.local-dirs
                /opt/hadoop/yarn/local
                中间结果存放位置,存放执行Container所需的数据如可执行程序或jar包,配置文件等和运行过程中产生的临时数据
        
 
        
                yarn.nodemanager.log-dirs
                /opt/hadoop/yarn/logs
                Container运行日志存放地址(可配置多个目录)
        
 
        
                yarn.log-aggregation-enable
                true
                是否启用日志聚集功能
        
        
        
                yarn.log.server.url
                node1:19888/jobhistory/logs/
        
        
                yarn.nodemanager.remote-app-log-dir
                /tmp/app-logs
                当应用程序运行结束后,日志被转移到的HDFS目录(启用日志聚集功能时有效)
        
        
 
        
        
                yarn.log-aggregation.retain-seconds
                1209600
                nodemanager上所有Container的运行日志在HDFS中的保存时间,保留半个月
        
 
        
                yarn.nodemanager.address
                0.0.0.0:9103
        
 
        
                yarn.nodemanager.aux-services
                mapreduce_shuffle
                NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序
        
 
        
                yarn.resourcemanager.cluster-id
                yarn-cluster
                集群的Id
        
 
        
                yarn.resourcemanager.recovery.enabled
                true
                默认值为false,也就是说resourcemanager挂了相应的正在运行的任务在rm恢复后不能重新启动
        
 
        
                yarn.resourcemanager.store.class
                org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
                配置RM状态信息存储方式3有两种,一种是FileSystemRMStateStore,另一种是MemoryRMStateStore,还有一种目前较为主流的是zkstore
        
 
        
                yarn.resourcemanager.zk.state-store.address
                node1:2181,node2:2181,node3:2181
                当使用ZK存储时,指定在ZK上的存储地址。
        
 
        
                yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms
                5000
        
 
        
                yarn.nodemanager.webapp.address
                0.0.0.0:8042
        
 
        
                yarn.nodemanager.localizer.address
                0.0.0.0:8040
        
 
        
                yarn.nodemanager.aux-services.mapreduce.shuffle.class
                org.apache.hadoop.mapred.ShuffleHandler
        
 
        
                mapreduce.shuffle.port
                23080
        
 
        
                yarn.app.mapreduce.am.staging-dir
                /user
        
 
        
                yarn.web-proxy.address
                node1:8041
        
 
        
                yarn.nodemanager.vmem-check-enabled
                false
                虚拟内存检测,默认是True
        
 
        
                yarn.nodemanager.pmem-check-enabled
                false
                物理内存检测,默认是True
        
   
 

 

mapred-site.xml


 



    mapreduce.framework.name
    yarn

 


    mapreduce.application.classpath
    /usr/local/apps/hadoop-3.2.2/share/hadoop/mapreduce/*:/usr/local/apps/hadoop-3.2.2/share/hadoop/mapreduce/lib/*



        mapreduce.jobhistory.address
        node1:10020


        mapreduce.jobhistory.webapp.address
        node1:19888


    mapreduce.jobhistory.done-dir
    /user/history/done

 

    mapreduce.jobhistory.intermediate-done-dir
    /user/history/done_intermediate



    yarn.app.mapreduce.am.resource.mb
    1000
        表示MRAppMaster需要的总内存大小,默认是1536


    yarn.app.mapreduce.am.command-opts
    -Xmx800m
        表示MRAppMaster需要的堆内存大小,默认是:-Xmx1024m


    yarn.app.mapreduce.am.resource.cpu-vcores
    1
    表示MRAppMaster需要的的虚拟cpu数量,默认是:1

 

    mapreduce.map.memory.mb
    512
        表示MapTask需要的总内存大小,默认是1024


    mapreduce.map.java.opts
    -Xmx300m
    表示MapTask需要的堆内存大小,默认是-Xmx200m


    mapreduce.map.cpu.vcores
    1
    表示MapTask需要的虚拟cpu大小,默认是1

 

    mapreduce.reduce.memory.mb
    512
    表示ReduceTask需要的总内存大小,默认是1024


    mapreduce.reduce.java.opts
    -Xmx300m
    表示ReduceTask需要的堆内存大小,默认是-Xmx200m


    mapreduce.reduce.cpu.vcores
    1
    表示ReduceTask需要的虚拟cpu大小,默认是1



start-yarn.sh stop-yarn.sh 分别在这两个文件的开头加上

YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
YARN_PROXYSERVER_USER=root

同步配置文件

# scp -r ./yarn-site.xml root@node2:/usr/local/apps/hadoop-3.2.2/etc/hadoop
#  scp -r ./mapred-site.xml root@node2:/usr/local/apps/hadoop-3.2.2/etc/hadoop

验证yarn

http://node1:8088/

再次查看ZK中的存储的信息,先进入zkCli.sh 客户端模式(目的是了解ZK的原理)

ls /
[zookeeper, yarn-leader-election, hadoop-ha, rmstore]

Hbase

hbase 默认端口

引用hdfs的配置文件

hbase需要使用hadoop的一些配置,创建文件软件链接链接即可

# cd /usr/local/apps/hbase-2.3.5/conf
# ln -s /usr/local/apps/hadoop-3.2.2/etc/hadoop/core-site.xml core-site.xml
# ln -s /usr/local/apps/hadoop-3.2.2/etc/hadoop/hdfs-site.xml hdfs-site.xml

/usr/local/apps/hbase-2.3.5/conf/hbase-site.xml



        
                hbase.rootdir
                hdfs://ns1/hbase
                region server的共享目录,用来持久化HBase
        
 
        
                hbase.cluster.distributed
                true
                HBase的运行模式。false是单机模式,true是分布式模式
        
 
        
                hbase.tmp.dir
                /opt/hadoop/hbase/tmpdata
                本地文件系统的临时文件夹。
        
 
        
                hfile.block.cache.size
                0.39
                storefile的读缓存占用Heap的大小百分比,当然是越大越好,如果读比写多,开到0.4-0.5也没问题。如果读写较均衡,0.3左右。如果写比读多,果断默认吧。
        
 
        
                hbase.rpc.timeout
                900000
                hbase client中的rpc请求超时时间
        
        
        
                hbase.master
                node1:60000
        
 
        
                hbase.master.info.port
                60010
                HBase Master web 界面端口. 设置为-1 意味着你不想让他运行。
        
        
        
                hbase.regionserver.port
                60020
                HBase RegionServer绑定的端口
        
 
        
                hbase.regionserver.info.port
                60030
                HBase RegionServer web 界面绑定的端口 设置为 -1 意味这你不想与运行 RegionServer 界面
        
 
        
                hbase.regionserver.lease.period
                180000
                客户端租用HRegion server 期限,即超时阀值。单位是毫秒。默认情况下,客户端必须在这个时间内发一条信息,否则视为死掉。
        
 
        
                hbase.regionserver.restart.on.zk.expire
                true
                遇到ZooKeeper session expired(过期), regionserver将选择 restart 而不是 abort(终止)
        
 
        
                hbase.regionserver.handler.count
                100
                RegionServers处理远程请求的线程数,如果注重TPS(每秒事务数),可以调大,默认10。
                1)值设得越大,意味着内存开销变大;
                2)对于提高write的速度,如果瓶颈在做flush、compact、split的速度,磁盘io跟不上,提高线程数,意义不大。
        
 
 
        
                hbase.hregion.memstore.block.multiplier
                2
                regionserver在写入时会检查每个region对应的memstore的总大小是否超过了memstore默认大小的2倍(hbase.hregion.memstore.block.multiplier决定),如果超过了则锁住memstore不让新写请求进来并触发flush,避免产生OOM。
        
 
        
                hbase.hregion.max.filesize
                256000000
                在当前ReigonServer上单个Reigon的最大存储空间,单个Region超过该值时,这个Region会被自动split成更小的region。
        
        
        
                hbase.client.scanner.caching
                10000
                客户端参数,HBase scanner一次从服务端抓取的数据条数
        
 
        
                hbase.client.scanner.timeout.period
                900000
                scanner过期时间
        
 
        
        
                hbase.zookeeper.quorum
                node1:2181,node2:2181,node3:2181
        
 
        
                zookeeper.session.timeout
                1200000
        RegionServer与Zookeeper间的连接超时时间。当超时时间到后,ReigonServer会被Zookeeper从RS集群清单中移除,HMaster收到移除通知后,会对这台server负责的regions重新balance,让其他存活的RegionServer接管
        
 
        
                hbase.zookeeper.property.dataDir
                /opt/hadoop/zookeeper/data
                ZooKeeper的zoo.conf中的配置。 快照的存储位置
        

 

修改hbase-env.sh

修改下面两项

export JAVA_HOME=/usr/local/jdk/
export HBASE_MANAGES_ZK=false

regionservers配置

在此文件里配置哪些机器运行regionserver

node1
node2
node3

同步到其他服务器

cd /usr/local/apps/
scp -r hbase-2.3.5  root@node2:/usr/local/apps/
scp -r hbase-2.3.5  root@node3:/usr/local/apps/

启动

时间同步

启动之前需要先同步下每台服务器的时间,否则HRegionServer无法启动起来

时间不同步的问题
在每个集群下面输入这个命令就可以更新时间
ntpdate pool.ntp.org

然后start-hbase.sh就可以了

  • 地址 http://node1:60010

phoenix的搭建和使用

其实flink 是有fsql的,为什么还要用phoenix?phoenix支持JDBC的方式连接hbase,就跟以前的操作MYSQL 一样。
phoenix和hive的区别
hive是在hdfs上建立的SQL层 phoenix是在hbase上建立的SQL层,明白了吧
相关的介绍

本文对应的phoenix版本下载
http://archive.apache.org/dist/phoenix版本下载/phoenix-5.1.1/

问题

  • Hbase 使用高可用 (HA)的hadoop集群,hbase.rootdir如何配置

问题描述
在前面文章中搭建了高可用的hadoop集群,然后hbase使用这个集群的hdfs。但是我们d hbase.rootdir配置的仍然是写死的机器:


        hbase.rootdir
        hdfs://node1:9000/hbase


如果node1此时宕机,处于active状态的nameserver变成了node2,那么hbase集群将不可用,启动hbase集群时将会报错org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): Operation category READ is not supported in state standby:

2019-07-22 11:11:24,431 ERROR [master/node1:16000:becomeActiveMaster] master.HMaster: ***** ABORTING master node1,16000,1563765070980: Unhandled exception. Starting shutdown. *****
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): Operation category READ is not supported in state standby
	at org.apache.hadoop.hdfs.server.namenode.ha.StandbyState.checkOperation(StandbyState.java:87)
	at org.apache.hadoop.hdfs.server.namenode.NameNode$NameNodeHAContext.checkOperation(NameNode.java:1802)
	//省略部分日志
2019-07-22 11:11:24,431 INFO  [master/node1:16000:becomeActiveMaster] regionserver.HRegionServer: ***** STOPPING region server 'node1,16000,1563765070980' *****
2019-07-22 11:11:24,432 INFO  [master/node1:16000:becomeActiveMaster] regionserver.HRegionServer: STOPPED: Stopped by master/node1:16000:becomeActiveMaster
2019-07-22 11:11:27,078 INFO  [master/node1:16000] ipc.NettyRpcServer: Stopping server on /192.168.229.128:16000
2019-07-22 11:11:27,097 WARN  [master/node1:16000] regionserver.HRegionServer: Initialize abort timeout task failed
java.lang.IllegalAccessException: Class org.apache.hadoop.hbase.regionserver.HRegionServer can not access a member of class org.apache.hadoop.hbase.regionserver.HRegionServer$SystemExitWhenAbortTimeout with modifiers "private"
	at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
	at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)
	at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:413)
	at org.apache.hadoop.hbase.regionserver.HRegionServer.run(HRegionServer.java:1044)
	at org.apache.hadoop.hbase.master.HMaster.run(HMaster.java:598)
	at java.lang.Thread.run(Thread.java:745)
2019-07-22 11:11:27,097 INFO  [master/node1:16000] regionserver.HRegionServer: Stopping infoServer
2019-07-22 11:11:27,128 INFO  [master/node1:16000] handler.ContextHandler: Stopped o.e.j.w.WebAppContext@168cd36b{/,null,UNAVAILABLE}{file:/data/program/hbase-2.1.5/hbase-webapps/master}
2019-07-22 11:11:27,143 INFO  [master/node1:16000] server.AbstractConnector: Stopped ServerConnector@319c3a25{HTTP/1.1,[http/1.1]}{0.0.0.0:16010}
2019-07-22 11:11:27,147 INFO  [master/node1:16000] handler.ContextHandler: Stopped o.e.j.s.ServletContextHandler@3b2f4a93{/static,file:///data/program/hbase-2.1.5/hbase-webapps/static/,UNAVAILABLE}
2019-07-22 11:11:27,148 INFO  [master/node1:16000] handler.ContextHandler: Stopped o.e.j.s.ServletContextHandler@3ffb3598{/logs,file:///data/program/hbase-2.1.5/logs/,UNAVAILABLE}
2019-07-22 11:11:27,151 INFO  [master/node1:16000] regionserver.HRegionServer: aborting server node1,16000,1563765070980
2019-07-22 11:11:27,169 INFO  [master/node1:16000] regionserver.HRegionServer: stopping server node1,16000,1563765070980; all regions closed.
2019-07-22 11:11:27,170 INFO  [master/node1:16000] hbase.ChoreService: Chore service for: master/node1:16000 had [] on shutdown
2019-07-22 11:11:27,175 WARN  [master/node1:16000] master.ActiveMasterManager: Failed get of master address: java.io.IOException: Can't get master address from ZooKeeper; znode data == null
2019-07-22 11:11:27,193 INFO  [master/node1:16000] zookeeper.ZooKeeper: Session: 0x16c178f38b80009 closed
2019-07-22 11:11:27,194 INFO  [master/node1:16000] regionserver.HRegionServer: Exiting; stopping=node1,16000,1563765070980; zookeeper connection closed.
2019-07-22 11:11:27,195 ERROR [main] master.HMasterCommandLine: Master exiting
java.lang.RuntimeException: HMaster Aborted
	at org.apache.hadoop.hbase.master.HMasterCommandLine.startMaster(HMasterCommandLine.java:244)
	at org.apache.hadoop.hbase.master.HMasterCommandLine.run(HMasterCommandLine.java:140)
	at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
	at org.apache.hadoop.hbase.util.ServerCommandLine.doMain(ServerCommandLine.java:149)
	at org.apache.hadoop.hbase.master.HMaster.main(HMaster.java:3117)

解决办法
这里需要配置HA高可用的hdfs集群地址,而不是写死的某台机器。

修改hbase-site.xml


        hbase.rootdir
        hdfs://ns1/hbase

1
2
3
4
备注:这里ns1来自于hdfs-site.xml的配置dfs.nameservices:


	
	
	    dfs.nameservices
	    ns1
	

//省略其他配置

同时将hadoop的配置文件hdfs-site.xml和core-site.xml复制到hbase的conf目录下。不然会报找不到myha的错误。

重启hbase集群即可。

网上很多都说遇到java.lang.RuntimeException: HMaster Aborted错误需要清理zk:因为在CDH时重新添加删除HBASE导致的,需要清理zk中的hbase缓存,将zk的/hbase删除即可。
但是并不是所有问题都说由于zk造成的,看日志要多看一点,看到其根本原因。

flink

java 操作

flink官方的问答

  • 本地模式?
  • on yarn模式?
    https://nightlies.apache.org/flink/flink-docs-release-1.13/zh/docs/try-flink/local_installation/

配置

################################################################################
#  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 in compliance
#  with the License.  You may 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.
#  See the License for the specific language governing permissions and
# limitations under the License.
################################################################################


#==============================================================================
# Common
#==============================================================================

# The external address of the host on which the JobManager runs and can be
# reached by the TaskManagers and any clients which want to connect. This setting
# is only used in Standalone mode and may be overwritten on the JobManager side
# by specifying the --host  parameter of the bin/jobmanager.sh executable.
# In high availability mode, if you use the bin/start-cluster.sh script and setup
# the conf/masters file, this will be taken care of automatically. Yarn/Mesos
# automatically configure the host name based on the hostname of the node where the
# JobManager runs.

jobmanager.rpc.address: node1

# The RPC port where the JobManager is reachable.

jobmanager.rpc.port: 6123


# The total process memory size for the JobManager.
#
# Note this accounts for all memory usage within the JobManager process, including JVM metaspace and other overhead.

jobmanager.memory.process.size: 1600m


# The total process memory size for the TaskManager.
#
# Note this accounts for all memory usage within the TaskManager process, including JVM metaspace and other overhead.

taskmanager.memory.process.size: 1728m

# To exclude JVM metaspace and overhead, please, use total Flink memory size instead of 'taskmanager.memory.process.size'.
# It is not recommended to set both 'taskmanager.memory.process.size' and Flink memory.
#
# taskmanager.memory.flink.size: 1280m

# The number of task slots that each TaskManager offers. Each slot runs one parallel pipeline.

taskmanager.numberOfTaskSlots: 1

# The parallelism used for programs that did not specify and other parallelism.

parallelism.default: 1

# The default file system scheme and authority.
# 
# By default file paths without scheme are interpreted relative to the local
# root file system 'file:///'. Use this to override the default and interpret
# relative paths relative to a different file system,
# for example 'hdfs://mynamenode:12345'
#
# fs.default-scheme

#==============================================================================
# High Availability
#==============================================================================

# The high-availability mode. Possible options are 'NONE' or 'zookeeper'.
#
high-availability: zookeeper

# The path where metadata for master recovery is persisted. While ZooKeeper stores
# the small ground truth for checkpoint and leader election, this location stores
# the larger objects, like persisted dataflow graphs.
# 
# Must be a durable file system that is accessible from all nodes
# (like HDFS, S3, Ceph, nfs, ...) 
#
 high-availability.storageDir: hdfs://ns1/flink/ha/

# The list of ZooKeeper quorum peers that coordinate the high-availability
# setup. This must be a list of the form:
# "host1:clientPort,host2:clientPort,..." (default clientPort: 2181)
#
 high-availability.zookeeper.quorum: node1:2181,node2:2181,node3:2181


high-availability.zookeeper.path.root: /flink
high-availability.cluster-id: /FlinkCluster


# ACL options are based on https://zookeeper.apache.org/doc/r3.1.2/zookeeperProgrammers.html#sc_BuiltinACLSchemes
# It can be either "creator" (ZOO_CREATE_ALL_ACL) or "open" (ZOO_OPEN_ACL_UNSAFE)
# The default value is "open" and it can be changed to "creator" if ZK security is enabled
#
# high-availability.zookeeper.client.acl: open

#==============================================================================
# Fault tolerance and checkpointing
#==============================================================================

# The backend that will be used to store operator state checkpoints if
# checkpointing is enabled.
#
# Supported backends are 'jobmanager', 'filesystem', 'rocksdb', or the
# .
#
state.backend: filesystem

# Directory for checkpoints filesystem, when using any of the default bundled
# state backends.
#
state.checkpoints.dir: hdfs://ns1/flink/flink-checkpoints

# Default target directory for savepoints, optional.
#
state.savepoints.dir: hdfs://ns1/flink/flink-savepoints




# Flag to enable/disable incremental checkpoints for backends that
# support incremental checkpoints (like the RocksDB state backend). 
#
# state.backend.incremental: false

# The failover strategy, i.e., how the job computation recovers from task failures.
# Only restart tasks that may have been affected by the task failure, which typically includes
# downstream tasks and potentially upstream tasks if their produced data is no longer available for consumption.

jobmanager.execution.failover-strategy: region

#==============================================================================
# Rest & web frontend
#==============================================================================

# The port to which the REST client connects to. If rest.bind-port has
# not been specified, then the server will bind to this port as well.
#
#rest.port: 8081

# The address to which the REST client will connect to
#
#rest.address: 0.0.0.0

# Port range for the REST and web server to bind to.
#
#rest.bind-port: 8080-8090

# The address that the REST & web server binds to
#
#rest.bind-address: 0.0.0.0

# Flag to specify whether job submission is enabled from the web-based
# runtime monitor. Uncomment to disable.

#web.submit.enable: false

#==============================================================================
# Advanced
#==============================================================================

# Override the directories for temporary files. If not specified, the
# system-specific Java temporary directory (java.io.tmpdir property) is taken.
#
# For framework setups on Yarn or Mesos, Flink will automatically pick up the
# containers' temp directories without any need for configuration.
#
# Add a delimited list for multiple directories, using the system directory
# delimiter (colon ':' on unix) or a comma, e.g.:
#     /data1/tmp:/data2/tmp:/data3/tmp
#
# Note: Each directory entry is read from and written to by a different I/O
# thread. You can include the same directory multiple times in order to create
# multiple I/O threads against that directory. This is for example relevant for
# high-throughput RAIDs.
#
# io.tmp.dirs: /tmp

# The classloading resolve order. Possible values are 'child-first' (Flink's default)
# and 'parent-first' (Java's default).
#
# Child first classloading allows users to use different dependency/library
# versions in their application than those in the classpath. Switching back
# to 'parent-first' may help with debugging dependency issues.
#
# classloader.resolve-order: child-first

# The amount of memory going to the network stack. These numbers usually need 
# no tuning. Adjusting them may be necessary in case of an "Insufficient number
# of network buffers" error. The default min is 64MB, the default max is 1GB.
# 
# taskmanager.memory.network.fraction: 0.1
# taskmanager.memory.network.min: 64mb
# taskmanager.memory.network.max: 1gb

#==============================================================================
# Flink Cluster Security Configuration
#==============================================================================

# Kerberos authentication for various components - Hadoop, ZooKeeper, and connectors -
# may be enabled in four steps:
# 1. configure the local krb5.conf file
# 2. provide Kerberos credentials (either a keytab or a ticket cache w/ kinit)
# 3. make the credentials available to various JAAS login contexts
# 4. configure the connector to use JAAS/SASL

# The below configure how Kerberos credentials are provided. A keytab will be used instead of
# a ticket cache if the keytab path and principal are set.

# security.kerberos.login.use-ticket-cache: true
# security.kerberos.login.keytab: /path/to/kerberos/keytab
# security.kerberos.login.principal: flink-user

# The configuration below defines which JAAS login contexts

# security.kerberos.login.contexts: Client,KafkaClient

#==============================================================================
# ZK Security Configuration
#==============================================================================

# Below configurations are applicable if ZK ensemble is configured for security

# Override below configuration to provide custom ZK service name if configured
# zookeeper.sasl.service-name: zookeeper

# The configuration below must match one of the values set in "security.kerberos.login.contexts"
# zookeeper.sasl.login-context-name: Client

#==============================================================================
# HistoryServer
#==============================================================================

# The HistoryServer is started and stopped via bin/historyserver.sh (start|stop)

# Directory to upload completed jobs to. Add this directory to the list of
# monitored directories of the HistoryServer as well (see below).
#jobmanager.archive.fs.dir: hdfs:///completed-jobs/

# The address under which the web-based HistoryServer listens.
#historyserver.web.address: 0.0.0.0

# The port under which the web-based HistoryServer listens.
#historyserver.web.port: 8082

# Comma separated list of directories to monitor for completed jobs.
#historyserver.archive.fs.dir: hdfs:///completed-jobs/

# Interval in milliseconds for refreshing the monitored directories.
#historyserver.archive.fs.refresh-interval: 10000

上面的主要参数是


jobmanager.rpc.address: node1
jobmanager.rpc.port: 6123
 
jobmanager.memory.process.size: 1600m
taskmanager.memory.process.size: 1728m
taskmanager.numberOfTaskSlots: 1
 
parallelism.default: 1

high-availability: zookeeper
high-availability.storageDir: hdfs://ns1/flink/ha/
high-availability.zookeeper.quorum: hd1:2181,hd2:2181,hd3:2181
high-availability.zookeeper.path.root: /flink
high-availability.cluster-id: /FlinkCluster
 
state.backend: filesystem
state.checkpoints.dir: hdfs://ns1/flink/checkpoints
jobmanager.execution.failover-strategy: region

masters文件的配置

双master

node1
node2

workers任务执行服务器的配置

node3

配置/etc/profile

目前为止的配置

export HBASE_HOME=/usr/local/apps/hbase-2.3.5
export HADOOP_HOME=/usr/local/apps/hadoop-3.2.2
export JAVA_HOME=/usr/local/apps/jdk1.8.0_181
export PATH=$PATH:$JAVA_HOME/bin
export ZOOKEEPER_HOME=/usr/local/apps/zookeeper-3.4.14
export HADOOP_CLASSPATH=`${HADOOP_HOME}/bin/hadoop classpath`
export FLINK_HOME=/usr/local/apps/flink-1.13.5

PATH=$PATH:$HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin:$HBASE_HOME/bin:$FLINK_HOME/bin
export PATH

传输到其他服务器

进入apps目录

scp -r flink-1.13.5  root@node2:/usr/local/apps/
scp -r flink-1.13.5  root@node3:/usr/local/apps/

进入etc目录

scp -r ./profile  root@node2:/etc/
scp -r ./profile  root@node3:/etc/
[root@node1 ~]# start-cluster.sh
Starting HA cluster with 2 masters.
Starting standalonesession daemon on host node1.
Starting standalonesession daemon on host node2.
Starting taskexecutor daemon on host node3.

查看 http://node1:8081

flink的各种集成模式

https://blog.csdn.net/zxr0130/article/details/109116749

on yarn模式的搭建

总结

启动顺序

启动顺序:zk------------hadoop(hdfs-yarn)------hbase
关闭顺序:hbase-------hadoop(yarn-hdfs)--------zk

安装中必须要掌握的几个查询工具

-查询ZK数据中,到底那些服务使用了ZK做高可用

[zk: localhost:2181(CONNECTED) 0] ls /
[flink, zookeeper, yarn-leader-election, hadoop-ha, hbase, rmstore]
[zk: localhost:2181(CONNECTED) 1] 

-查询那些服务的数据存储到了hdfs

[root@node1 ~]# hadoop fs -ls hdfs://ns1/
Found 2 items
drwxr-xr-x   - root supergroup          0 2022-01-04 23:55 hdfs://ns1/flink
drwxr-xr-x   - root supergroup          0 2022-01-05 00:06 hdfs://ns1/hbase

启动HBase集群:

bin/start-hbase.sh

单独启动一个HMaster进程:

bin/hbase-daemon.sh start master

单独停止一个HMaster进程:

bin/hbase-daemon.sh stop master

单独启动一个HRegionServer进程:

bin/hbase-daemon.sh start regionserver

单独停止一个HRegionServer进程:

bin/hbase-daemon.sh stop regionserver

彻底删除HBase数据

有时遇到诡异的问题 实在没办法解决就直接删库吧..
1、hadoop的bin目录下,执行命令以下命令清除Hbase数据

hadoop fs -rm -r /hbase

2、连接ZK,执行以下命令清除Hbase数据

rmr /hbase

3、重启ZK、重启hadoop(hdfs、yarn)、重启hbase

Hbase运维手册

https://blog.csdn.net/mnasd/article/details/81304762

参考

本文使用的参考
https://www.kingc.top/categories/bigdata

https://blog.csdn.net/o_guolin/article/details/116991396

相关