ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CDH版HBase安装配置实战:从版本号拆解到底层原理

CDH版HBase安装配置实战:从版本号拆解到底层原理 简介面向Ambari 2.7.5离线编译与部署场景这里整理的是HBase 2.0.2.3.1.4.0-315二进制发行包。官方源下载缓慢将其提前打包成tar.gz格式能大幅减少整个编译过程的等待时间。包内共412个文件整体约211.57MB其中以194个jar运行库为主同时包含158个rb脚本、17个sh管理脚本以及xml、properties、cmd等配置与辅助文件兼顾跨平台环境适配完整覆盖HBase的核心运行、环境参数配置、服务启停操作等环节另外还有少量css、html、js等界面静态资源可用于自带管理页面。这份资源比较适合需要在内网环境搭建HDP大数据平台、基于Ambari做二次开发或离线安装HBase的工程师。目前已有2191人学习/下载且压缩包内目录结构贴近原生发布布局便于在同类编译场景中对照默认配置进行调优和排障。解压后即可得到完整目录和脚本能够直接接入Ambari组件源规避外网拉包超时、断流等常见问题。 说实话第一次看到hbase-2.0.2.3.1.4.0-315-bin.tar.gz这个文件名很多人会直接开始解压然后照着Apache官网一篇HBase 2.0.2的文档去配结果各种连不上、起不来。这不是操作问题而是没看透这个包的真实身份。这个文件名里的每一个字段都在告诉你它是个CDH发行版不是Apache原版它对应一套完整的大数据生态不是单个数据库。这篇博文就从这个包出发把安装、配置、启动、集群扩展、排错思路完整捋一遍顺手把HBase面试里高频问到的底层原理也讲明白。1. 拿到这个包先别急着解压版本号里藏的信息hbase-2.0.2.3.1.4.0-315-bin.tar.gz拆开来看是几段信息最前面是软件名hbase紧接着的2.0.2是Apache HBase的上游版本号3.1.4.0是CDH的发行版本号最后的315是Cloudera自己打的补丁级别bin表示这是编译好的二进制发行版不需要源码编译解压就能跑。tar.gz是打包格式tar负责把多个文件归档成一个文件gzip负责压缩这个是通用知识不过多解释。比较关键的是2.0.2和3.1.4.0这两个数字的组合。HBase 2.0.x 这条线相比1.x变化很大引入了Region Replica多副本读、Offheap读路径、异步WAL等特性。而3.1.4.0说明这是Cloudera在其CDH 6.x版本中同步维护的编译产物。Cloudera会针对自家发行版修复上游bug、做兼容性测试所以在生产环境里如果没有特殊原因用CDH版比用Apache原版稳很多。还有一个细节值得注意CDH版HBase和Apache原版在配置路径上大致相同但依赖的Hadoop版本、ZooKeeper版本是锁定的。CDH 6.x对应Hadoop 3.0.x、ZooKeeper 3.4.x这条线它自带的lib目录里已经内置了匹配的客户端jar包。如果你把它拆出来配到一个装了其他Hadoop版本的集群上很容易出现RPC协议不兼容、ClassNotFound之类的幺蛾子。这是很多人踩坑的第一处拿CDH的包去配合Apache Hadoop或者反过来。那么什么场景下可以用这个包本地开发环境、测试集群、技术验证都可以。生产环境如果已经用了CDH全家桶Cloudera Manager管理直接用CM下发的版本即可如果是裸机部署且整个技术栈自维护用这个包也没问题前提是统一好上层的Hadoop和ZooKeeper版本。2. 解压与前置依赖为什么hbase-env.sh里必须写JAVA_HOME先看解压和基础落地步骤tar -zxvf hbase-2.0.2.3.1.4.0-315-bin.tar.gz mv hbase-2.0.2.3.1.4.0-315 /opt/hbase export HBASE_HOME/opt/hbase export PATH$PATH:$HBASE_HOME/bin解压之后的目录结构要心里有数bin里是启动脚本conf里是配置文件lib里是HBase自己依赖的第三方jar包包括Hadoop客户端、ZooKeeper客户端、guava等logs目录第一次启动后才会生成。排错时看日志主要看logs/下的hbase-hbase-master-*.log或者hbase-hbase-regionserver-*.log这个习惯要建立起来。接下来是最容易忽略的前置依赖。HBase 2.0.2要求JDK 8这是硬性要求Java 11跑2.0.x会有各种诡异的类加载问题。很多人的机器上已经装了JDK但PATH里指向的版本可能不对所以必须在conf/hbase-env.sh里显式指定export JAVA_HOME/usr/local/jdk1.8.0_202 export HBASE_MANAGES_ZKfalseJAVA_HOME为什么必须写死因为HBase的启动脚本默认是调用which java来定位JDK的如果系统PATH里同时存在多个JDK或者java命令不在PATH里脚本就会启动失败报错信息却不直观经常是日志刚打两行就退出。写死是最稳妥的这也是一个老运维的习惯不要依赖环境继承所有环境变量在组件自己的脚本里明确写一遍。再说HBASE_MANAGES_ZK。这个参数控制HBase是否自己启动一个内嵌的ZooKeeper。测试阶段图省事可以设为trueHBase会在启动时自动拉起一个ZK进程5000端口直接对外服务。但真实环境一定要设成false理由很简单内嵌的ZK生命周期跟着HBase走HBase重启ZK就重启生产环境要求ZK独立稳定运行另外大数据集群里HDFS、Kafka等组件通常复用同一个ZK集群如果HBase内嵌一个ZK端口、数据目录都容易冲突。跑单机测试用内嵌ZK没问题跑集群就别偷懒了。3. hbase-site.xml参数逐个拆每个配置背后对应的启动行为conf/hbase-site.xml是HBase最核心的配置文件。下面这个配置是我在测试环境里验证过的配合CDH版HBase 2.0.2可以正常拉起单机集群configuration property namehbase.rootdir/name valuehdfs://localhost:8020/hbase/value /property property namehbase.cluster.distributed/name valuetrue/value /property property namehbase.zookeeper.quorum/name valuelocalhost/value /property property namehbase.zookeeper.property.clientPort/name value2181/value /property /configuration逐个拆这几个参数。hbase.rootdir指定HBase在HDFS上的存储根目录。这里的hdfs://localhost:8020/hbase表示HDFS的NameNode地址和端口/hbase是根目录路径。注意这个目录必须是HBase专用的不能和其他组件共享否则元数据表的数据文件和其他数据混在一起后续做清理或备份时会非常痛苦。单机测试如果没装HDFS也可以写成file:///opt/hbase-data但这是本地文件系统模式只能用来跑通流程一旦切到hbase.cluster.distributedtrue的分布式模式rootdir必须指向HDFS路径。hbase.cluster.distributed这个参数字面意思很容易误读成是否启用分布式实际上它指的是运行模式。false对应standalone模式HBase自己起一个本地文件系统上的实例不依赖HDFS、不依赖外部ZK适合快速体验true对应分布式模式此时HBase才会去找HDFS和ZK。很多人配置后进程能起来但运行status命令时报一堆连接错误就是这里填反了。hbase.zookeeper.quorum填写的是ZK集群地址逗号分隔。比如三台ZK节点就是node1,node2,node3。为什么通常只填奇数个节点而不是全部因为ZK的leader选举基于多数派quorum机制3节点容1节点故障5节点容2节点故障奇数节点就够了。另外注意这里填的是ZK的host不是HBase机器自身的host更不是把2181端口也写在里面写端口是另一个参数hbase.zookeeper.property.clientPort干的事默认2181。配置完成后有两个经典启动失败场景值得提前说。第一个是Master进程起来后几秒就退出日志里反复出现读写ZK超时的错误这种大概率是hbase.zookeeper.quorum写错了或者ZK没起。第二个是RegionServer进程起不来日志里报权限问题通常是hbase.rootdir指向的HDFS目录没有写权限需要先hdfs dfs -mkdir -p /hbase并授权。这两个坑我在不同环境的部署中反复见到建议启动前先手动创建好目录并确认权限。4. 启动验证与完整端口清单数据能写进去才算成功配置完之后分布式模式下启动的先后顺序有讲究先确认HDFS存活再确认ZK存活最后才执行HBase的启动脚本。start-dfs.sh # 启动HDFSHadoop环境 zkServer.sh start # 启动ZooKeeper独立ZK环境 start-hbase.sh # 启动HBase启动后用jps验证进程。正常情况下能看到两个关键进程3652 HMaster 3820 HRegionServer如果是standalone模式内嵌ZK 本地文件系统还可能看到HQuorumPeer进程。如果只看到HMaster没有HRegionServer说明RegionServer没被成功拉起去logs目录看hbase-hbase-regionserver-*.log的报错。进程在只是第一步数据能写进去才算真成功。用HBase Shell做一个完整的写入和查询测试hbase shellstatus create test_table, cf put test_table, row1, cf:name, zhangsan scan test_table get test_table, row1如果status显示正常建表、put、scan、get都能返回正确结果说明集群核心链路OK。scan是验证RegionServer读取路径的关键操作如果scan卡住或超时多半是RegionServer和HDFS之间的连接有问题优先检查HDFS的NameNode状态。这里要特别整理一下HBase 2.x的端口清单因为从1.x到2.xHBase的默认端口全变了。1.x时代Master RPC是60000、Master Web UI是60010、RegionServer RPC是60020、RegionServer Web UI是600302.x改成了16000、16010、16020、16030。运维时照着1.x文档去排查2.x集群很容易白白查半天。端口服务名称用途说明16000HBase Master RPC客户端和RegionServer与Master通信的RPC端口16010HBase Master Web UIMaster管理页面可查看region分布、进程状态16020RegionServer RPC数据读写核心RPC端口16030RegionServer Web UI查看单个RegionServer的region列表和请求延迟2181ZooKeeper clientPortHBase与ZooKeeper通信、协调、元数据定位8080HBase REST服务可选需要单独用hbase rest start启9090HBase Thrift服务可选需要单独用hbase thrift start启Web UI是排查和观察的最直观入口Master页面地址http://master节点:16010能看RegionServer存活列表、region数量分布、请求数RegionServer页面地址http://rs节点:16030能看单个节点的读写QPS、BlockCache命中率、MemStore大小。我一般启动完集群之后第一件事就是开16010看是否所有RegionServer都注册上来了这个信息比任何命令都快。5. 从单机折腾到集群配置文件之外最容易忽略的三个环境问题单机没问题之后大家都会想往多节点扩展。除了修改conf/regionservers文件一行一个RegionServer主机名、把配置目录同步到所有节点之外还有三个环境层面的问题几乎每个初次搭集群的团队都会踩。第一个是/etc/hosts和 hostname 不一致的问题。HBase的Master启动后会对RegionServer的主机名做反向解析如果hosts里没配对应的映射会直接导致RegionServer从启动那一刻起就无法正常向Master上报状态。它的现象很有迷惑性jps看RegionServer进程是活着的但Master的Web UI里RegionServer列表是空的或者显示为unknown。解决方法是把集群所有节点的hostname和IP写进每一台机器的/etc/hosts保持所有节点文件一致。这个步骤要在启动前做而不是启动后。第二个是时钟同步。HBase的Master和RegionServer之间通过心跳维持状态如果节点间时间偏差过大会出现心跳超时、误判宕机、WAL分发异常等问题。单机没这个问题多节点一上就冒出来了。标准做法是配置NTP或chrony同步所有节点指向同一个时间源。这个基础工作很多团队是出问题之后才补的。第三个是文件句柄数和进程数限制。RegionServer每个Region有多个HFile文件句柄加上写WAL、读HDFS副本高负载下一个RegionServer打开的文件数远超系统默认值。需要在/etc/security/limits.conf里给运行HBase的用户调高nofile和nproc修改后要重新登录或重启进程才生效。同步到所有节点之后用ulimit -n验证。还有一个容易被忽略的点start-hbase.sh从Master节点通过SSH远程拉起RegionServer所以Master到各RegionServer之间必须配好SSH免密登录否则启动时只会拉起Master本机的RegionServer远程节点静默失败。这些环境问题单个看都不难但它们往往同时出现排查时又很容易互相掩盖。我建议搭集群时按这个顺序检查hosts → 时钟 → SSH免密 → 文件句柄 → 数据目录权限 → 配置同步。顺序对了故障率能降一大半。6. 把部署时的故障反推回底层原理顺带整理的HBase高频面试思路跑通了HBase之后很多问题从现象往原理里想一层理解就完全不同了。这里结合部署和运维中真实出现过的故障把HBase面试里高频问到的几个底层机制一并讲清楚。写数据为什么先写WAL部署时如果RegionServer异常宕机数据主要靠WALWrite-Ahead Log预写日志来保证不丢。客户端写入时RegionServer先把写操作追加到WAL日志再写入内存中的MemStore当MemStore达到阈值默认128MB后刷成HFile落盘。如果没写WAL就直接写MemStoreRegionServer一断电内存数据全丢。这也是为什么HBase的写性能相比传统关系型数据库看起来没有想象中那么快——先写一份顺序日志是有代价的但换来了可靠性。面试时这个点可以扩展WAL是顺序写MemStore是内存写两者配合才做到高吞吐不丢数据。RegionServer宕机了数据怎么恢复生产环境中最常见的故障之一就是RegionServer进程挂掉或节点宕机。HBase的恢复机制是Master通过ZooKeeper监听每个RegionServer的会话状态一旦会话超时Master就会把宕机RegionServer上的WAL按region切分成小块分发给其他存活RegionServer去重放replay把内存里的数据恢复出来后重新接管region。这个过程叫做Log Replay。单台RegionServer挂掉时其上的数据通常可以做到分钟级恢复但读请求会短暂受影响。理解了这套机制再回头看hbase.zookeeper.quorum为什么要配置独立稳定的ZK集群就更容易理解ZK在HBase架构中承担了心跳 协调 元数据的多重角色。表热点问题与RowKey设计。集群起来之后最常见的性能问题就是某张表写入或读取集中在某一个Region上导致一台RegionServer压力巨大其他节点闲着。这就是热点问题根源绝大多数出在RowKey设计上。比如RowKey如果直接用用户ID加时间戳且用户ID都是连续递增的那么新写入的数据全部落在最后一个Region上。面试常问的解法有三类加盐给RowKey加随机前缀、哈希对RowKey做散列、反转把时间戳字段反转。但我实际经验是没有一个通用解法必须结合具体的查询模式来设计。加盐解决了写入热点却牺牲了范围扫描的有序性反转适合主键后缀区分度高的场景。回答面试题时能讲出这种取舍关系比背出三种方案要加分很多。为什么scan比get慢这其实牵涉到HBase的存储结构HFile内部是按RowKey有序排列的get操作可以通过索引直接定位到目标KeyValue而scan需要遍历一定范围内的所有KeyValue涉及多个HFile的合并扫描、BlockCache加载等。从面试角度这里还能扩展到LSM树思想写入是顺序的MemStore HFile读取需要从多级存储中合并查询所以HBase的写入吞吐量远高于读取延迟优势——这个特性决定了它适合写密集、海量数据、简单查询的场景。Region数量与集群性能的关系。部署中很多人会下意识地创建很多小表、或者让一张表的region数量不断膨胀结果发现集群整体性能反而越来越差。原因在于每个Region都有对应的MemStoreRegion太多会导致MemStore总大小过大、flush频繁、compaction不断HDFS上的小文件数量激增最终拖垮RegionServer。经验值是单台RegionServer上region数量控制在1000以内比较合理单Region大小如果增长太快可以预分区或者调整hbase.hregion.max.filesize默认10GB来控制split时机。这个点在实际面试中经常被包装成如何评估一个RegionServer能支撑多少数据量来问。把部署中踩过的坑反向对应到原理上是一个很朴素但很有用的方法。比如启动时Master和RegionServer反复握手失败背后是对ZK协调机制的认知不足RegionServer频繁OOM背后是对MemStore和BlockCache内存配比的认识。HBase这套系统配置参数只是表面的操作真正让你能从容应对生产事故的是理解了它每个组件为什么存在、每个配置为什么这样设计。这也是我建议所有刚接触HBase的人不要满足于集群能跑起来而是顺着日志和报错多问几个为什么的原因。本文还有配套的精品资源点击获取
返回列表