本文接上一篇hadoop2.8.5安装采坑指南,基础上继续安装hbase1.3.3(非HA)。
如果想搭建 hbase的 HA,那么见HADOOP HA + HBASE HA + YARN HA 搭建
接上文的机器
序号 | 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 |
如果上面那个不满足请看hadoop2.8.5安装采坑指南的步骤,对号入座进行配置。
下面的所有操作,都是基于上面1.1.1 到 1.1.10都检查通过的前提下完成的。否则不要进行下面操作。
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
#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}
vi conf/hbase-env.sh
添加下面一行 ,使用hbase自带zookeeper。 如果你有自己的单独zk集群,那么跳过这一步。
export HBASE_MANAGES_ZK=true
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>
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/*
bin/start-hbase.sh
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的优化配置。
开启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>