大数据集群踩过的坑
前言(必看)
如果你遇到了和我一样的问题并通过搜索引擎进入这篇文章,请善用Ctrl+F键搜索
该自检手册仅用于自己学习使用,记录所有自己遇到的问题。如果你没有检索到你的问题,请使用Bing或Google进行搜索
该自检手册严格按照以下模板标准编写:
## 主要出错集中点标题
### 该错误的具体分支错误
报错信息
code
==原因:(若分点则另起一行)==
![出错截图](ERROR.jpg/png)
> 提示信息:(若有则写,没有就不写)
==解决方法:(若分点则另起一行)==
![解决成功后的截图](RESOLVE.jpg/png)
> 提示信息:(若有则写,没有就不写)
关键词:xxx、xxx
参考资料:(若分点则另起一行)
补充:
1. 若需要编写注意事项,统一使用<font size=5 color=red>标签编写
1. HDFS
1.1 hdfs namenode -format 格式化错误
报错信息
java.io.IOException: Cannot create directory /usr/local/hadoop/tmp/dfs/name/current
原因:
- 在
core-site.xml
文件中hadoop.tmp.dir
的 value 标签参数值设置错误 - 在
hdfs-site.xml
文件中dfs.namenode.name.dir
或dfs.datanode.data.dir
的 value 标签参数值设置错误 - 当前登录的用户不具有
hadoop
文件夹的访问与写入权限
解决方法(对应上面的1、2、3点):
-
修改
core-site.xml
存放临时文件夹的路径,这里我的目录名是hadoop-3.1.3
-
修改
hdfs-site.xml
存放 name 和 data 文件夹的路径,这里我的目录名是hadoop-3.1.3
-
使用
sudo chown -R 用户名:用户名 存放hadoop的文件路径
命令对文件夹提权例如:sudo chown -R hadoop:hadoop /usr/local/hadoop
注意:格式化的操作在你成功格式化之后就不要再执行了!不要好奇,除非你想再体验一次集群的搭建。再次执行格式化,成功
提示:其实最正确的做法是文件名需要改成
hadoop
而不是hadoop-3.1.3
,这样便于管理与执行
关键词:java.io.IOException: Cannot create directory、hdfs namenode -format、格式化错误、CentOS7、Linux
参考资料:
- Hadoop格式化namenode错误:java.io.IOException: Cannot create directory_cannot create directory /opt/cloudera/parcels/sche
- directory - hadoop java.io.IOException: while running namenode -format - Stack Overflow
2. HBase
2.1 使用 HBase 命令显示 jar 包冲突
报错信息
SLF4J: Found binding in
[jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hbase/lib/client-facing-thirdparty/slf4j-reload4j-1.7.33.jar!/org/slf4j/impl/StaticLoggerBinder.class]
原因:
- 由于在 HBase 中使用了两个不同版本的 SLF4J 日志框架的 StaticLoggerBinder 类,分别来自 Hadoop 的 slf4j-log4j12-1.7.25.jar 和 HBase 的 slf4j-reload4j-1.7.33.jar。这导致了类版本冲突,因为相同类的不同版本无法同时存在,从而导致了类加载失败和错误提示的出现
解决方法:
-
✅推荐 在
hbase-env.sh
中添加export HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP="true" 添加完成后退出编辑界面,在bash命令窗口输入 source hbase-env.sh
原理是告诉 HBase 不要使用 Hadoop 的 classpath 来加载依赖项。这可以确保 HBase 使用自己的 classpath,避免与 Hadoop 中的库发生冲突
-
⚠️不推荐 删除
hadoop
或hbase
其中一个 jar 包,原则上删除版本较低的那一个注意:执行删除操作之前建议先备份,备份后再执行。rm命令需要精准指向该jar包
例如:sudo rm /usr/local/hbase/lib/client-facing-thirdparty/slf4j-reload4j-1.7.33.jar
再次查看是否会出现 jar 包的冲突信息,冲突信息消失,成功解决
关键词:Hbase启动、jar包冲突、SLF4J、HBase、CentOS7、Linux
参考资料:
- [HBASE-11408] “multiple SLF4J bindings” warning messages when running HBase shell - ASF JIRA (apache.org)
- HBase(Hadoop3.1.2 HBase2.2.4) 伪分布式安装与配置
- jar包冲突:Found binding in jar:file:/hadoop-2.7.2/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar
2.2 使用 Hbase shell 时出现 ConnectionLoss for /hbase/master
报错信息
hbase:001:0> create 'student','Sname','Ssex','Sage','Sdept','course'
ERROR: KeeperErrorCode = ConnectionLoss for /hbase/master
For usage try 'help' 'create'
Took 33.9493 seconds
原因:
-
✅我遇到的 我没有安装 Zookeeper,但是在
hbase-site.xml
中错误的配置了有关Zookpeer的标签,导致Hbase shell无法找到Zookeeper文件夹,从而无法操作有关Hbase shell的任何命令<configuration> ... <property> <name>hbase.zookeeper.quorum</name> <value>zk1.example.com,zk2.example.com,zk3.example.com</value> </property> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> </property> ... </configuration>
-
HBase Master 和 ZooKeeper 在不同的节点上运行,防火墙或网络安全组阻止了它们之间的通信
-
没有启动
HBase
的相关服务
解决方法(对应上面的1、2、3点):
- 删除
hbase-site.xml
对应文件里有关于 Zookpeer的标签 - 需要关闭防火墙
先使用systemctl status firewalld
查看防火墙的状态,如果是开着的请使用systemctl stop firewalld
关闭防火墙后,使用命令service firewalld status
检查防火墙服务是否开启,如果是开启的使用命令service firewalld stop
停止防火请的服务进程
- 使用命令
start-hbase.sh
开启hbase
的相关服务
参考资料:
- HBase:Error:KeeperErrorCode=ConnectionLoss for /hbase/master For usage try ‘help‘ ‘disable‘_error: keepererrorcode = connectionloss for /hbase
- KeeperErrorCode = ConnectionLoss for /hbase/master - Cloudera Community - 134130