多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

HDP发行版HBase二进制包部署指南:从解压到Sqoop导入验证

HDP发行版HBase二进制包部署指南:从解压到Sqoop导入验证 简介本资源为 Ambari 2.7.5 编译部署场景下提前备好的 HBase 二进制安装包面向正在搭建 Hadoop 生态集群、受困于官方源下载缓慢的运维与大数据开发人员。包内共 412 个文件以 194 个 jar 依赖库、158 个 Ruby 脚本、17 个 shell 启动脚本及若干 xml 配置、css 与 html 前端资源为主压缩包约 211.57MB解压后可直接用于离线安装与版本对齐。内容涵盖 HBase 服务端核心组件、命令行工具与配置模板能帮助读者跳过漫长的在线拉取环节快速完成 Ambari 集成部署与集群调试。目前已有 2194 人学习下载适合需要稳定复现 HBase 2.0.2.3.1.4.0-315 环境、排查依赖缺失与启动异常的中高级用户参考使用。1. 从一个 tar.gz 文件名说起hbase-2.0.2.3.1.4.0-315-bin 到底意味着什么如果你在 Hadoop 生态里干过几年一定见过这种长得像乱码的包名hbase-2.0.2.3.1.4.0-315-bin.tar.gz。第一次看到的人会以为是谁手抖打错了版本号其实这是 Hortonworks Data PlatformHDP的版本命名规则——2.0.2是上游 HBase 的版本3.1.4.0-315是 HDP 自己的发行版号和构建号。换句话说这不是 Apache 官方原版而是某个大数据发行版里被重新编译、打过补丁、绑定了特定依赖的 HBase。很多做 hbase安装与配置 的人拿到这个包直接当成 Apache 原版解压结果启动就报类找不到这就是没搞清包来源的血泪教训。这篇文章要解决的就是拿到这样一个发行版绑定的 HBase 二进制包怎么在集群上把它跑起来、怎么配、怎么验证、出问题怎么查。适合正在做 HBase 集群部署、迁移或者排障的一线运维和开发尤其是那些被 hbase出现master initialing 卡住过的人。我不会假设你手里有源码或者官方文档只按这个包名背后最常见的落地路径来讲。2. 解压之前先想清楚发行版 HBase 和 Apache 原版的差异在哪2.1 为什么不能直接照搬 Apache 官方文档Apache 官网的 HBase 安装文档默认你下载的是hbase-x.y.z-bin.tar.gz依赖的 Hadoop、ZooKeeper 版本都是社区版。但hbase-2.0.2.3.1.4.0-315-bin.tar.gz这种包它内部的lib/目录里已经塞进了发行版自己编译的 Hadoop client jar、ZooKeeper jar、甚至 Kerberos 相关的安全组件。你如果按官方文档去替换 Hadoop 的 jar 包大概率会把发行版验证过的依赖组合打乱出现NoSuchMethodError或者ClassNotFoundException。常见做法是先解压看lib/里都有什么再决定要不要动。我一般会先跑一条命令把关键依赖列出来tar -tzf hbase-2.0.2.3.1.4.0-315-bin.tar.gz | grep -E hbase-.*\.jar|hadoop-.*\.jar|zookeeper-.*\.jar | head -30这条命令只列出压缩包里和 HBase、Hadoop、ZooKeeper 相关的 jar不实际解压。逻辑是先确认发行版自带了哪些依赖避免后面重复引入。参数上-t是列出内容-z是 gzip 解压-f指定文件。如果你看到hadoop-common-2.7.3.2.6.5.0-292.jar这种带发行版后缀的包就说明这个 HBase 是跟特定 Hadoop 版本绑定的不要随便换。2.2 目录结构里藏着的三个关键信息解压之后别急着改配置。先看三个地方conf/、lib/、bin/。conf/里通常已经有一份hbase-site.xml模板但很多发行版会把它放在etc/hbase/conf/下这是 HDP 系的习惯。lib/里除了 HBase 自己的 jar还会有hbase-server-2.0.2.3.1.4.0-315.jar这种带完整版本号的主包。bin/下的hbase脚本里会写死一些环境变量比如HBASE_HOME和JAVA_HOME的检测逻辑。我一般会先执行tar -xzf hbase-2.0.2.3.1.4.0-315-bin.tar.gz -C /opt cd /opt/hbase-2.0.2.3.1.4.0-315 ls conf/ lib/ | head -40解压到/opt是个人习惯生产上通常放在/usr/hdp/或者/data/下。ls看目录内容确认conf下有没有hbase-env.sh和hbase-site.xml。如果没有说明这个包是纯二进制配置需要你自己从发行版的管理工具里生成或者从其他节点拷贝。2.3 选型理由为什么还用 2.0.x 而不是直接上 2.4/2.5很多人会问HBase 都出到 2.5 了为什么还要折腾 2.0.2 这种老版本。原因很现实你所在的集群是 HDP 3.1.4 的HBase 就是 2.0.2你换不了。强行升级 HBase 会导致 HDFS 的 RPC 协议不兼容RegionServer 起不来。所以这个包的价值不在于版本新而在于它和现有 Hadoop 集群的兼容性是被发行版验证过的。如果你是在做新集群那当然可以选 Apache 2.4 或 2.5但如果是维护存量集群这个包就是唯一选择。3. 把 hbase-site.xml 写对四个必调参数和端口清单3.1 核心参数hbase.rootdir 和 hbase.cluster.distributedhbase-site.xml是 HBase 启动时读的第一份配置。对于分布式模式有两个参数必须显式设置否则会退化成单机模式数据写到本地文件系统重启就丢。configuration property namehbase.rootdir/name valuehdfs://mycluster/hbase/value /property property namehbase.cluster.distributed/name valuetrue/value /property property namehbase.zookeeper.quorum/name valuezk1,zk2,zk3/value /property property namehbase.zookeeper.property.dataDir/name value/data/zookeeper/value /property /configurationhbase.rootdir指向 HDFS 上的目录mycluster是你的 HDFS 逻辑名必须和core-site.xml里的fs.defaultFS一致。hbase.cluster.distributed设为true才会走分布式模式。hbase.zookeeper.quorum填 ZooKeeper 集群的节点列表用逗号分隔不要加端口端口由hbase.zookeeper.property.clientPort控制默认 2181。hbase.zookeeper.property.dataDir是 ZooKeeper 的数据目录如果用的是 HBase 自带的 ZooKeeper这个目录必须存在且可写。参数说明hbase.rootdir的路径不要写成hdfs://mycluster:8020/hbase除非你的 HDFS 确实监听在 8020。发行版环境里通常已经配了fs.defaultFS直接写逻辑名更稳妥。hbase.zookeeper.quorum如果写错Master 启动时会卡在master initialing因为连不上 ZooKeeper。3.2 端口清单哪些端口必须通HBase 的端口很多部署时最容易漏掉防火墙规则。下面这张表是我从多次踩坑里整理出来的按角色分角色端口用途HMaster16000HMaster RPCHMaster16010HMaster Web UIRegionServer16020RegionServer RPCRegionServer16030RegionServer Web UIZooKeeper2181客户端连接ZooKeeper2888Leader-Follower 通信ZooKeeper3888Leader 选举HDFS8020NameNode RPCHDFS50070NameNode Web UI部署前用telnet或者nc逐个测一遍。我一般会写个循环for port in 16000 16010 16020 16030 2181 2888 3888 8020; do timeout 2 bash -c echo /dev/tcp/zk1/$port 2/dev/null echo $port open || echo $port closed done这段脚本用 bash 内置的/dev/tcp做端口探测不需要额外装工具。timeout 2防止卡死。如果某个端口 closed先查防火墙和 SELinux再看服务有没有起来。3.3 hbase-env.sh 里必须改的三行hbase-env.sh控制 JVM 和环境变量。发行版包里这个文件通常有一堆注释你只需要改三行export JAVA_HOME/usr/java/jdk1.8.0_181 export HBASE_MANAGES_ZKfalse export HBASE_HEAPSIZE8GJAVA_HOME必须指向 JDK 8HBase 2.0.x 不支持 JDK 11。HBASE_MANAGES_ZK设为false表示用外部 ZooKeeper生产环境几乎都是这样。HBASE_HEAPSIZE根据节点内存调整RegionServer 一般给 8G 到 16GMaster 可以小一点。如果这里写错启动日志里会看到JAVA_HOME is not set或者 ZooKeeper 连接被拒绝。4. 启动顺序与验证从 master initialing 到 region online4.1 先起 ZooKeeper再起 HDFS最后起 HBaseHBase 依赖 ZooKeeper 和 HDFS启动顺序不能乱。如果 ZooKeeper 没起HMaster 会一直卡在master initialing日志里反复刷Connection refused。如果 HDFS 没起hbase.rootdir创建不了Master 会报FileNotFoundException。我一般按这个顺序# 在 ZooKeeper 节点上 zkServer.sh start # 在 NameNode 节点上 hdfs --daemon start namenode hdfs --daemon start datanode # 在 HBase Master 节点上 bin/hbase-daemon.sh start master # 在 RegionServer 节点上 bin/hbase-daemon.sh start regionserverzkServer.sh是 ZooKeeper 自带的脚本路径可能在/usr/hdp/current/zookeeper-server/bin/下。hdfs --daemon start是 Hadoop 2.x 之后的写法老版本用hadoop-daemon.sh start。hbase-daemon.sh是 HBase 的启动脚本start master和start regionserver分别启动对应角色。4.2 验证 Master 和 RegionServer 是否正常启动后别急着建表先看日志和 Web UI。Master 日志在logs/hbase-user-master-hostname.logRegionServer 日志在logs/hbase-user-regionserver-hostname.log。用tail -f盯着看到Master has completed initialization才算成功。RegionServer 看到RegionServer startup complete才算成功。Web UI 更直观Master 的 16010 端口能看到 RegionServer 列表RegionServer 的 16030 端口能看到 Region 分布。如果 Master UI 里 RegionServer 数量是 0说明 RegionServer 没注册上去 RegionServer 日志里找ZooKeeper相关的报错。我常用一条命令快速检查echo status | bin/hbase shellhbase shell的status命令会返回集群的活跃 Master 数量和 RegionServer 数量。如果返回1 active master, 3 servers说明集群正常。如果返回0 servers说明 RegionServer 没起来或者没连上 Master。4.3 建一张表验证读写验证集群能不能用最直接的方法是建表、插数据、查数据bin/hbase shell EOF create test_table, cf put test_table, row1, cf:name, hbase get test_table, row1 disable test_table drop test_table EOFcreate建表test_table是表名cf是列族。put插入一行数据行键是row1列是cf:name值是hbase。get查这一行。disable和drop是清理。如果put报NotServingRegionException说明 Region 还没分配好等几秒重试。如果get返回0 row(s)检查行键和列名有没有写错。5. 避坑与排查WAL 路径、端口冲突和 Master 卡死5.1 WAL 预写日志异常hbase.wal.dir 配错导致 RegionServer 起不来现象RegionServer 启动日志里报Failed to create WAL directory或者java.io.IOException: No space left on device但 HDFS 明明有空间。原因hbase.wal.dir默认指向hbase.rootdir下的/WALs目录但如果你的 HDFS 配额有限或者hbase.rootdir写的是本地路径WAL 就会写到本地磁盘把磁盘写满。发行版环境里WAL 路径经常被单独配到另一个 HDFS 目录。解决在hbase-site.xml里显式设置hbase.wal.dir指向一个有足够空间的 HDFS 路径property namehbase.wal.dir/name valuehdfs://mycluster/hbase-wal/value /property改完重启 RegionServer。如果还是报错检查 HDFS 目录权限确保 HBase 用户有写权限。5.2 端口冲突16020 被其他进程占用现象RegionServer 启动时报BindException: Address already in use端口 16020 被占。原因可能是之前没停干净的 RegionServer 进程或者是其他服务用了同一个端口。用netstat -tlnp | grep 16020查一下。解决如果是残留进程kill -9掉再启动。如果是其他服务改 HBase 的端口property namehbase.regionserver.port/name value16021/value /property同时记得改防火墙规则和客户端配置。5.3 Master 卡在 initialingZooKeeper 连接超时现象HMaster 启动后日志停在master initialing不再往下走Web UI 打不开。原因ZooKeeper 连不上或者hbase.zookeeper.quorum配错了。检查hbase-site.xml里的 quorum 列表确保每个节点都能 ping 通2181 端口开放。解决先用zkCli.sh -server zk1:2181连一下 ZooKeeper看能不能连上。如果连不上查 ZooKeeper 日志。如果连上了检查 HBase 的hbase.zookeeper.property.clientPort是否和 ZooKeeper 实际端口一致。还有一个隐蔽原因hbase.zookeeper.quorum里写了 IP 但 ZooKeeper 绑定的是主机名导致连接被拒。5.4 RegionServer 上线后立即下线HDFS 权限问题现象RegionServer 启动成功但几秒后 Master UI 里就消失了日志里报Permission denied。原因HBase 在 HDFS 上的根目录权限不对通常是hbase.rootdir的 owner 不是 HBase 用户。解决用hdfs dfs -chown -R hbase:hbase /hbase改权限然后重启 RegionServer。如果启用了 Kerberos还要检查 keytab 和 principal 配置。5.5 hbase shell 连不上客户端配置缺失现象在 HBase 客户端节点上执行hbase shell报KeeperErrorCode ConnectionLoss或者Cant get master address from ZooKeeper。原因客户端节点的hbase-site.xml没有配hbase.zookeeper.quorum或者配的 ZooKeeper 地址不对。解决把 Master 节点的hbase-site.xml拷贝到客户端节点的conf/下确保hbase.zookeeper.quorum一致。如果客户端和集群不在同一个网段检查路由和防火墙。6. 进阶技巧用 sqoop 把 MySQL 数据导入 HBase 并验证6.1 sqoop 导入 HBase 的两种模式Sqoop 支持两种方式往 HBase 导数据一种是直接--hbase-tableSqoop 会调用 HBase 的 API 写入另一种是先导到 HDFS再用ImportTsv或者自定义 MR 写入。前者简单后者适合大数据量。我一般先用第一种验证通路sqoop import \ --connect jdbc:mysql://mysql-host:3306/testdb \ --username root \ --password-file /user/hbase/mysql.pwd \ --table users \ --hbase-table user_hbase \ --column-family cf \ --hbase-row-key id \ --hbase-create-table \ -m 1--connect是 MySQL 连接串--table users是源表--hbase-table user_hbase是目标 HBase 表--column-family cf指定列族--hbase-row-key id用 MySQL 的 id 列作为行键--hbase-create-table自动建表-m 1用一个 map 任务避免并发写入冲突。参数说明--password-file比--password安全文件权限要设为 400。--hbase-row-key如果不指定Sqoop 会用所有列拼成行键通常不是你要的。-m 1在验证阶段够用生产上可以调大但要注意 HBase 的写入压力。6.2 导入后怎么验证数据一致性导入完成后别只看 Sqoop 的退出码。用 HBase shell 查几行bin/hbase shell EOF count user_hbase scan user_hbase, {LIMIT 5} EOFcount统计行数和 MySQL 的select count(*)对比。scan看前 5 行检查列族和列名有没有乱码。如果count是 0说明 Sqoop 没写进去去 YARN 的 Application 日志里找hbase相关的报错。如果行数对但列值不对检查 MySQL 的字段类型和 HBase 的列族映射。6.3 一个我踩过的坑时间戳列被当成行键有一次导入 MySQL 的订单表Sqoop 默认把第一个列当行键结果第一个列是created_at时间戳导致大量行键冲突数据被覆盖。后来显式指定--hbase-row-key order_id才解决。所以导入前一定要确认行键列的唯一性别让 Sqoop 自己猜。6.4 验证 WAL 是否正常写入导入过程中RegionServer 会写 WAL。验证 WAL 是否正常可以看hbase.wal.dir下的文件hdfs dfs -ls /hbase-wal/default/user_hbase如果看到.wal文件在滚动说明 WAL 正常。如果目录是空的检查hbase.wal.dir配置和 RegionServer 日志。WAL 异常是 HBase 最危险的问题之一轻则数据丢失重则 RegionServer 起不来。我一般会在导入前后各查一次 WAL 目录确认没有异常。6.5 我的习惯每次部署完先跑一遍冒烟测试折腾了这么多次 HBase 部署我养成了一个习惯不管多急部署完先跑一遍冒烟测试——建表、插数据、查数据、删表再跑一个 Sqoop 导入。这套流程走通才敢把集群交给业务方。希望帮到你。本文还有配套的精品资源点击获取
返回列表