HBase 入门笔记-安装篇

一、前言   

    接触HBase已近半年,从一无所知到问题的解决,在数据落地方面也有了一定的了解,在此记录这半年来碰到的一些问题和对一些数据落地方面的见解,本篇主要介绍一下hbase安装方面的信息

二、安装环境

    对于生产环境而言,一个hbase集群可能包含几百上千机器,集群必不可少的几个组件,如Zookeeper, Hbase, Hadoop等,其中Zookeeper一般是奇数台且独立部署,HBase方面主要包括Master结点和RegionServer结点,Hadoop方面包括NameNode和DataNode,在这里模拟生产环境部署,准备了三台机器,不过ZK是一起部署的,没有单独再隔离部署,同时一些配置也简化了,以尽量保持简单。

    机器方面,最好是硬件、OS保持一致,HBase和Hadoop方面,主要是版本要匹配,网上也有相应的说明,这里就不贴了。假设三台机器IP分别为:10.1.1.1,10.1.1.2,10.1.1.3 ,HBase版本是0.98.6.1, Hadoop版本是2.2.0, zookeeper版本是3.4.6, 部署机器对应关系如下

 

    

三、安装步骤 

3.1 用户创建&主机名初始化

 3.1.1  用户创建

    对于hbase和hadoop集群,最好不要用root用户去跑集群,后续不好管理也不安全,所以本文分别给hbase和hadoop分别建立了管理用户:hbaseadmin和hdfsadmin, 建立用户时指定了一个home目录,如下所示

   

useradd -g users hbaseadmin -d /data/hbaseadmin
useradd -g users hdfsadmin -d /data/hdfsadmin

3.1.2  主机名初始化

    因为对于hbase集群来说,如果直接用IP去访问会有问题,所以需要为机器建立主机名,主要是在/etc/hosts下设置,且三台机器都配置一下,本集群设置如下:

10.1.1.1  10-1-1-1
10.1.1.2  10-1-1-2
10.1.1.3  10-1-1-3

  

3.2 信任关系建立

    由于hbase集群需要通过ssh进行免密交互,所以master和namenode机器需要分别和RegionServer和DataNode建立SSH免密信任关系,关于SSH免密登陆,主要是两类OpenSSH和SSH2两种,要确认机器OS上是用的OpenSSH还是SSH2,我机器是用的OpenSSH, 并用如下脚本批量生成SSH KEY,脚本中用到paramiko模块,用来远程登陆目的机器,同时将需要建立信任关系的机器放在ip.list列表。此脚本同时支持不同用户信任关系的建立,因为HBase集群一般用特定的用户来跑,所以除root外,其它用户也需要建立信任关系,需要对hbaseadmin,hdfsadmin分别建立信任关系。建立信任时,最好在各自用户下分别建立信任关系。脚本如下:

    

 1 #!/usr/bin/python
 2 # -*- coding: utf-8 -*-  
 3 import sys,os
 4 import paramiko
 5 
 6 username,homedir,id_rsa_pub,=None,None,None
 7 def initVar():    
 8     if len(sys.argv) > 1:
 9         username = sys.argv[1]
10     else:
11         username = 'root'
12 
13     homedir = '/%(user)s'%{'user':username}
14     id_rsa_pub = '%s/.ssh/id_dsa.pub' %homedir
15 
16     if not  id_rsa_pub:
17         print 'id_rsa.pub Does not exist!'
18         sys.exit(0)
19 
20     hfile = open('%s/.ssh/config' %homedir ,'w')
21     hfile.write('StrictHostKeyChecking no\n')
22     hfile.close()
23 
24 def generateKey(host,port,user,passwd):
25     try:
26         ssh = paramiko.SSHClient()
27         ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
28         ssh.connect(host, port, user, passwd)
29 
30         t = paramiko.Transport((host, port))
31         t.connect(username=user, password=passwd)
32         sftp =paramiko.SFTPClient.from_transport(t)
33 
34         print 'create Host:%s .ssh dir......' %host
35         stdin,stdout,stderr=ssh.exec_command('mkdir ~/.ssh/')
36         print 'upload id_rsa.pub to Host:%s......' %host
37         sftp.put(id_rsa_pub, "/tmp/temp_key1")       
38         stdin,stdout,stderr=ssh.exec_command('cat /tmp/temp_key1 >> ~/.ssh/authorized_keys')
39         stdin,stdout,stderr=ssh.exec_command('chmod -R g-w /data/home/mta/.ssh/')
40         stdin,stdout,stderr=ssh.exec_command('rm /tmp/temp_key1')
41         print 'host:%s@%s auth success!\n' %(user, host)
42         
43         ssh.close()
44         t.close()
45     except Exception, e:
46         import traceback
47         traceback.print_exc()
48         try:
49             ssh.close()
50             t.close()
51         except:
52             pass
53 
54 def run():
55     for line in open('ip.list'):
56         line = line.strip('\n')
57         host,port,user,passwd = line.split(':')
58         fullhost = "hbase-"+host.replace(".","-")
59         generateKey(host, int(port), user, passwd)
60         generateKey(fullhost, int(port), user, passwd)
61 
62 if __name__ == '__main__':
63     initVar()
64     run()
View Code

 

3.3 环境初始化

3.3.1 Java环境

    本集群用的Java环境主要用到JDK1.7.0_51, 直接下载对应版本的tgz包,然后解压到/data/jdk1.7.0_51即可

3.3.2 hbase环境

     目前对于老版本的hbase可能不太好找,所以可以将Hbase版本换成1.0的。这里是直接用0.98.6.1版本已编译好的包, 将hbase-0.98.6.1.tar.gz的包拷贝到/data目录,并解压,同时将整个目录授予hbaseadmin.users权限。配置最后再弄

3.3.3 hadoop环境

    将hadoop-2.2.0.tgz包拷贝到/data目录,解压后,将整个目录授予hdfsadmin.users权限

3.3.4 zookeeper环境

    将zookeeper-3.4.6.tar.gz解压到/data/目录,并将目录权限授予hbaseadmin.users权限,因为是独立部署,所以需要将hbase-env.sh中的 HBASE_MANAGES_ZK设置为FALSE

3.3.5 环境变量设置

    对于集群来说,环境变量很重要,主要有两大块,一块是系统环境变量,在/etc/profile设置或用户home目录下的~/.bash_profile设置也行,另一块是集群本向的环境变量,对于hbase是在hbase安装目录的conf子目录下的hbase-env.sh设置,对于hadoop来说是在hadoop安装目录下的etc/hadoop目录下的hadoop-env.sh设置,下面分别介绍。

3.3.5.1 系统环境变量

    本集群系统环境变量设置如下,ssh切换到hbaseadmin用户和hdfsadmin用户,打开~/.bash_profile, 设置如下内容,并执行source 文件名使变量生效,

    

export JAVA_HOME=/data/jdk1.7.0_51
export JRE_HOME=$JAVA_HOME/jre
export JAVA_BIN=$JAVA_HOME/bin

export PATH=$JAVA_BIN:$PATH


export HADOOP_HOME=/data/hadoop-2.2.0
export HADOOP_BIN=$HADOOP_HOME/bin
export PATH=$HADOOP_BIN:$PATH

export HBASE_HOME=/data/hbase-0.98.6.1
export HBASE_BIN=$HBASE_HOME/bin
export PATH=$HBASE_BIN:$PATH

export HADOOP_MAPRED_HOME=$HADOOP_HOME

export HADOOP_COMMON_HOME=$HADOOP_HOME

export HADOOP_HDFS_HOME=$HADOOP_HOME

export HADOOP_YARN_HOME=$HADOOP_HOME

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop

export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/jre/lib:$JRE_HOME/lib:$HBASE_HOME/lib:$HADOOP_HOME/lib
export CLASSPATH=.:$HADOOP_HOME/share/hadoop/common/hadoop-common-2.2.0.jar:$HADOOP_HOME/share/hadoop/common/lib/commons-cli-1.2.jar:$CLASSPATH

 

3.3.5.2  集群环境变量

    hbase集群环境变量文件hbase-env.sh,设置如下:

export HBASE_MANAGES_ZK=false

export JAVA_HOME=/data/jdk1.7.0_51
export HADOOP_HOME=/data/hadoop-2.2.0
export HBASE_HOME=/data/hbase-0.98.6.1
export HADOOP_CONF_DIR=/data/hadoop-2.2.0/etc/hadoop
export HBASE_CONF_DIR=/data/hbase-0.98.6.1/conf


export ZOOCFGDIR=/data/zookeeper-3.4.6/conf
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
export HADOOP_CLASSPATH=.:$HBASE_HOME/*:$HBASE_CONF_DIR:$HADOOP_CLASSPATH
export HBASE_CLASSPATH=$HBASE_CONF_DIR:$ZOOCFGDIR

export HBASE_REGIONSERVERS=${HBASE_CONF_DIR}/regionservers
export HBASE_LOG_DIR=/data/hbase-0.98.6.1/logs
export HBASE_PID_DIR=/data/hbase-0.98.6.1/pids



export HBASE_HEAPSIZE=24576  #24G


export HBASE_OPTS="-server -d64 -XX:+UseConcMarkSweepGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -Xms12g -Xmx12g -Xmn4g -XX:SurvivorRatio=2 -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=65"

export HBASE_OPTS="$HBASE_OPTS -Xloggc:$HBASE_LOG_DIR/gc-hbase.log.`date +%Y-%m-%d-%H-%M-%S`"
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_THRIFT_OPTS="$HBASE_THRIFT_OPTS $HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10103"
export HBASE_ZOOKEEPER_OPTS="$HBASE_ZOOKEEPER_OPTS $HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10104"

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/hbase-0.98.6.1/lib/native

  hadoop环境变量文件hadoop-env.sh设置如下:

export JAVA_HOME=/data/jdk1.7.0_51

# The jsvc implementation to use. Jsvc is required to run secure datanodes.
#export JSVC_HOME=${JSVC_HOME}

export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/etc/hadoop"}

# Extra Java CLASSPATH elements.  Automatically insert capacity-scheduler.
for f in $HADOOP_HOME/contrib/capacity-scheduler/*.jar; do
  if [ "$HADOOP_CLASSPATH" ]; then
    export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$f
  else
    export HADOOP_CLASSPATH=$f
  fi
done

# The maximum amount of heap to use, in MB. Default is 1000.
export HADOOP_HEAPSIZE=1000
#export HADOOP_NAMENODE_INIT_HEAPSIZE=""

# Extra Java runtime options.  Empty by default.
export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true"

# Command specific options appended to HADOOP_OPTS when specified
export HADOOP_NAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_NAMENODE_OPTS"
export HADOOP_NAMENODE_OPTS="-Dcom.sun.management.jmxremote -server -Xmx12g -Xms12g -Xmn4g -XX:SurvivorRatio=2 -XX:+UseMembar -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+CMSScavengeBeforeRemark -XX:ParallelCMSThreads=4 -XX:+UseCMSCompactAtFullCollection -verbose:gc -Xloggc:/data/hadoop-2.2.0/logs/gc.log.`date +%Y-%m-%d-%H-%M-%S` -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=85 -XX:CMSFullGCsBeforeCompaction=1 $HADOOP_NAMENODE_OPTS"
export HADOOP_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS $HADOOP_DATANODE_OPTS"

 

3.4 hbase&hadoop&zookeeer配置

3.4.1 hbase配置

     hbase配置涉及hbase-site.xml, regionservers。 hbase-site.xml是系统配置,regionservers是指定regionserver结点IP的文件。

3.4.1.1 hbase-site.xml

    配置如下所示,至于具体配置项的解释,网上也有很多介绍,这里附录一篇收藏的配置项详解方面的资料 ,可以对照查看 

<configuration>
        <property>

           <name>hbase.rootdir</name>

           <value>hdfs://10-1-1-1:9000/hbase</value> 

         </property>

         <property>

           <name>hbase.cluster.distributed</name>

           <value>true</value>

         </property>

         <property>
            <name>hbase.master</name>
            <value>10-1-1-1:60000</value>
         </property>

         <property>
            <name>hbase.zookeeper.property.datadir</name>
            <value>/data/zookeeper-3.4.6/data</value>
         </property>

         <property>

           <name>hbase.zookeeper.quorum</name>

           <value>10-1-1-1,10-1-1-2,10-1-1-3</value>

         </property>

</configuration>

 

    hbase配置项详解资料:  

hbase.tmp.dir:本地文件系统的临时目录,默认是${java.io.tmpdir}/hbase-${user.name};
hbase.rootdir:hbase持久化的目录,被所有regionserver共享,默认${hbase.tmp.dir}/hbase,一般设置为hdfs://namenode.example.org:9000/hbase类似,带全限定名;
hbase.cluster.distributed:hbase集群模式运作与否的标志,默认是false,开启需要设置为true,false时启动hbase会在一个jvm中运行hbase和zk;
hbase.zookeeper.quorum:重要的也是必须设置的,启动zk的服务器列表,逗号分隔,cluster模式下必须设置,默认是localhost,hbase客户端也需要设置这个值去访问zk;
hbase.local.dir:本地文件系统被用在本地存储的目录,默认${hbase.tmp.dir}/local/;
hbase.master.port:hbase master绑定的端口,默认是60000;
hbase.master.info.port:hbase master web 界面的端口,默认是60010,设置为-1可以禁用ui;
hbase.master.info.bindAddress:master web界面的绑定地址,默认是0.0.0.0;
hbase.master.logcleaner.plugins:清理日志的插件列表,逗号分隔,被LogService调用的LogCleanerDelegate,可以自定义,顺序执行,清理WAL和HLog;默认org.apache.hadoop.hbase.master.cleaner.TimeToLiveLogCleaner
hbase.master.logcleaner.ttl:HLog在.oldlogdir目录中生存的最长时间,过期则被Master起线程回收,默认是600000;
hbase.master.hfilecleaner.plugins:HFile的清理插件列表,逗号分隔,被HFileService调用,可以自定义,默认org.apache.hadoop.hbase.master.cleaner.TimeToLiveHFileCleaner
hbase.master.catalog.timeout:Catalog Janitor从master到META的超时时间,我们知道这个Janitor是定时的去META扫描表目录,来决定回收无用的regions,默认是600000;
fail.fast.expired.active.master:如果master过期,那么不需要从zk恢复,直接终止,默认是false;
hbase.master.dns.interface:master的dns接口,向该接口提供ip,默认是default;
hbase.master.dns.nameserver:master使用的dns主机名或者ip,默认是default;
hbase.regionserver.port:regionserver绑定的端口,默认是60020;
hbase.regionserver.info.port:regionserver的web界面端口,-1取消界面,默认是60030;
hbase.regionserver.info.bindAddress:regionserver的web绑定,默认是0.0.0.0;
hbase.regionserver.info.port.auto:master或者regionserver是否自动搜索绑定的端口,默认是false;
hbase.regionserver.handler.count:regionserver上rpc listener的个数,http://kenwublog.com/hbase-performance-tuning把这个配置称为io线程数,其实雷同,就是说在regionserver上一个处理rpc的handler,默认是30;
hbase.regionserver.msginterval:regionserver向master发消息的间隔,默认3000毫秒;
hbase.regionserver.optionallogflushinterval:如果没有足够的entry触发同步,那么过了这个间隔后HLog将被同步到HDFS,默认是1000毫秒;
hbase.regionserver.regionSplitLimit:regionsplit的最大限额,默认是MAX_INT=2147483647,设置这个限制后,在到达限制时region split就不会再进行;
hbase.regionserver.logroll.period:不管有多少版本,直接roll掉commit log的周期,也就是说一个固定的时间周期,到期就roll,默认是3600000毫秒;
hbase.regionserver.logroll.errors.tolerated:可接受的WAL关闭错误个数,到达后将触发服务器终止;设置为0那么在WAL writer做log rolling失败时就停止region server,默认是2;
hbase.regionserver.hlog.reader.impl:HLog 文件reader的实现类,默认是org.apache.hadoop.hbase.regionserver.wal.ProtobufLogReader;
hbase.regionserver.hlog.writer.impl:HLog 文件writer的实现类,默认是org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter;
hbase.regionserver.global.memstore.upperLimit:memstore在regionserver内存中的上限,届时新的update被阻塞并且flush被强制写,默认是0.4就是堆内存的40%;阻塞状态持续到regionserver的所有memstore的容量到达hbase.regionserver.global.memstore.lowerLimit;
hbase.regionserver.global.memstore.lowerLimit:memstore在regionserver内存中的最大上限,到达时flush就被强制写,默认是0.38等价于38%的内存容量;
hbase.regionserver.optionalcacheflushinterval:一个edit版本在内存中的cache时长,默认3600000毫秒,设置为0的话则禁止自动flush;
hbase.regionserver.catalog.timeout:regionserver的Catalog Janitor访问META的超时时间,默认是600000;
hbase.regionserver.dns.interface:同master类似~~不讲
hbase.regionserver.dns.nameserver:同master类似
zookeeper.session.timeout:这是个值得说道一下的配置,首先ZK客户端要用,Hbase使用zk的客户端联系总体,同时也被用来启动一个zk server,作为zk的maxSessionTimeout,总的来说就是regionserver与zk的关键参数,如果连接超时,master会重新的balance,regionserver也会被从集群名单中清除,默认是90000;一个问题是如果zk 由hbase自己维护,那么该参数作为regionserver连接是一个值,如果zk在另外的集群,那么zk自己的maxSessionTimeout参数将优先于Hbase的该参数,届时可能会发生超时时间不同的问题;
zookeeper.znode.parent:znode存放root region的地址,默认是root-region-server;
zookeeper.znode.acl.parent:root znode的acl,默认acl;
hbase.zookeeper.dns.interface:zk的dns接口,默认default;
hbase.zookeeper.dns.nameserver:zk的dns服务地址,默认default;
hbase.zookeeper.peerport:zk的peer之间的通讯端口,默认是2888;
hbase.zookeeper.leaderport:zk选leader的通讯端口,默认是3888;
hbase.zookeeper.useMulti:zk支持多重update,要求zk在3.4版本以上,默认是false;
hbase.config.read.zookeeper.config:让hbaseconfig去读zk的config,默认false,也不支持开启,这个功能很搞笑~~个人观点;
hbase.zookeeper.property.initLimit:zk的配置,同步的属性个数限制,默认10个~~没用;
hbase.zookeeper.property.syncLimit:zk的配置,同步时的每次请求的条数,默认5个;
hbase.zookeeper.property.dataDir:zk的配置,snapshot存放的目录,默认是${hbase.tmp.dir}/zookeeper;
hbase.zookeeper.property.clientPort:zk的配置,client连zk的端口,默认2181;
hbase.zookeeper.property.maxClientCnxns:zk的配置,允许接入zk的最大并发连接数的限制,按ip分配,默认300;


hbase.client.write.buffer:htable客户端写缓冲区大小,默认是2097152BYTE,这个缓冲区就是为了写数据的临时存放,设置大了,浪费客户端和服务端的存储,设置小了,如果写的数据多,太多的RPC又带来网络开销,官方给的一个服务端存储耗费评估计算是:hbase.client.write.buffer*hbase.regionserver.handler.count,服务端的rs的处理handler个数也很关键;
hbase.client.pause:pause时长,在hbase发生get或其他操作fail掉的时候进行pause的时间长度,默认是100;
hbase.client.retries.number:发生操作fail时的重试次数,结合上一个指标一起来控制总的重试时间,默认是35;
hbase.client.max.total.tasks:一个HTable实例可以提交给集群的最大并发任务数,默认是100;
hbase.client.max.perserver.tasks:一个HTable实例给一台regionserver提交的最大并发任务数,默认是5;
hbase.client.max.perregion.tasks:客户端连接一台region的最大连接数,换句话说,当你有这么多个连接在region时,新的操作不被发送直到有操作完成,默认是1;
hbase.client.scanner.caching:做scanner的next操作时(如果再本地client没找到)缓存的数据行数,这个值的设置也需要权衡,缓存的多则快,但吃内存,缓存的少则需要多的拉数据, 需要注意的事项是如果两次调用的时间差大于scanner的timeout,则不要设置该值,默认是100;
hbase.client.keyvalue.maxsize:一个KeyValue实例的最大大小,这是存储文件中一个entry的容量上限,合理的设置这个值可以控制regionserver的split,split不会拆keyvalue,所以把keyvalue的大小设置为regionserver大小的一个比例分数(可除)是个不错的选择,默认是10485760;
hbase.client.scanner.timeout.period:结合刚才的caching做的一个,scanner的超时时间,默认是60000毫秒;
hbase.client.localityCheck.threadPoolSize:做localityCheck的线程池大小,默认是2;
hbase.bulkload.retries.number:做bulk load的最大重试次数,默认是0,即代表不断重试;
hbase.balancer.period:Master运行balancer的周期,默认是300000毫秒;
hbase.regions.slop:如果有regionserver的region数目超过average+(average*slop),则rebalance,默认是0.2;
hbase.server.thread.wakefrequency:服务线程的sleep时间,默认10000毫秒,比如log roller;
hbase.server.versionfile.writeattempts:退出前写 version file的重试次数,默认3,每次尝试的间隔由上一个参数控制;
hbase.hregion.memstore.flush.size:Memstore写磁盘的flush阈值,超过这个大小就flush,默认是134217728;
hbase.hregion.preclose.flush.size:如果一个region的memstore的大小等于或超过这个参数的量,在关闭region时(放置关闭flag),要提前flush,然后region关闭下线,默认大小是5242880;
hbase.hregion.memstore.block.multiplier:如果memstore的大小满足hbase.hregion.block.memstore * hbase.hregion.flush.size个byte,那么阻塞update,这个配置可以避免不必要的长时间split或者compact,甚至是OOME,默认是2;
hbase.hregion.memstore.mslab.enabled:开启MemStore-Local Allocation Buffer,这个配置可以避免在高写入的情况下的堆内存碎片,可以降低在大堆情况下的stop-the-world GC频率,默认是true;
hbase.hregion.max.filesize:HStoreFile的最大尺寸,换句话说,当一个region里的列族的任意一个HStoreFile超过这个大小,那么region进行split,默认是10737418240;
hbase.hregion.majorcompaction:一个region的所有HStoreFile进行major compact的时间周期,默认是604800000 毫秒(7天);
hbase.hregion.majorcompaction.jitter:major compaction的发生抖动范围,这么理解比较容易,就是说上一个参数不是一个严格周期,会有个抖动,这个参数就是这个抖动的比例,默认是0.5;
hbase.hstore.compactionThreshold:一个HStore存储HStoreFile的个数阈值,超过这个阈值则所有的HStoreFile会被写到一个新的HStore,需要平衡取舍,默认是3;
hbase.hstore.blockingStoreFiles:一个HStore存储HStoreFile阻塞update的阈值,超过这个阈值,HStore就进行compaction,直到做完才允许update,默认是10;
hbase.hstore.blockingWaitTime:一个更强力的配置,配合上一个参数,当HStore阻塞update时,超过这个时间限制,阻塞取消,就算compaction没有完成,update也不会再被阻塞,默认是90000毫秒;
hbase.hstore.compaction.max:每个minor compaction的HStoreFile个数上限,默认是10;
hbase.hstore.compaction.kv.max:在flushing或者compacting时允许的最大keyvalue个数,如果有大的KeyValue或者OOME的话则配置一个小的值,如果行数多且小则配置大值,默认是10;
hbase.storescanner.parallel.seek.threads:如果并行查找开启的线程池大小,默认是10;
hfile.block.cache.size:一个配置比例,允许最大堆的对应比例的内存作为HFile和HStoreFile的block cache,默认是0.4,即40%,设置为0则disable这个比例,不推荐这么做;
hfile.block.index.cacheonwrite:在index写入的时候允许put无根(non-root)的多级索引块到block cache里,默认是false;
hfile.index.block.max.size:在多级索引的树形结构里,如果任何一层的block index达到这个配置大小,则block写出,同时替换上新的block,默认是131072;
hfile.format.version:新文件的HFile 格式版本,设置为1来测试向后兼容,默认是2;
hfile.block.bloom.cacheonwrite:对于组合布隆过滤器的内联block开启cache-on-write,默认是false;
io.storefile.bloom.block.size:一个联合布隆过滤器的单一块(chunk)的大小,这个值是一个逼近值,默认是131072;
hbase.rs.cacheblocksonwrite:当一个HFile block完成时是否写入block cache,默认是false;

hbase.rpc.server.engine:hbase 做rpc server的调度管理类,实现自org.apache.hadoop.ipc.RpcServerEngine,默认是org.apache.hadoop.hbase.ipc.ProtobufRpcServerEngine;
hbase.rpc.timeout:Hbase client发起远程调用时的超时时限,使用ping来确认连接,但是最终会抛出一个TimeoutException,默认值是60000;
hbase.rpc.shortoperation.timeout:另一个版本的hbase.rpc.timeout,控制短操作的超时时限,比如region server 汇报master的操作的超时时限可以设置小,这样有利于master的failover,默认是10000;
hbase.ipc.client.tcpnodelay:默认是true,具体就是在tcp socket连接时设置 no delay;
hbase.master.keytab.file:kerberos keytab 文件的全路径名,用来为HMaster做log,无默认值;
hbase.master.kerberos.principal:运行HMaster进程时需要kerberos的principal name,这个配置就是这个name的值,形如:hbase/_HOST@EXAMPLE.COM;
hbase.regionserver.keytab.file:kerberos keytab 文件的全路径名,用来为HRegionServer做log,无默认值;
hbase.regionserver.kerberos.principal:运行HRegionServer进程时需要kerberos的principal name,这个配置就是这个name的值,形如:hbase/_HOST@EXAMPLE.COM;
hadoop.policy.file:RPC服务器做权限认证时需要的安全策略配置文件,在Hbase security开启后使用,默认是habse-policy.xml;
hbase.superuser:Hbase security 开启后的超级用户配置,一系列由逗号隔开的user或者group;
hbase.auth.key.update.interval:Hbase security开启后服务端更新认证key的间隔时间:默认是86400000毫秒;
hbase.auth.token.max.lifetime:Hbase security开启后,认证token下发后的生存周期,默认是604800000毫秒;
hbase.ipc.client.fallback-to-simple-auth-allowed:client使用安全连接去链接一台非安全服务器时,服务器提示client切换到SASL SIMPLE认证模式(非安全),如果设置为true,则client同意切换到非安全连接,如果false,则退出连接;
hbase.coprocessor.region.classes:逗号分隔的Coprocessores列表,会被加载到默认所有表上。在自己实现了一个Coprocessor后,将其添加到Hbase的classpath并加入全限定名。也可以延迟加载,由HTableDescriptor指定;
hbase.rest.port:Hbase REST服务器的端口,默认是8080;
hbase.rest.readonly:定义REST服务器启动的模式,有两种方式,false:所有http方法都将被通过-GET/PUT/POST/DELETE,true:只有get方法ok。默认值是false;
hbase.rest.threads.max:REST服务器线程池的最大线程数,池满的话新请求会自动排队,限制这个配置可以控制服务器的内存量,预防OOM,默认是100;
hbase.rest.threads.min:同上类似,最小线程数,为了确保服务器的服务状态,默认是2;
hbase.rest.support.proxyuser:使REST服务器支持proxy-user 模式,默认是false;
hbase.defaults.for.version.skip:是否跳过hbase.defaults.for.version的检查,默认是false;
hbase.coprocessor.master.classes:由HMaster进程加载的coprocessors,逗号分隔,全部实现org.apache.hadoop.hbase.coprocessor.MasterObserver,同coprocessor类似,加入classpath及全限定名;
hbase.coprocessor.abortonerror:如果coprocessor加载失败或者初始化失败或者抛出Throwable对象,则主机退出。设置为false会让系统继续运行,但是coprocessor的状态会不一致,所以一般debug时才会设置为false,默认是true;
hbase.online.schema.update.enable:设置true来允许在线schema变更,默认是true;
hbase.table.lock.enable:设置为true来允许在schema变更时zk锁表,锁表可以组织并发的schema变更导致的表状态不一致,默认是true;
hbase.thrift.minWorkerThreads:线程池的core size,在达到这里配置的量级后,新线程才会再新的连接创立时创建,默认是16;
hbase.thrift.maxWorkerThreads:顾名思义,最大线程数,达到这个数字后,服务器开始drop连接,默认是1000;
hbase.thrift.maxQueuedRequests:Thrift连接队列的最大数,如果线程池满,会先在这个队列中缓存请求,缓存上限就是该配置,默认是1000;
hbase.thrift.htablepool.size.max:Thrift服务器上table pool的最大上限,默认是1000;
hbase.offheapcache.percentage:JVM参数-XX:MaxDirectMemorySize的百分比值,默认是0,即不开启堆外分配;
hbase.data.umask.enable:开启后,文件在regionserver写入时会 有权限相关设定,默认是false不开启;
hbase.data.umask:开启上面一项配置后,文件的权限umask,默认是000;
hbase.metrics.showTableName:是否为每个指标显示表名前缀,默认是true;
hbase.metrics.exposeOperationTimes:是否进行关于操作在使用时间维度的指标报告,比如GET PUT DELETE INCREMENT等,默认是true;
hbase.snapshot.enabled:是否允许snapshot被使用、存储和克隆,默认是true;
hbase.snapshot.restore.take.failsafe.snapshot:在restore过程中,如果失败则启用snapshot替换,成功则删除掉snapshot,默认开启true;
hbase.snapshot.restore.failsafe.name:刚才所说过程中snapshot的名字,默认是hbase-failsafe-{snapshot.name}-{restore.timestamp};
hbase.server.compactchecker.interval.multiplier:检查是否需要compact的时间间隔,一般情况是在比如memstore flush后或者其他事件触发compact的,但是有时也需要不同的compact策略,所以需要周期性的检查具体间隔=hbase.server.compactchecker.interval.multiplier * hbase.server.thread.wakefrequency,默认1000;
hbase.lease.recovery.timeout:在dfs 租约超时时限,超时则放弃,默认是900000;
hbase.lease.recovery.dfs.timeout:dfs恢复租约调用的超时时限,默认是64000;

  

 

 

3.4.1.2 regionservers

    本集群是三台机器都作为rs结点,所以这个文件中直接配置三台机器的主机名,如下:

10-1-1-1
10-1-1-2
10-1-1-3

3.4.2 hadoop配置

     hadoop配置主要包括core-site.xml, hdfs-site.xml, slaves, master.txt,  mapred-site.xml,yarn-site.xml

3.4.2.1  core-site.xml

    配置如下

<configuration>
   <property>

        <name>hadoop.tmp.dir</name>

        <value>/data/hadoop-2.2.0/tmp</value>

        <description>temporary directories.</description>

    </property>

    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://masters</value>
    </property>
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>10-1-1-1:2181,10-1-1-2:2181,10-1-1-3:2181</value>
    </property>
</configuration>

3.4.2.2 hdfs-site.xml

    重点是NameNode HA配置部分

<configuration>
    <property>
        <name>dfs.nameservices</name>
        <value>masters</value>
    </property>
    <property>
        <name>dfs.ha.namenodes.masters</name>
        <value>nn1,nn2</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.masters.nn1</name>
        <value>10-1-1-1:8081</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.masters.nn1</name>
        <value>10-1-1-1:8020</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.masters.nn2</name>
        <value>10-1-1-2:8081</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.masters.nn2</name>
        <value>10-1-1-2:8020</value>
    </property>

    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://10-1-1-1:8485;10-1-1-2:8485;10-1-1-2:8485/masters</value>
    </property>
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/data/hadoop-2.2.0/journal</value>
    </property>

    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>

    <property>
        <name>dfs.client.failover.proxy.provider.masters</name>

        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

    </property>


    <property>

        <name>dfs.ha.fencing.methods</name>
        <value>shell(/bin/true)</value>
    </property>

    <property> 
        <name>dfs.namenode.secondary.http-address</name>
        <value>10-1-1-1:9001</value>
    </property>
    <property>
         <name>dfs.webhdfs.enabled</name>
         <value>true</value>
    </property>

    <property>
                <name>dfs.namenode.name.dir</name>
                <value>/data/hadoop-2.2.0/data/namenode</value>
                <description>Determineswhere on the local filesystem the DFS name node should store the name table. If this is a comma-delimited list of directories then the name table is replicatedin all of the directories, for redundancy.</description>
                <final>true</final>
    </property> 

    <property>
                <name>dfs.datanode.data.dir</name> 
                <value>/data/hdfsadmin/data</value>  <!--如果机器有多块盘,则这里可以配成: /data1/hdfs, /data2/hdfs,....../data[n]/hdfs  --> 
                <description>Determineswhere on the local filesystem an DFS data node should store its blocks. If thisis a comma-delimited list of directories, then data will be stored in all nameddirectories, typically on different devices.Directories that do not exist areignored.</description> 
                <final>true</final>
    </property> 
    <property>
        <name>dfs.datanode.address</name>
        <value>0.0.0.0:9003</value>
        <description>The datanode server address and port for data transfer.</description>
    </property>
    
    <property>
        <name>dfs.datanode.ipc.address</name>
        <value>0.0.0.0:9010</value>
    </property>
    
    <property>
        <name>dfs.datanode.handler.count</name>
        <value>32</value>
        <description>The number of server threads for the datanode.</description>
    </property>

    <property>
        <name>dfs.replication</name> 
        <value>3</value>
    </property> 

    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
</configuration>

3.4.2.3 mapred-site.xml和yarn-site.xml

    这两个是和mapreduce有关,一般hbase集群如果没用到map/reduce的话,这两个是可以不用配置的,所以先不用管

3.4.2.4 slaves & masters.txt

    slaves中配置三台机器,10-1-1-1,10-1-1-2,10-1-1-3

    masters.txt 配置Active状态 的namenode 主机

 

3.4.3  zookeeper 配置

    ZooKeeper配置包括zoo.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/hbaseadmin/hbaseenv/zookeeper-3.4.6/data
clientPort=2181

server.0=10-1-1-1:2888:3888
server.1=10-1-1-2:2888:3888
server.2=10-1-1-3:2888:3888

  

3.5  启动集群

3.5.1 zookeeper启动

   三台机器分别切换到hbaseadmin用户, 然后进行/data/zookeeper-3.4.6/bin目录,执行如下命令:

./zkServer.sh start

  查看进程,在hbaseadmin用户下,执行jps 可查看是否有QuorumPeerMain进程,如果有,表示启动OK, 如果没有,则查看zookeeper日志,看错误在哪

    

 

3.5.2 hbase集群启动

     hbase集群的启动可以一次启动所有进程,也可分别启动进程,如果要一次启动所有进程,则执行如下命令:

su  - hbaseadmin
cd /data/hbase/bin
./start-hbase.sh

 如果要分进程启动的话,则执行./hbase-daemon.sh start [进程名],如启动master: ./hbase-daemon.sh start master,  启动regionserver:  ./hbase-daemon.sh start regionserver

   若启动成功,则执行jps应该出现如下两个进程

20385 HRegionServer
20173 HMaster

  若启动失败,一样到日志目录查看启动失败原因

 

3.5.3 hadoop集群启动

    hadoop 集群启动,也可一次性启动所有进程,也可分进程启动,分别如下:

    一次性启动进程:

    

su - hdfsadmin

cd /data/hadoop-2.2.0/sbin

./start-all.sh

 分进程启动方法:

 

su - hdfsadmin

cd /data/hadoop-2.2.0/sbin

./hadoop-daemon.sh start namenode

./hadoop-daemon.sh start datanode

  

    进程启动后应该出现如下进程:

11641 DataNode
11450 NameNode
11894 SecondaryNameNode

  

四、总结

     本文大致介绍了hbase安装所需要的步骤及相关注意事项,在集群搭建过程中,肯定会遇到很多问题,一般网上都能查到具体原因,最常见的诸如hbase和hadoop lib版本不对应,导致有很多诡异问题,很多网友建议将hadoop lib目录下的所有文件拷贝到hbase lib目录,像这种情况一般是hbase无法识别hadoop环境变量导致,常见方法是检查hadoop classpath是否在hbase-env.sh设置OK,其它还有很多问题,大家慢慢发现,这也是一种成长过程,希望本文能帮到大家

 

  

 

 

 

 

 

posted @ 2017-01-26 16:52 ballwql 阅读(...) 评论(...) 编辑 收藏