hbase1.3.3安装采坑指南(非HA)

本文接上一篇hadoop2.8.5安装采坑指南,基础上继续安装hbase1.3.3(非HA)。
如果想搭建 hbase的 HA,那么见HADOOP HA + HBASE HA + YARN HA 搭建

1. 前置工作

接上文的机器

序号 ip hostname 配置
1 192.168.0.1 master 磁盘40GB, 8C32GB,存储可以小,但是内存尽量打
2 192.168.0.2 slaver-1 8C16GB,20TB
3 192.168.0.3 slaver-2 8C16GB,20TB
4 192.168.0.4 slaver-3 8C16GB,20TB

1.1 需要再次确认的东西

1.1.1 hostname 是否配置?

1.1.2 /etc/hosts是否配置了?

1.1.3 是否禁掉防火墙

1.1.4 是否关闭selinux

1.1.5 SSH免密是否完成

1.1.8 端口是否添加安全组

1.1.9 JDK环境变量是否安装配置生效

1.1.10 hadoop是否正常启动?


如果上面那个不满足请看hadoop2.8.5安装采坑指南的步骤,对号入座进行配置。

2. 安装hbase1.3.3

下面的所有操作,都是基于上面1.1.1 到 1.1.10都检查通过的前提下完成的。否则不要进行下面操作。

2.1 下载安装包


cd /opt/app

wget wget http://mirrors.hust.edu.cn/apache/hbase/1.3.3/hbase-1.3.3-bin.tar.gz

tar -zxvf hbase-1.3.3-bin.tar.gz

2.2 环境变量

#hbase 环境
export  HBASE_HOME=/opt/app/hbase-1.3.3
export  PATH=$HBASE_HOME/bin:$PATH


# 确认   hbase-1.3.3/conf/hbase-env.sh  中 是否有 

export JAVA_HOME 的配置, 如果没有那么加上  export JAVA_HOME=${JAVA_HOME}

2.3 修改hbase zk模式

vi conf/hbase-env.sh 

添加下面一行 ,使用hbase自带zookeeper。 如果你有自己的单独zk集群,那么跳过这一步。
export  HBASE_MANAGES_ZK=true

2.4 hbase 配置

conf/hbase-env.sh 添加JMX, GC日志,GC参数,日志目录, PID目录等配置

export JAVA_HOME=${JAVA_HOME}
export HBASE_MANAGES_ZK=false
export HBASE_PID_DIR=/data/hbase/pid
export HBASE_LOG_DIR=/data/hbase-logs/logs
export HBASE_MASTER_OPTS="-verbose:gc  -server -XX:+PrintGCDetails -Xloggc:${HBASE_LOG_DIR}/hbase-gc.log \
-XX:+UseConcMarkSweepGC \
-XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime \
-Xmx4096m -Xms4096m -Xmn1028m -Xss256k  -XX:SurvivorRatio=4  -XX:MaxTenuringThreshold=15  \
-XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseCMSCompactAtFullCollection -XX:+DisableExplicitGC  -XX:+CMSParallelRemarkEnabled \
-XX:+CMSClassUnloadingEnabled  -XX:CMSInitiatingOccupancyFraction=70  -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSMaxAbortablePrecleanTime=5000     \
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20m -XX:ErrorFile=${HBASE_LOG_DIR}/hs_err.log.%p -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${HBASE_LOG_DIR}/%p.hprof \
"
export HBASE_REGIONSERVER_OPTS="\
-Xmx20g \
-XX:+UseG1GC  \
-XX:+UnlockExperimentalVMOptions  \
-XX:MaxGCPauseMillis=200  \
-XX:InitiatingHeapOccupancyPercent=65  \
-XX:+ParallelRefProcEnabled  \
-XX:MaxTenuringThreshold=15  \
-XX:G1HeapRegionSize=16m  \
-XX:NewRatio=3 \
-verbose:gc  \
-XX:+PrintGC  \
-XX:+PrintGCDetails  \
-XX:+PrintGCApplicationStoppedTime  \
-XX:+PrintHeapAtGC  \
-XX:+PrintGCDateStamps  \
-XX:+PrintAdaptiveSizePolicy  \
-XX:+PrintTenuringDistribution  \
-XX:+PrintSafepointStatistics \
-XX:PrintSafepointStatisticsCount=1 \
-XX:PrintFLSStatistics=1 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=${HBASE_LOG_DIR}/%p.hprof \
-Xloggc:${HBASE_LOG_DIR}/hbase-gc.log \
"

export HBASE_JMX_BASE="-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS $HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10101"
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS $HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10102"

conf/hbase-site.xml (生产级别HA配置)

<configuration>
      <property>
        <name>hbase.rootdir</name> <!-- hbase存放数据目录 -->
        <!-- HA 配置 hdfs://self-nameservice/hbase-data/hbase/hbase_db  -->
        <value>hdfs://master:10020/hbase-data/hbase/hbase_db</value>

    </property>
        
    <property>
        <name>hbase.cluster.distributed</name> <!-- 是否分布式部署 -->
        <value>true</value>
    </property>
        
    <property>
        <name>hbase.zookeeper.quorum</name> 
        <value>slaver-1,slaver-2,slaver-3/hbase</value>
    </property>
       
    <property>
        <name>hbase.master.info.port</name>
        <value>8201</value>
    </property>
     
    <property>
        <name>hbase.regionserver.port</name>
        <value>8203</value>
    </property>
    <property>
        <name>hbase.regionserver.info.port</name>
        <value>8204</value>
    </property>

    <property>
        <name>hbase.master.port</name>
        <value>8202</value>
    </property>

    <property>
        <name>hbase.coprocessor.user.region.classes</name>
        <value>org.locationtech.geomesa.hbase.coprocessor.GeoMesaCoprocessor</value>
    </property>



    <property>        
        <!--默认值90000 1.5m, 改为 10Min-->
        <name>zookeeper.session.timeout</name>
        <value>180000</value>
    </property>
    <property>
        <name>hbase.zookeeper.property.tickTime</name>
        <value>6000</value>
    </property>

    <property>  
        <!--关闭 region的 marjor compaction , 手动 vacuum  -->        
        <name>hbase.hregion.majorcompaction</name>
        <value>0</value>
    </property>
    <property>          
        <!--每个region的store的hfile 个数到多少开始minor compaction, 太小的话合并太频繁,太大的话,一次合并时间过长  -->      
        <name>hbase.hstore.compactionThreshold</name>
        <value>6</value>
    </property>
    <property>       
        <!--[1] 当一个store的 hfile到多少的时候,阻塞client的写入请求,且内存中的memstore一直等到 hfile个数小于下面值的时候,才flush-->   
        <name>hbase.hstore.blockingStoreFiles</name>
        <value>100</value>
    </property>
    <property>    
        <!--[2] 一个 region的 memstore被阻塞超过 90s,停止compact等其他操作, 停止阻塞-->         
        <name>hbase.hstore.blockingWaitTime</name>
        <value>90000</value>
    </property>
    <property> 
        <!--一个regionserver 维护的 region的最大限度-->             
        <name>hbase.regionserver.regionSplitLimit</name>           
        <value>300</value>        
    </property>
    <property>    
         <!--region server的处理ipc线程个数-->         
        <name>hbase.regionserver.handler.count</name>           
        <value>120</value>        
    </property>
    <property>  
        <name>hbase.hstore.flusher.count</name>
        <value>20</value>
    </property>
    <property>    
        <!--major compact 线程个数-->         
        <name>hbase.regionserver.thread.compaction.large</name>           
        <value>5</value>        
    </property>
    <property>    
     <!--minor compact 线程个数-->         
        <name>hbase.regionserver.thread.compaction.small</name>           
        <value>5</value>        
      </property>
    <property>
     <!--开启内存碎片整理, 减少gc-->         
        <name>hbase.hregion.memstore.mslab.enabled</name>           
        <value>true</value>        
    </property>
    <property>    
         <!--单个ColumnFamily的region大小,若按照ConstantSizeRegionSplitPolicy策略,超过设置的该值则自动split, 默认10GB-->         
        <name>hbase.hregion.max.filesize</name>           
        <value>107374182400</value>        
    </property>

    <!-- hbase.hstore.compaction.min 单次 minor compact最少hfile 个数, 单次 minor compact最多压缩多少hfile hbase.hstore.compaction.max -->
    <property>    
        <!--超过下面的hifle 不会进行 minor compact, 配置成 50GB-->         
       <name>hbase.hstore.compaction.max.size</name>           
       <value>53687091200</value>   
    </property>
     <!-- minor compact中 hfile压缩会被分到两个队列中,一个large queue,一个 small queue, hbase.regionserver.thread.compaction.throttle hbase.regionserver.thread.compaction.large,hbase.regionserver.thread.compaction.small  -->
    <property>    
        <!--超过下面阈值的 hfile放到 large queue中,否则放入small queue中-->         
       <name>hbase.regionserver.thread.compaction.throttle</name>           
       <value>21474836480</value>        
    </property>
    <!--memstore flush 策略-->
    <property>    
    <!--[Size] 每个region 的memstore到128M flush storefile-->         
       <name>hbase.hregion.memstore.flush.size</name>           
       <value>134217728</value>        
    </property>
    <property>    
       <!--[Time] region级别 自动refresh -->         
       <name>hbase.regionserver.optionalcacheflushinterval</name>           
       <value>18000000</value>        
    </property>
    <property>    
       <!--HLOG 影响 -->         
       <name>hbase.regionserver.maxlogs</name>           
       <value>128</value>        
    </property>
     <property>    
       <!--HLOG 521M hbase.regionserver.maxlogs * hbase.regionserver.hlog.blocksize的时候 HLOG会被roll掉,然后会把hlog包含的memstore刷新到磁盘。-->         
       <name>hbase.regionserver.hlog.blocksize</name>           
       <value>536870912</value>        
     </property>

     <!-- 限流 + flush策略 -->
    <property>    
        <!--hbase.hregion.memstore.flush.size的倍数的时候  block region(只是该region)+ flush-->         
       <name>hbase.hregion.memstore.block.multiplier</name>           
       <value>8</value>        
    </property>
    <property>   
       <name>hbase.ipc.server.callqueue.read.ratio</name>           
       <value>0.2</value>        
    </property>
    <property>   
       <name>hbase.ipc.server.callqueue.scan.ratio</name>           
       <value>0.7</value>        
    </property>
     <property>    
        <!--过期配置:hbase.regionserver.global.memstore.upperLimit,block region server所有region写入, flush 所有region-->         
       <name>hbase.regionserver.global.memstore.size</name>           
       <value>0.4</value>        
     </property>
     <property>    
        <!--过期配置:hbase.regionserver.global.memstore.lowerLimit = hbase.regionserver.global.memstore.size*hbase.regionserver.global.memstore.size.lower.limit,  选若干大的region region flush-->         
       <name>hbase.regionserver.global.memstore.size.lower.limit</name>           
       <value>0.85</value>        
     </property>
    <!-- client -->
    <property>    
        <!-- write buffer 默认2M,改成 8M -->      
        <name>hbase.client.write.buffer</name>
        <value>8388608</value>
    </property>
    <property>    
        <!-- hbaserpc timeout时间默认,1m -->      
        <name>hbase.rpc.timeout</name>
        <value>120000</value>
    </property>
    <property>
        <name>hbase.coprocessor.user.region.classes</name>
        <value>org.apache.hadoop.hbase.coprocessor.AggregateImplementation</value>
    </property>
</configuration>

2.5 同步master的hbse配置到所有slaver机器

cat /opt/app/hadoop-2.8.5/etc/hadoop/slaves | xargs -i -t scp hbase-1.3.3/conf/* admin@{}:/opt/app/hbase-1.3.3/conf/*

2.6 启动hbase

bin/start-hbase.sh

2.7 确认hbase启动成功

master机器应该有的进程

27313 HQuorumPeer
27394 HMaster
3714 ResourceManager
24722 JobHistoryServer
3539 SecondaryNameNode
3268 NameNode

slaver应该有的进程


16496 HQuorumPeer
18896 NodeManager
18769 DataNode
16593 HRegionServer

后续优化

上面计略hbase的最少配置方法启动hbase集群。但是用社区版本的默认配置很难很好的支持实际业务。下面罗列下hbase的优化配置。

hbase-env.sh

开启JMX,gc日志,GC参数
注意 hbase的GC参数中,新生代不要超过4GB。


export HBASE_JMX_BASE="-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS $HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10701"
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS $HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10702"




export HBASE_MASTER_OPTS="-verbose:gc  -server -XX:+PrintGCDetails -Xloggc:${HBASE_LOG_DIR}/hbase-gc.log \
-XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime \
-Xmx4096m -Xms4096m -Xmn1028m -Xss256k  -XX:SurvivorRatio=4  -XX:MaxTenuringThreshold=15  \
-XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseCMSCompactAtFullCollection -XX:+DisableExplicitGC  -XX:+CMSParallelRemarkEnabled \
-XX:+CMSClassUnloadingEnabled  -XX:CMSInitiatingOccupancyFraction=70  -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSMaxAbortablePrecleanTime=5000     \
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20m -XX:ErrorFile=${HBASE_LOG_DIR}/hs_err.log.%p -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${HBASE_LOG_DIR}/%p.hprof \
"

export HBASE_REGIONSERVER_OPTS="-verbose:gc  -server  -XX:+PrintGCDetails -Xloggc:${HBASE_LOG_DIR}/hbase-gc.log \
-XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime \
-server -Xmx20480m -Xms20480m -Xmn2048m -Xss256k  -XX:SurvivorRatio=4  -XX:MaxTenuringThreshold=15  \
-XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseCMSCompactAtFullCollection -XX:+DisableExplicitGC  -XX:+CMSParallelRemarkEnabled -XX:PrintFLSStatistics=1 \
-XX:+CMSClassUnloadingEnabled  -XX:CMSInitiatingOccupancyFraction=70  -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSMaxAbortablePrecleanTime=5000     \
 -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20m -XX:ErrorFile=${HBASE_LOG_DIR}/hs_err.log.%p -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${HBASE_LOG_DIR}/%p.hprof \
"

hbase-size.xml


    <property>        
        <!--默认值90000 1.5m, 改为 10Min,这个可以自己根据实际情况配置-->
        <name>zookeeper.session.timeout</name>
        <value>180000</value>
    </property>

    <property>
        <name>hbase.zookeeper.property.tickTime</name>
        <value>6000</value>
    </property>
    <property>
        <!--默认值 30-->
        <name>hbase.regionserver.handler.count</name>
        <value>30</value>
    </property>

    <property>  
        <!--关闭 region的 marjor compaction , 手动 vacuum  -->        
        <name>hbase.hregion.majorcompaction</name>
        <value>0</value>
    </property>
    <property>          
        <!--每个region的store的hfile 个数到多少开始minor compaction, 太小的话合并太频繁,太大的话,一次合并时间过长  -->      
        <name>hbase.hstore.compactionThreshold</name>
        <value>6</value>
    </property>
    <property>       
        <!--<1> 当一个store的 hfile到多少的时候,阻塞client的写入请求,且内存中的memstore一直等到 hfile个数小于下面值的时候,才flush-->   
        <name>hbase.hstore.blockingStoreFiles</name>
        <value>100</value>
    </property>
    <property>    
        <!--<2> 一个 region的 memstore被阻塞超过 90s,停止compact等其他操作, 停止阻塞-->         
        <name>hbase.hstore.blockingWaitTime</name>
        <value>90000</value>
    </property>
    <property> 
        <!--一个regionserver 维护的 region的最大限度-->             
        <name>hbase.regionserver.regionSplitLimit</name>           
        <value>300</value>        
    </property>
    <property>    
         <!--region server的处理ipc线程个数-->         
        <name>hbase.regionserver.handler.count</name>           
        <value>80</value>        
    </property>
    <property>    
        <!--major compact 线程个数-->         
        <name>hbase.regionserver.thread.compaction.large</name>           
        <value>5</value>        
    </property>
    <property>    
     <!--minor compact 线程个数-->         
        <name>hbase.regionserver.thread.compaction.small</name>           
        <value>5</value>        
      </property>
    <property>
     <!--开启内存碎片整理, 减少gc-->         
        <name>hbase.hregion.memstore.mslab.enabled</name>           
        <value>true</value>        
    </property>
    <property>    
         <!--单个ColumnFamily的region大小,若按照ConstantSizeRegionSplitPolicy策略,超过设置的该值则自动split, 默认10GB-->         
        <name>hbase.hregion.max.filesize</name>           
        <value>107374182400</value>        
    </property>

    <!-- hbase.hstore.compaction.min 单次 minor compact最少hfile 个数, 单次 minor compact最多压缩多少hfile hbase.hstore.compaction.max -->
    <property>    
        <!--超过下面的hifle 不会进行 minor compact, 配置成 50GB-->         
       <name>hbase.hstore.compaction.max.size</name>           
       <value>53687091200</value>   
    </property>
     <!-- minor compact中 hfile压缩会被分到两个队列中,一个large queue,一个 small queue, hbase.regionserver.thread.compaction.throttle hbase.regionserver.thread.compaction.large,hbase.regionserver.thread.compaction.small  -->
    <property>    
        <!--超过下面阈值的 hfile放到 large queue中,否则放入small queue中-->         
       <name>hbase.regionserver.thread.compaction.throttle</name>           
       <value>21474836480</value>        
    </property>
    <!--memstore flush 策略-->
    <property>    
    <!--[Size] 每个region 的memstore到128M flush storefile-->         
       <name>hbase.hregion.memstore.flush.size</name>           
       <value>134217728</value>        
    </property>
    <property>    
       <!--[Time] region级别 自动refresh -->         
       <name>hbase.regionserver.optionalcacheflushinterval</name>           
       <value>3600000</value>        
    </property>
    <property>    
       <!--HLOG 影响 -->         
       <name>hbase.regionserver.maxlogs</name>           
       <value>128</value>        
    </property>
     <property>    
       <!--HLOG 521M hbase.regionserver.maxlogs * hbase.regionserver.hlog.blocksize的时候 HLOG会被roll掉,然后会把hlog包含的memstore刷新到磁盘。-->         
       <name>hbase.regionserver.hlog.blocksize</name>           
       <value>536870912</value>        
     </property>

     <!-- 限流 + flush策略 -->
    <property>    
        <!--hbase.hregion.memstore.flush.size的倍数的时候  block region(只是该region)+ flush-->         
       <name>hbase.hregion.memstore.block.multiplier</name>           
       <value>8</value>        
    </property>

     <property>    
        <!--过期配置:hbase.regionserver.global.memstore.upperLimit,block region server所有region写入, flush 所有region-->         
       <name>hbase.regionserver.global.memstore.size</name>           
       <value>0.4</value>        
     </property>
     <property>    
        <!--过期配置:hbase.regionserver.global.memstore.lowerLimit = hbase.regionserver.global.memstore.size*hbase.regionserver.global.memstore.size.lower.limit,  选若干大的region region flush-->         
       <name>hbase.regionserver.global.memstore.size.lower.limit</name>           
       <value>0.95</value>        
     </property>
    <!-- client -->
    <property>    
        <!-- write buffer 默认2M,改成 8M -->      
        <name>hbase.client.write.buffer</name>
        <value>8388608</value>
    </property>
    <property>    
        <!-- hbaserpc timeout时间默认,1m -->      
        <name>hbase.rpc.timeout</name>
        <value>120000</value>
    </property>
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
慷慨打赏