hadoop+hbase+zookeeper+phoenix安装

Hadoop-2.8.2
Zookeeper-3.4.9
HBase-1.3.1
phoenix-4.12.0-HBase-1.3

一、 集群环境总述
1.1、操作系统
Archlinux 64位
vmDev 172.16.1.2 4核 4G 64G

二、 安装前准备
2.1、主机间免密码访问
由于hadoop集群环境的master主机在启动服务时需要远程启动其它slave节点相关服务,所以需要配置无密码访问。
1、ssh-keygen -t rsa会在当前目录下生成.ssh的隐藏目录,目录内容如下:
2、cat id_rsa.pub >> authorized_keys
以上是在必须在master主机执行,再将authorized_keys文件scp到其它slave主机
3、所有.ssh目录及authorized_keys文件需要修改相应属性
chmod 700 .ssh
cd .ssh
chmod 600 authorized_keys
2.2 修改配置文件
nano -w /etc/profile

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk
export ZOOKEEPER_HOME=/opt/zookeeper-3.4.9 
export HADOOP_HOME=/opt/hadoop-2.8.2
export HBASE_HOME=/opt/hbase-1.3.1
export PATH=$PATH:$JAVA_HOME:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HBASE_HOME/bin:$ZOOKEEPER_HOME/bin

三、 安装hadoop
3.1、下载最新版本hadoop
下载地址:http://hadoop.apache.org/releases.html
最新版本hadoop:2.8.2

3.2、配置文件
hadoop有如下重要配置文件:
$HADOOP_HOME/etc/hadoop/hdfs-site.xml


    
       fs.default.name
       hdfs://localhost:19000
    
	
    
       
       dfs.namenode.name.dir
       /srv/hadoop/hdfs/name
    

    
       
       dfs.datanode.data.dir
       /srv/hadoop/hdfs/data
    

$HADOOP_HOME/etc/hadoop/core-site.xml

    
       fs.default.name
       hdfs://localhost:19000
    

    
       
       hadoop.tmp.dir>
       /srv/hadoop/tmp
       A base for other temporary directories.
    

$HADOOP_HOME/etc/hadoop/hadoop-env.sh

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk

$HADOOP_HOME/etc/hadoop/yarn-site.xml

  
      yarn.server.resourcemanager.address
      0.0.0.0:8020
  
  
      yarn.server.resourcemanager.application.expiry.interval
      60000   
  
  
      yarn.server.nodemanager.address
      0.0.0.0:45454  
   
  
      yarn.nodemanager.aux-services
      mapreduce_shuffle
  
  
      yarn.nodemanager.aux-services.mapreduce.shuffle.class
      org.apache.hadoop.mapred.ShuffleHandler
     
  
      yarn.server.nodemanager.remote-app-log-dir
      /var/log/yarn/app-logs   
  
  
      yarn.nodemanager.log-dirs
      /var/log/yarn/userlogs
  
  
      yarn.server.mapreduce-appmanager.attempt-listener.bindAddress
      0.0.0.0   
  
  
      yarn.server.mapreduce-appmanager.client-service.bindAddress
      0.0.0.0
  
  
      yarn.log-aggregation-enable
      true
  
  
      yarn.log-aggregation.retain-seconds
      -1   
  
  
      yarn.application.classpath
      %HADOOP_CONF_DIR%,%HADOOP_COMMON_HOME%/share/hadoop/common/*,%HADOOP_COMMON_HOME%/share/hadoop/common/lib/*,%HADOOP_HDFS_HOME%/share/hadoop/hdfs/*,%HADOOP_HDFS_HOME%/share/hadoop/hdfs/lib/*,%HADOOP_MAPRED_HOME%/share/hadoop/mapreduce/*,%HADOOP_MAPRED_HOME%/share/hadoop/mapreduce/lib/*,%HADOOP_YARN_HOME%/share/hadoop/yarn/*,%HADOOP_YARN_HOME%/share/hadoop/yarn/lib/*   
   

3.3、创建namenode及datanode的目录
根据配置文件格式化hadoop文件目录,文件目录配置如下图(文件名:hdfs-site.xml):
创建目录:
1、mkdir -p /srv/hadoop/dfs/name
2、mkdir -p /srv/hadoop/dfs/data
格式化命令如下:
1、格式化namenode目录:命令:$HADOOP_HOME/bin/hadoop namenode -format
2、格式化datanode目录:命令:$HADOOP_HOME/bin/hadoop datanode -format
注意:这2个目录需要手工创建,且需要格式化,否则hadoop会出现启动异常。

3.4、启动hadoop
在hadoop集群环境启动hadoop命令如下:
$HADOOP_HOME/sbin/start-all.sh

3.5、查看hadoop启动
在IE中输入以下地址可以查看hadoop集群环境的启动状态:
http://172.16.1.160:50070
http://172.16.1.160:8088

3.7、hadoop日志查看
Hadoop日志目录:$HADOOP_HOME/logs
可以用more、cat、tail –f 查看日志内容

四、 安装zookeeper
4.1、下载最新版本zookeeper
最新版本下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper/
最新版本的zookeeper为:3.4.9
创建目录:/data/zookeeper,需要根据zoo.cfg中的配置项来创建。
4.2、创建zookeeper配置文件

# The number of milliseconds of each tick
# ZK中的一个时间单元。ZK中所有时间都是以这个时间单元为基础,进行整数倍配置的。例如,session的最小超时时间是2*tickTime。
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
# Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的起始状态。Leader允许F在 initLimit 时间内完成这个工作。通常情况下,我们不用太在意这个参数的设置。如果ZK集群的数据量确实很大了,F在启动的时候,从Leader上同步数据的时间也会相应变长,因此在这种情况下,有必要适当调大这个参数了
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
# 在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状态。如果L发出心跳包在syncLimit之后,还没有从F那收到响应,那么就认为这个F已经不在线了。注意:不要把这个参数设置得过大,否则可能会掩盖一些问题。
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
# 存储快照文件snapshot的目录。默认情况下,事务日志也会存储在这里。建议同时配置参数dataLogDir, 事务日志的写性能直接影响zk性能。
dataDir=/data/zookeeper/data
# 事务日志输出目录。尽量给事务日志的输出配置单独的磁盘或是挂载点,这将极大的提升ZK性能。
dataLogDir=/data/zookeeper/logs
# the port at which the clients will connect
# 客户端连接server的端口,即对外服务端口,一般设置为2181。
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
# 单个客户端与单台服务器之间的连接数的限制,是ip级别的,默认是60,如果设置为0,那么表明不作任何限制。请注意这个限制的使用范围,仅仅是单台客户端机器与单台ZK服务器之间的连接数限制,不是针对指定客户端IP,也不是ZK集群的连接数限制,也不是单台ZK对所有客户端的连接数限制。
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

# 最大请求堆积数。默认是1000。ZK运行的时候, 尽管server已经没有空闲来处理更多的客户端请求了,但是还是允许客户端将请求提交到服务器上来,提高吞吐性能。当然,为了防止Server内存溢出,这个请求堆积数还是需要限制下的。 Java system property:zookeeper.globalOutstandingLimit.
#globalOutstandingLimit=

# 预先开辟磁盘空间,用于后续写入事务日志。默认是64M,每个事务日志大小就是64M。如果ZK的快照频率较大的话,建议适当减小这个参数。
#preAllocSize=

# 每进行snapCount次事务日志输出后,触发一次快照(snapshot), 此时,ZK会生成一个snapshot.*文件,同时创建一个新的事务日志文件log.*。默认是100000.(真正的代码实现中,会进行一定的随机数处理,以避免所有服务器在同一时间进行快照而影响性能)。
#snapCount=

# 用于记录所有请求的log,一般调试过程中可以使用,但是生产环境不建议使用,会严重影响性能
#traceFile=

# 对于多网卡的机器,可以为每个IP指定不同的监听端口。默认情况是所有IP都监听 clientPort 指定的端口。
#clientPortAddress=

# Session超时时间限制,如果客户端设置的超时时间不在这个范围,那么会被强制设置为最大或最小时间。默认的Session超时时间是在2 * tickTime ~ 20 * tickTime 这个范围 。
#minSessionTimeoutmaxSessionTimeout=

# 事务日志输出时,如果调用fsync方法超过指定的超时时间,那么会在日志中输出警告信息。默认是1000ms。
#fsync.warningthresholdms  

# 3.4.0及之后版本,ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个1或更大的整数,默认是0,表不开启自动清理功能
#autopurge.purgeInterval

# 这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。
#autopurge.snapRetainCount

#在之前的版本中, 这个参数配置是允许我们选择leader选举算法,但是由于在以后的版本中,只会留下一种“TCP-based version of fast leader election”算法,所以这个参数目前看来没有用了。
#electionAlg

# 默认情况下,Leader是会接受客户端连接,并提供正常的读写服务。但是,如果你想让Leader专注于集群中机器的协调,那么可以将这个参数设置为no,这样一来,会大大提高写操作的性能。
#server.X=A:B:C  # 其中X是一个数字, 表示这是第几号server. A是该server所在的IP地址. B配置该server和集群中的leader交换消息所使用的端口. C配置选举leader时所使用的端口. 这里的x是一个数字,与myid文件中的id是一致的。右边可以配置两个端口,第一个端口用于F和L之间的数据同步和其它通信,第二个端口用于Leader选举过程中投票通信。 
#leaderServes    
# 对机器分组和权重设置,
#group.x=nnnnn[:nnnnn]weight.x=nnnnn  

# Leader选举过程中,打开一次连接的超时时间,默认是5s
#cnxTimeout          

# ZK权限设置相关
#zookeeper.DigestAuthenticationProvider.superDigest

# 对所有客户端请求都不作ACL检查。如果之前节点上设置有权限限制,一旦服务器上打开这个开头,那么也将失效
#skipACL    

# 这个参数确定了是否需要在事务日志提交的时候调用 FileChannel .force来保证数据完全同步到磁盘
#forceSync

# 每个节点最大数据量,是默认是1M。这个限制必须在server和client端都进行设置才会生效。
jute.maxbuffer=1M

在目录:/data/zookeeper/目录下创建myid文件,编辑myid文件,与zoo.cfg文件中的server.x=ip:port:port的x相同。
4.3、复制zookeeper库文件到hbase
请从zookeeper安装目录下将:zookeeper-3.4.9.jar复制到hbase的lib目录下。
注意:注意zookeeper.x.x.x.jar的版本号,一定要使用当前正在使用zookeeper版本。
4.4、启动zookeeper
启动脚本:$ZOOKEEPER_HOME/bin/zkServer.sh start
停止脚本:$ZOOKEEPER_HOME/bin/zkServer.sh stop
查看状态:$ZOOKEEPER_HOME/bin/zkServer.sh status

由于zookeeper未提供远程启动、停止脚本,所有,如果需要启动或停止zookeeper集群,必须手工到所有的安装了zookeeper的主机手工启动或停止脚本。

五、 安装hbase
5.1、下载最新版本hbase
最新版本hbase下载地址:http://hbase.apache.org
最新版本的hbase为:1.3.1
5.2、修改hbase配置文件
hbase重要配置文件如下:
1、hbase-site.xml

      
        hbase.rootdir  
        hdfs://localhost:19000/hbase  
      
      
        hbase.tmp.dir  
        /srv/hbase/tmp  
      
      
        hbase.zookeeper.quorum  
        127.0.0.1  
      
    
        hbase.zookeeper.property.dataDir  
        /srv/hbase/zoo
     
	
        hbase.zookeeper.property.clientPort
        2181
    
	
        zookeeper.znode.parent
        /hbase
    
      
        hbase.cluster.distributed  
        true  
     
    
        hbase.master.info.port
        60010
    

2、hbase-env.sh

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk
export HBASE_MANAGES_ZK=false

5.4、启停hbase
启动脚本:$HBASE_HOME/bin/start-hbase.sh
停止脚本:$HBASE_HOME/bin/stop-hbase.sh
由于hbase提供了远程启动、停止脚本,所以,只需要在hbase的Master主机执行即可,该start-hbase.sh脚本会根据配置文件:regionservers文件的内容自动启动、停止远程主机的hbase。

5.6、hbase运行后可以通过自带的web查看运行状态

六、 安装phoenix
6.1、下载最新版本phoenix
最新版本安装包下载地址:http://phoenix.apache.org,最新版本为:4.5.1
6.2、配置phoenix
将hbase的配置文件hbase-site.xml拷贝到phoenix的bin目录。
6.3、配置hbase
将phoenix的jar包拷贝到hbase的lib目录

6.4、phoenix简单使用
phoenix常用脚本:sqlline.py,该shell可以创建、删除、修改相应的表、索引。
启动命令:./sqlline.py Hadoop.Slave1:port,默认端口。
常用命令:
1、!tables 查看表
2、!exit 退出phoenix
3、create table、drop table、desc table
更多命令请参见官网。

七、 常见故障
7.1、重启Regionserver及Zookeeper
1、datanode 宕机了,如何重启:
hadoop-daemon.sh start datanode
2、regionserver挂了,如何重启:
${HBASE_HOME}/bin/hbase-daemon.sh start regionserver

八、其它
8.1、hbase的分页查询
分页查询:主要使用关键字limit,如下,limit 5即每次返回5条记录

第一次查询:
select * from CDR_201507 where serial_number=’17001200000′ limit 5;
第二次查询:主要记录上次的start_time,作为本次的条件
select * from CDR_201507 where serial_number=’17001200000′ and
to_char(start_time, ‘yyyyMMddhhmmss’) > ‘20150704015706’ ORDER BY serial_number, start_time limit 5;

8.2、WordCount.java的编译、打包、运行
javac -classpath /home/hadoop/hadoop-2.6.0/share/hadoop/common/hadoop-common-2.6.0.jar:/home/hadoop/hadoop-2.6.0/share/hadoop/common/lib/commons-cli-1.2.jar:/home/hadoop/hadoop-2.6.0/share/hadoop/common/lib/hadoop-annotations-2.6.0.jar:/home/hadoop/hadoop-2.6.0/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.6.0.jar WordCount.java

打包:
jar -cvf WordCount.jar *.class

运行:
./hadoop jar WordCount.jar com/du/simple/WordCount /input /output

8.3、Phoenix语法
http://phoenix.apache.org/language/index.html

8.4、Hadoop生态中Hive HBase 项目的区别
导读:Apache Hive是一个构建于Hadoop(分布式系统基础架构)顶层的数据仓库,Apache HBase是运行于HDFS顶层的NoSQL(=Not Only SQL,泛指非关系型的数据库)数据库系统。区别于Hive,HBase具备随即读写功能,是一种面向列的数据库。
对于刚接触大数据的用户来说,要想区分Hive与HBase是有一定难度的。本文将尝试从其各自的定义、特点、限制、应用场景等角度来进行分析,以作抛砖引玉之用。
Hive是什么?
Apache Hive是一个构建于Hadoop(分布式系统基础架构)顶层的数据仓库,注意这里不是数据库。Hive可以看作是用户编程接口,它本身不存储和计算数据;它依赖于HDFS(Hadoop分布式文件系统)和MapReduce(一种编程模型,映射与化简;用于大数据并行运算)。其对HDFS的操作类似于SQL—名为HQL,它提供了丰富的SQL查询方式来分析存储在HDFS中的数据;HQL经过编译转为MapReduce作业后通过自己的SQL 去查询分析需要的内容;这样一来,即使不熟悉MapReduce 的用户也可以很方便地利用SQL 语言查询、汇总、分析数据。而MapReduce开发人员可以把己写的mapper 和reducer 作为插件来支持Hive 做更复杂的数据分析。
HBase是什么?
Apache HBase是运行于HDFS顶层的NoSQL(=Not Only SQL,泛指非关系型的数据库)数据库系统。区别于Hive,HBase具备随即读写功能,是一种面向列的数据库。HBase以表的形式存储数据,表由行和列组成,列划分为若干个列簇(row family)。例如:一个消息列簇包含了发送者、接受者、发送日期、消息标题以及消息内容。每一对键值在HBase会被定义为一个Cell,其中,键由row-key(行键),列簇,列,时间戳构成。而在HBase中每一行代表由行键标识的键值映射组合。Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。
特性
遵从JDBC的Hive不但可以让具SQL知识的用户来间接执行MapReduce作业,同时里面也整合了目前基于SQL的操作工具。不过,由于默认的数据读取是全表遍历的,其时间的耗费也不可避免地相对较大。尽管如此,不尽相同的Hive分区方法,其遍历读取的数据量也是能够有所限制的。Hive分区允许对存储在独立文件上的数据进行筛选查询,返回的是筛选后的数据。例如针对日期的日志文件访问,前提是该类文件的文件名包含日期信息。
HBase以键值对的形式储存数据。其包含了4种主要的数据操作方式:
添加或更新数据行
扫描获取某范围内的cells
为某一具体数据行返回对应的cells
从数据表中删除数据行/列,或列的描述信息
列信息可用于获取数据变动前的取值(透过HBase压缩策略可以删除列信息历史记录来释放存储空间)。
限制
Hive不支持常规的SQL更新语句,如:数据插入,更新,删除。因为其对数据的操作是针对整个数据表的。同时该特点也使得数据查询用时以数分钟甚至数小时来进行计算。此外,其MapReduce转换过程必须遵从预定义的转换规则。
HBase的数据查询是有一套属于自己类似SQL的操作语言的,这个需要一定的学习来掌握。此外,要运行HBase,ZooKeeper是需要配备的。ZooKeeper是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。
应用举例
Hive适用于网络日志等数据量大、静态的数据查询。例如:用户消费行为记录,网站访问足迹等。但是不适用于联机实时在线查询的场合。
HBase能在大数据联机实时查询场合大展身手。例如:Fackbook就利用其对用户间的传送的消息进行联机实时分析。
小结
Hive与HBase两者是基于Hadoop上不同的技术。Hive是一种能执行MapReduce作业的类SQL编程接口,Hbase是一种非关系型的数据库结构。结合这两者自身的特点,互相结合使用或许能收到相得益彰的效果。例如:利用Hive处理静态离线数据,利用HBase进行联机实时查询,而后对两者间的结果集进行整合归并,从而使得数据完整且永葆青春,为进一步的商业分析提供良好支持。

hbase
HBase – Hadoop Database,是一个分布式的、面向列的开源数据库,该技术来源于Chang et al所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式。

按行:以一行一行为单位存,反正各有优势
HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,主要包括上述提出的两种文件类型:
1. HFile, HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile
2. HLog File,HBase中WAL(Write Ahead Log)的存储格式,物理上是Hadoop的Sequence File

hive
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。另外一个是Windows注册表文件。

mapreduce
MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念”Map(映射)”和”Reduce(化简)”,和他们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。他极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(化简)函数,用来保证所有映射的键值对中的每一个共享相同的键组

ZooKeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,包含一个简单的原语集,是Hadoop和Hbase的重要组件。分布式应用可以使用它来实现诸如:统一命名服务、配置管理、分布式锁服务、集群管理等功能。

8.6、hbase配置信息说明
hbase.rootdir
这个目录是region server的共享目录,用来持久化Hbase。URL需要是’完全正确’的,还要包含文件系统的scheme。例如,要表示hdfs中的 ‘/hbase’目录,namenode 运行在namenode.example.org的9090端口。则需要设置为hdfs://namenode.example.org:9000 /hbase。默认情况下Hbase是写到/tmp的。不改这个配置,数据会在重启的时候丢失。
默认: file:///tmp/hbase-${user.name}/hbase

hbase.master.port
Hbase的Master的端口.
默认: 60000

hbase.cluster.distributed
Hbase的运行模式。false是单机模式,true是分布式模式。若为false,Hbase和Zookeeper会运行在同一个JVM里面。
默认: false

hbase.tmp.dir
本地文件系统的临时文件夹。可以修改到一个更为持久的目录上。(/tmp会在重启时清楚)
默认: /tmp/hbase-${user.name}

hbase.master.info.port
HBase Master web 界面端口. 设置为-1 意味着你不想让他运行。
默认: 60010

hbase.master.info.bindAddress
HBase Master web 界面绑定的端口
默认: 0.0.0.0

hbase.client.write.buffer
HTable 客户端的写缓冲的默认大小。这个值越大,需要消耗的内存越大。因为缓冲在客户端和服务端都有实例,所以需要消耗客户端和服务端两个地方的内存。得到的好处 是,可以减少RPC的次数。可以这样估算服务器端被占用的内存: hbase.client.write.buffer * hbase.regionserver.handler.count
默认: 2097152

hbase.regionserver.port
HBase RegionServer绑定的端口
默认: 60020

hbase.regionserver.info.port
HBase RegionServer web 界面绑定的端口 设置为 -1 意味这你不想与运行 RegionServer 界面.
默认: 60030

hbase.regionserver.info.port.auto
Master或RegionServer是否要动态搜一个可以用的端口来绑定界面。当hbase.regionserver.info.port已经被占用的时候,可以搜一个空闲的端口绑定。这个功能在测试的时候很有用。默认关闭。
默认: false

hbase.regionserver.info.bindAddress
HBase RegionServer web 界面的IP地址
默认: 0.0.0.0

hbase.regionserver.class
RegionServer 使用的接口。客户端打开代理来连接region server的时候会使用到。
默认: org.apache.hadoop.hbase.ipc.HRegionInterface

hbase.client.pause
通常的客户端暂停时间。最多的用法是客户端在重试前的等待时间。比如失败的get操作和region查询操作等都很可能用到。
默认: 1000

hbase.client.retries.number
最大重试次数。例如 region查询,Get操作,Update操作等等都可能发生错误,需要重试。这是最大重试错误的值。
默认: 10

hbase.client.scanner.caching
当 调用Scanner的next方法,而值又不在缓存里的时候,从服务端一次获取的行数。越大的值意味着Scanner会快一些,但是会占用更多的内存。当 缓冲被占满的时候,next方法调用会越来越慢。慢到一定程度,可能会导致超时。例如超过了 hbase.regionserver.lease.period。
默认: 1
hbase.client.keyvalue.maxsize
一 个KeyValue实例的最大size.这个是用来设置存储文件中的单个entry的大小上界。因为一个KeyValue是不能分割的,所以可以避免因为 数据过大导致region不可分割。明智的做法是把它设为可以被最大region size整除的数。如果设置为0或者更小,就会禁用这个检查。默认10MB。
默认: 10485760

hbase.regionserver.lease.period
客户端租用HRegion server 期限,即超时阀值。单位是毫秒。默认情况下,客户端必须在这个时间内发一条信息,否则视为死掉。
默认: 60000

hbase.regionserver.handler.count
RegionServers受理的RPC Server实例数量。对于Master来说,这个属性是Master受理的handler数量
默认: 10

hbase.regionserver.msginterval
RegionServer 发消息给 Master 时间间隔,单位是毫秒
默认: 3000

hbase.regionserver.optionallogflushinterval
将Hlog同步到HDFS的间隔。如果Hlog没有积累到一定的数量,到了时间,也会触发同步。默认是1秒,单位毫秒。
默认: 1000

hbase.regionserver.regionSplitLimit
region的数量到了这个值后就不会在分裂了。这不是一个region数量的硬性限制。但是起到了一定指导性的作用,到了这个值就该停止分裂了。默认是MAX_INT.就是说不阻止分裂。
默认: 2147483647

hbase.regionserver.logroll.period
提交commit log的间隔,不管有没有写足够的值。
默认: 3600000

hbase.regionserver.hlog.reader.impl
HLog file reader 的实现.
默认: org.apache.hadoop.hbase.regionserver.wal.SequenceFileLogReader

hbase.regionserver.hlog.writer.impl
HLog file writer 的实现.
默认: org.apache.hadoop.hbase.regionserver.wal.SequenceFileLogWriter

hbase.regionserver.thread.splitcompactcheckfrequency
region server 多久执行一次split/compaction 检查.
默认: 20000

hbase.regionserver.nbreservationblocks
储备的内存block的数量(译者注:就像石油储备一样)。当发生out of memory 异常的时候,我们可以用这些内存在RegionServer停止之前做清理操作。
默认: 4
hbase.zookeeper.dns.interface
当使用DNS的时候,Zookeeper用来上报的IP地址的网络接口名字。
默认: default

hbase.zookeeper.dns.nameserver
当使用DNS的时候,Zookeepr使用的DNS的域名或者IP 地址,Zookeeper用它来确定和master用来进行通讯的域名.
默认: default

hbase.regionserver.dns.interface
当使用DNS的时候,RegionServer用来上报的IP地址的网络接口名字。
默认: default

hbase.regionserver.dns.nameserver
当使用DNS的时候,RegionServer使用的DNS的域名或者IP 地址,RegionServer用它来确定和master用来进行通讯的域名.
默认: default

hbase.master.dns.interface
当使用DNS的时候,Master用来上报的IP地址的网络接口名字。
默认: default
hbase.master.dns.nameserver
当使用DNS的时候,RegionServer使用的DNS的域名或者IP 地址,Master用它来确定用来进行通讯的域名.
默认: default

hbase.balancer.period
Master执行region balancer的间隔。
默认: 300000

hbase.regions.slop
当任一regionserver有average + (average * slop)个region是会执行Rebalance
默认: 0

hbase.master.logcleaner.ttl
Hlog存在于.oldlogdir 文件夹的最长时间, 超过了就会被 Master 的线程清理掉.
默认: 600000

hbase.master.logcleaner.plugins
LogsCleaner 服务会执行的一组LogCleanerDelegat。值用逗号间隔的文本表示。这些WAL/HLog cleaners会按顺序调用。可以把先调用的放在前面。你可以实现自己的LogCleanerDelegat,加到Classpath下,然后在这里写 下类的全称。一般都是加在默认值的前面。
默认: org.apache.hadoop.hbase.master.TimeToLiveLogCleaner

hbase.regionserver.global.memstore.upperLimit
单个region server的全部memtores的最大值。超过这个值,一个新的update操作会被挂起,强制执行flush操作。
默认: 0.4

hbase.regionserver.global.memstore.lowerLimit
当强制执行flush操作的时候,当低于这个值的时候,flush会停止。默认是堆大小的 35% . 如果这个值和 hbase.regionserver.global.memstore.upperLimit 相同就意味着当update操作因为内存限制被挂起时,会尽量少的执行flush(译者注:一旦执行flush,值就会比下限要低,不再执行)
默认: 0.35

hbase.server.thread.wakefrequency
service工作的sleep间隔,单位毫秒。 可以作为service线程的sleep间隔,比如log roller.
默认: 10000

hbase.hregion.memstore.flush.size
当memstore的大小超过这个值的时候,会flush到磁盘。这个值被一个线程每隔hbase.server.thread.wakefrequency检查一下。
默认: 67108864

hbase.hregion.preclose.flush.size
当一个region中的memstore的大小大于这个值的时候,我们又触发了close.会先运行“pre-flush”操作,清理这个需要关闭的 memstore,然后将这个region下线。当一个region下线了,我们无法再进行任何写操作。如果一个memstore很大的时候,flush 操作会消耗很多时间。”pre-flush”操作意味着在region下线之前,会先把memstore清空。这样在最终执行close操作的时 候,flush操作会很快。
默认: 5242880

hbase.hregion.memstore.block.multiplier
如果memstore有hbase.hregion.memstore.block.multiplier倍数的 hbase.hregion.flush.size的大小,就会阻塞update操作。这是为了预防在update高峰期会导致的失控。如果不设上 界,flush的时候会花很长的时间来合并或者分割,最坏的情况就是引发out of memory异常。(译者注:内存操作的速度和磁盘不匹配,需要等一等。原文似乎有误)
默认: 2

hbase.hregion.memstore.mslab.enabled
体验特性:启用memStore分配本地缓冲区。这个特性是为了防止在大量写负载的时候堆的碎片过多。这可以减少GC操作的频率。(GC有可能会Stop the world)(译者注:实现的原理相当于预分配内存,而不是每一个值都要从堆里分配)
默认: false

hbase.hregion.max.filesize
最大HStoreFile大小。若某个Column families的HStoreFile增长达到这个值,这个Hegion会被切割成两个。 Default: 256M.
默认: 268435456

hbase.hstore.compactionThreshold
当一个HStore含有多于这个值的HStoreFiles(每一个memstore flush产生一个HStoreFile)的时候,会执行一个合并操作,把这HStoreFiles写成一个。这个值越大,需要合并的时间就越长。
默认: 3

hbase.hstore.blockingStoreFiles
当一个HStore含有多于这个值的HStoreFiles(每一个memstore flush产生一个HStoreFile)的时候,会执行一个合并操作,update会阻塞直到合并完成,直到超过了hbase.hstore.blockingWaitTime的值
默认: 7

hbase.hstore.blockingWaitTime
hbase.hstore.blockingStoreFiles所限制的StoreFile数量会导致update阻塞,这个时间是来限制阻塞时间的。当超过了这个时间,HRegion会停止阻塞update操作,不过合并还有没有完成。默认为90s.
默认: 90000

hbase.hstore.compaction.max
每个“小”合并的HStoreFiles最大数量。
默认: 10

hbase.hregion.majorcompaction
一个Region中的所有HStoreFile的major compactions的时间间隔。默认是1天。 设置为0就是禁用这个功能。
默认: 86400000

hbase.mapreduce.hfileoutputformat.blocksize
MapReduce 中HFileOutputFormat可以写 storefiles/hfiles. 这个值是hfile的blocksize的最小值。通常在Hbase写Hfile的时候,bloocksize是由table schema(HColumnDescriptor)决定的,但是在mapreduce写的时候,我们无法获取schema中blocksize。这个值 越小,你的索引就越大,你随机访问需要获取的数据就越小。如果你的cell都很小,而且你需要更快的随机访问,可以把这个值调低。
默认: 65536

hfile.block.cache.size
分配给HFile/StoreFile的block cache占最大堆(-Xmx setting)的比例。默认是20%,设置为0就是不分配。
默认: 0.2

hbase.hash.type
哈希函数使用的哈希算法。可以选择两个值:: murmur (MurmurHash) 和 jenkins (JenkinsHash). 这个哈希是给 bloom filters用的.
默认: murmur

hbase.master.keytab.file
HMaster server验证登录使用的kerberos keytab 文件路径。(译者注:Hbase使用Kerberos实现安全)
默认:

hbase.master.kerberos.principal
例如. “hbase/_HOST@EXAMPLE.COM”. HMaster运行需要使用 kerberos principal name. principal name 可以在: user/hostname@DOMAIN 中获取. 如果 “_HOST” 被用做hostname portion,需要使用实际运行的hostname来替代它。
默认:

hbase.regionserver.keytab.file
HRegionServer验证登录使用的kerberos keytab 文件路径。
默认:

hbase.regionserver.kerberos.principal
例如. “hbase/_HOST@EXAMPLE.COM”. HRegionServer运行需要使用 kerberos principal name. principal name 可以在: user/hostname@DOMAIN 中获取. 如果 “_HOST” 被用做hostname portion,需要使用实际运行的hostname来替代它。在这个文件中必须要有一个entry来描述 hbase.regionserver.keytab.file
默认:

zookeeper.session.timeout
ZooKeeper 会话超时.Hbase把这个值传递改zk集群,向他推荐一个会话的最大超时时间。详见http://hadoop.apache.org/zookeeper/docs/current/zookeeperProgrammers.html#ch_zkSessions “The client sends a requested timeout, the server responds with the timeout that it can give the client. “。 单位是毫秒
默认: 180000

zookeeper.znode.parent
ZooKeeper中的Hbase的根ZNode。所有的Hbase的ZooKeeper会用这个目录配置相对路径。默认情况下,所有的Hbase的ZooKeeper文件路径是用相对路径,所以他们会都去这个目录下面。
默认: /hbase

zookeeper.znode.rootserver
ZNode 保存的 根region的路径. 这个值是由Master来写,client和regionserver 来读的。如果设为一个相对地址,父目录就是 ${zookeeper.znode.parent}.默认情形下,意味着根region的路径存储在/hbase/root-region- server.
默认: root-region-server

hbase.zookeeper.quorum
Zookeeper 集群的地址列表,用逗号分割。例 如:”host1.mydomain.com,host2.mydomain.com,host3.mydomain.com”.默认是 localhost,是给伪分布式用的。要修改才能在完全分布式的情况下使用。如果在hbase-env.sh设置了HBASE_MANAGES_ZK, 这些ZooKeeper节点就会和Hbase一起启动。
默认: localhost

hbase.zookeeper.peerport
ZooKeeper节点使用的端口。详细参见:http://hadoop.apache.org/zookeep … ReplicatedZooKeeper
默认: 2888

hbase.zookeeper.leaderport
ZooKeeper用来选择Leader的端口,详细参见:http://hadoop.apache.org/zookeep … ReplicatedZooKeeper
默认: 3888

hbase.zookeeper.property.initLimit
ZooKeeper的zoo.conf中的配置。 初始化synchronization阶段的ticks数量限制
默认: 10

hbase.zookeeper.property.syncLimit
ZooKeeper的zoo.conf中的配置。 发送一个请求到获得承认之间的ticks的数量限制
默认: 5

hbase.zookeeper.property.dataDir
ZooKeeper的zoo.conf中的配置。 快照的存储位置
默认: ${hbase.tmp.dir}/zookeeper

hbase.zookeeper.property.clientPort
ZooKeeper的zoo.conf中的配置。 客户端连接的端口
默认: 2181

hbase.zookeeper.property.maxClientCnxns
ZooKeeper的zoo.conf中的配置。 ZooKeeper集群中的单个节点接受的单个Client(以IP区分)的请求的并发数。这个值可以调高一点,防止在单机和伪分布式模式中出问题。
默认: 2000
hbase.rest.port
HBase REST server的端口
默认: 8080
hbase.rest.readonly
定义REST server的运行模式。可以设置成如下的值: false: 所有的HTTP请求都是被允许的 – GET/PUT/POST/DELETE. true:只有GET请求是被允许的
默认: false

8.6、hadoop 根据SecondaryNameNode恢复Namenode
1、修改conf/core-site.xml
增加 fs.checkpoint.period
3600
The number of seconds between two periodic checkpoints.
fs.checkpoint.size
67108864
The size of the current edit log (in bytes) that triggers a periodic checkpoint even if the fs.checkpoint.period hasn’t expired.
fs.checkpoint.dir
/data/work/hdfs/namesecondary
Determines where on the local filesystem the DFS secondary name node should store the temporary images to merge. If this is a comma-delimited list of directories then the image is replicated in all of the directories for redundancy.
fs.checkpoint.period表示多长时间记录一次hdfs的镜像。默认是1小时。
fs.checkpoint.size表示一次记录多大的size,默认64M
2、修改conf/hdfs-site.xml
增加 dfs.http.address
master:50070
The address and the base port where the dfs namenode web ui will listen on. If the port is 0 then the server will start on a free port.
0.0.0.0改为namenode的IP地址
3、重启hadoop,然后检查是否启动是否成功
登录secondarynamenode所在的机器,输入jps查看secondarynamenode进程
进入secondarynamenode的目录/data/work/hdfs/namesecondary
正确的结果:
如果没有,请耐心等待,只有到了设置的checkpoint的时间或者大小,才会生成。
4、恢复
制造namenode宕机的情况
1) kill 掉namenode的进程
[root@master name]# jps
11749 NameNode
12339 Jps
11905 JobTracker
[root@master name]# kill 11749
2)删除dfs.name.dir所指向的文件夹,这里是/data/work/hdfs/name
[root@master name]# rm -rf *
删除name目录下的所有内容,但是必须保证name这个目录是存在的
3)从secondarynamenode远程拷贝namesecondary文件到namenode的namesecondary
[root@master hdfs]# scp -r slave-001:/data/work/hdfs/namesecondary/ ./
4)启动namenode
[root@master /data]# hadoop namenode –importCheckpoint
正常启动以后,屏幕上会显示很多log,这个时候namenode就可以正常访问了
5)检查
使用hadoop fsck /user命令检查文件Block的完整性
hadoop fsck /
6)停止namenode,使用ctrl+C或者会话结束
7)删除namesecondary目录下的文件(保存干净)
[root@master namesecondary]# rm -rf *
8)正式启动namenode
[root@master bin]# ./hadoop-daemon.sh start namenode
恢复工作完成,检查hdfs的数据
9)balancer
在使用start-balancer.sh时,
默认使用1M/S(1048576)的速度移动数据(so slowly…)
修改hdfs-site.xml配置,这里我们使用的是20m/S dfs.balance.bandwidthPerSec
20971520
Specifies the maximum bandwidth that each datanode can utilize for the balancing purpose in term of the number of bytes per second.
然后结果是导致job运行变得不稳定,出现一些意外的长map单元,某些reduce时间处理变长(整个集群负载满满的情况下,外加20m/s的balance),据说淘宝的为10m/s,需要调整后实验,看看情况如何。

8.7、Hadoop调优
1、修改:/etc/security/limits.d/90-nproc.conf
sudo vi /etc/security/limits.d/90-nproc.conf
添加以下内容:
* soft nproc 10240
root soft nproc unlimited

2、调整 Linux 参数来避免swap,可能解决ZooKeeper 的 session 过期的问题
# echo “vm.swappiness = 0” >> /etc/sysctl.conf
注意:系统需要重新启动。

3、配置/etc/security/limits.conf
sudo vim /etc/security/limits.conf
在文件尾追加
* hard nofile 40960
* soft nofile 40960
* soft noproc 32000
* hard noproc 32000
* soft stack 8192
* hard stack 8192

关于Zeno Chen

本人涉及的领域较多,杂而不精 程序设计语言: Perl, Java, PHP, Python; 数据库系统: MySQL,Oracle; 偶尔做做电路板的开发,主攻STM32单片机
此条目发表在NoSQL分类目录。将固定链接加入收藏夹。