如何配置HBase适配HDFS 3.1.0集群?解决hsync报错
解决HBase 2.0.0适配HDFS 3.1.0的兼容问题
嘿,我之前刚好踩过HBase和高版本HDFS兼容的坑,针对你遇到的hsync报错和jar包疑问,给你一步步梳理可行的方案:
核心结论:不用全量替换Hadoop Jar包
你完全不需要替换所有hadoop-*-2.7.4.jar,只需要替换HBase依赖的Hadoop核心组件Jar(也就是和HDFS、Common、MapReduce相关的几个关键Jar),其他无关的Jar保留原样即可。
具体操作步骤
1. 先停止HBase集群
执行命令彻底关停所有HBase进程:
stop-hbase.sh
2. 清理HBase Lib目录中的旧Hadoop Jar
进入HBase的lib目录,删除以下2.7.4版本的旧Jar(删除前建议备份到其他目录,方便回滚):
hadoop-common-2.7.4.jarhadoop-hdfs-2.7.4.jarhadoop-mapreduce-client-core-2.7.4.jarhadoop-auth-2.7.4.jarhadoop-client-2.7.4.jar
3. 拷贝HDFS 3.1.0对应的核心Jar到HBase Lib
从你的HDFS 3.1.0集群的$HADOOP_HOME/lib目录中,拷贝以下同版本Jar到HBase的lib目录:
hadoop-common-3.1.0.jarhadoop-hdfs-3.1.0.jarhadoop-mapreduce-client-core-3.1.0.jarhadoop-auth-3.1.0.jarhadoop-client-3.1.0.jar
4. 修改HBase配置适配HDFS 3.1.0
编辑HBase的conf/hbase-site.xml,添加或修改以下配置项:
<!-- 指定HDFS 3.1.0的HBase根目录 --> <property> <name>hbase.rootdir</name> <value>hdfs://你的NameNode主机名:9000/hbase</value> </property> <!-- 让HBase读取HDFS原生配置,避免参数不兼容 --> <property> <name>hbase.hadoop.configuration</name> <value>/path/to/你的Hadoop 3.1.0/etc/hadoop</value> </property> <!-- 替换WAL实现以适配HDFS 3.x的hsync逻辑 --> <property> <name>hbase.wal.provider</name> <value>asyncfs</value> </property>
5. 启动HBase集群并验证
执行启动命令:
start-hbase.sh
之后做两项验证:
- 查看
$HBASE_HOME/logs目录下的HMaster、RegionServer日志,确认没有hsync相关报错 - 用
hbase shell创建测试表并读写数据,比如:
create 'test_table', 'cf' put 'test_table', 'row1', 'cf:col1', 'value1' scan 'test_table'
如果能正常完成读写操作,说明兼容配置成功。
为什么会出现hsync报错?
HDFS 3.x对hsync()方法的底层实现做了调整,而HBase 2.0.0默认适配的是HDFS 2.x的同步逻辑。替换Jar并将WAL provider改为asyncfs后,HBase会使用适配HDFS 3.x的同步机制,从而解决这个报错。
内容的提问来源于stack exchange,提问作者Rock
相关产品推荐
相关产品推荐

