《HBase企业应用开发实战》—— 2.1 先决条件-阿里云开发者社区

开发者社区> 华章出版社> 正文
登录阅读全文

《HBase企业应用开发实战》—— 2.1 先决条件

简介:

本节书摘来自华章出版社《HBase企业应用开发实战》一 书中的第2章,第2.1节,作者:马延辉 孟鑫 李立松 ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.1 先决条件

在开始安装HBase之前需要做一些准备工作,这涉及操作系统设置、分布式模式Hadoop的部署及HBase自身的配置,因此要确保在运行HBase之前这些条件已经具备。以下将介绍HBase依赖的一些重要的中间件、系统服务或配置。
1.?运行时环境JDK
和Hadoop一样,HBase需要JDK1.6或者更高版本,推荐采用Oracle公司的版本,对于JDK1.6不要使用u18及以前的版本,因为这些版本Java的垃圾收集器会遇到“jvm crash”的问题(可以通过Goolge搜索“jvm crash”找到该问题的详细描述)。为了能够管理超过4GB内存空间,需要安装64位的JDK。
2.?SSH服务
集群模式的HBase的启动或关闭依赖于SSH服务,所以操作系统必须安装该服务,sshd进程必须处于运行状态,可执行以下命令查看服务状态:
service sshd status
HBase通过SSH管理所有节点的守护进程,和Hadoop的NameNode一样,HMaster必须能够免密登录到集群的所有节点,可以通过Google搜索“SSH免密登录”找到如何配置。注意由于HBase通常有多个HMaster节点,所以需要每个HMaster到所有节点都可以免密登录。
3.?域名系统DNS
HBase通过本地主机名(Host Name)或域名(Domain Name)来获取IP地址,因此要确保正向和反向DNS解析是正常的。在进行DNS解析时会首先查询本地/etc/hosts文件,因此建议通过配置该文件指定主机名或域名到IP地址的映射关系而不使用域名解析服务,这样做将更易于维护,当出现主机无法识别的异常时也更加容易定位问题出现的位置,并且通过本地/etc/hosts文件解析IP地址速度也会更快一些。
当决定使用DNS服务的时候,还可以通过如下设置更加精确地控制HBase的行为。
如果有多个网卡,可以通过参数hbase.regionserver.dns.interface指定主网卡,该配置参数的默认值是default,可以通过这个参数指定主网络接口,不过这要求集群所有节点配置是相同的且每台主机都使用相同的网卡配置,可以修改这个配置参数为eth0或eth1,这要视具体的硬件配置而定。
另外一个配置是指定hbase.regionserver.dns.nameserver可以选择一个不同的DNS的name server。
4.?本地环回地址Loopback IP
HBase要求将本地回环接口配置成127.0.0.1,可以在/etc/hosts文件配置,通常系统安装后都已经包含了该配置。
127.0.0.1 localhost
5.?网络时间协议NTP
HBase要求集群中节点间的系统时间要基本一致,可以容忍一些偏差,默认相差30s以内。可以通过设置参数hbase.master.maxclockskew属性值修改最大容忍偏差时间。偏差时间较多时集群会产生一些奇怪的行为。用户需要在集群中运行NTP服务来同步集群的时间,如果在运行正常的集群中读取数据发生了一些莫名其妙的问题,例如读到的不是刚写进集群的数据而是旧的数据,这时需要检查集群各节点间时间是否同步。
6.?资源限制命令:ulimit和nproc
HBase和其他的数据库软件一样会同时打开很多文件。Linux中默认的ulimit值是1024,这对HBase来说太小了。当使用诸如bulkload这种工具批量导入数据的时候会得到这样的异常信息:java.io.IOException:Too many open files。我们需要改变这个值,注意,这是对操作系统的参数调整,而不是通过HBase配置文件完成的,我们可以大致估算ulimit值需要配置为多大,例如:每个列族至少有一个存储文件(HFile),每个被加载的Region可能管理多达5或6个列族所对应的存储文件,用存储文件的个数乘以列族数再乘以每个RegionServer中的Region数量得到RegionServer主机管理的存储文件数量。假如每个Region有3个列族,每个列族平均有3个存储文件,每个RegionServer有100个region,将至少需要3×3×100=900个文件。这些存储文件会频繁被客户端调用,涉及大量的磁盘操作,应根据实际情况调整ulimit参数值的大小。
关于ulimit有两个地方需要调整,通过在/etc/security/limits.conf追加参数进行设置,一个参数是nofile,设置如下:

  • soft nofile 10240
  • hard nofile 10240
    如果没有设置这个参数可能会得到上面说的异常。这个设置表示限制打开的文件数。这个配置不能即时生效,还需通过ulimit –n设置,可以执行下面的命令:

ulimit –n 10240
另外一个参数是noproc,这个配置是限制用户打开的进程数,设置如下:

  • soft noproc 10240
  • hard noproc 10240

该设置可以即时生效,可通过ulimit –c查看。如果不设置noproc可能得到如下异常:
java.lang.OutOfMemoryError: unable to create new native thread
实际上这两个参数对于HDFS和MapReduce也至关重要,应该在启动Hadoop之前就设置好。另外注意这两个参数是针对操作系统用户的,*代表对所有用户生效。
7.?操作系统Windows
和Hadoop一样,HBase在Windows系统下没有经过严格的测试,因此不建议在生产环境中将HBase运行在Windows下,如果想在Windows下安装HBase,需要安装Cygwin。从0.96版本开始,HBase提供了一套.cmd的Windows运行脚本。
8.?Hadoop版本选择
不同版本的HBase依赖于特定的Hadoop版本,第1章的表1-1显示了不同的Hadoop版本对于HBase的支持情况,不管是Apache社区版还是一些商业开源版本(例如Cloudera的CDH或者Hortonworks的HDP),应该选择最合适的Hadoop版本。本书使用的Hadoop版本是1.2.1,HBase版本是0.94.18,ZooKeeper版本是3.4.5。
(1)Hadoopjar包
由于HBase依赖于Hadoop,因此在安装包的lib文件夹下包含了一个Hadoop的核心jar文件,在本书使用的HBase版本的lib目录下包含的是hadoop-core-1.0.4.jar。在分布式模式下,HBase使用的Hadoop版本必须和运行中的Hadoop集群的jar文件版本一致。将运行的分布式Hadoop版本jar文件替换HBase的lib目录下的Hadoop的jar文件,以避免版本不匹配问题。确认替换了集群中所有节点的HBase安装目录下lib目录的jar文件。Hadoop版本不匹配问题有不同表现,但看起来HBase像挂掉了。
(2)Hadoop 2.x优于Hadoop 1.x
Hadoop 2.x的一些改进使得读取数据效率提升,比如short-circuit特性可以显著提升HBase的随机读的性能,所以尽量选择Hadoop 2.x版本。
(3)dfs.datanode.max.xcievers
Hadoop的Datanode有一个用于设置同时处理文件的上限个数的参数,这个参数叫xcievers(Hadoop的作者把这个单词拼错了)。在启动之前,先确认有没有配置Hadoop的conf目录下的hdfs-site.xml中的xceivers参数,默认值是256,这对于一个任务很多的集群来说太小了,至少是4096,一个大型集群通常比这个值还大得多:

<property>
      <name>dfs.datanode.max.xcievers</name>
      <value>4096</value>
</property>

对于HDFS,如果修改此项配置,要记得重启。如果没有这一项配置,可能会遇到奇怪的失败。虽然会在Datanode的日志中看到xcievers exceeded,但是运行起来会报missing blocks错误,例如:

java.io.IOException: xceiverCount 258 exceeds the limit of concurrent xcievers 256

9.?HBase安全
HBase运行在Hadoop上,在Hadoop 1.0.0版本中已经加入最新的安全机制和授权机制(Simple和Kerberos),只要运行的是这之后的版本就可以使用这些安全特性。HBase的安全主要是基于用户、用户组和角色对表(或是更细粒度的列族、列)进行安全检查。在认证方面,它主要是通过Kerberos来完成的,HBase安全的大部分代码是在解决认证的问题,也就是根据用户权限判定其是否有权访问某项资源。
10.?安装ZooKeeper
ZooKeeper是HBase集群的“协调器”,负责解决HMaster的单点问题,以及root表的路由,所以一个独立的ZooKeeper服务是必需的。要确保事先安装好一个ZooKeeper集群。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: