hadoop:slf4j-log4j12-1.7.5.jar 和 hdfs dfs -put 问题的解决

本文记录了在使用Hadoop和HBase过程中遇到的问题及解决办法,包括因类路径中存在多个SLF4J绑定导致的问题以及文件复制时遇到的数据节点不足问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题1:

[root@master hadoop-2.6.0]# hdfs dfs -mkdir -p /bigdatacase
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hadoop-2.6.0/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/fhx/hbase-1.2.4/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

解决方法:

/home/fhx/hbase-1.2.4/lib/  rm -rf  slf4j-log4j12-1.7.5.jar

注意看报错内容
类路径含有多个slf4j-log4j12-1.7.5.jar
本来应该是hadoop路径下的,hbase也有,造成了困扰,因此找到Hbase下的slf4j-log4j12-1.7.5.jar并删除

问题2

[root@master hadoop-2.6.0]# hdfs dfs -put /usr/local/bigdatacase/dataset/user_table.txt /bigdatacase/dataset
17/12/10 14:07:49 WARN hdfs.DFSClient: DataStreamer Exception
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /bigdatacase/dataset/user_table.txt._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1).  There are 0 datanode(s) running and no node(s) are excluded in this operation.
    at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:1549)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:3200)
    at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:641)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:482)
    at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:619)
    at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:962)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2039)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2035)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
    at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2033)

    at org.apache.hadoop.ipc.Client.call(Client.java:1468)
    at org.apache.hadoop.ipc.Client.call(Client.java:1399)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:232)
    at com.sun.proxy.$Proxy9.addBlock(Unknown Source)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.addBlock(ClientNamenodeProtocolTranslatorPB.java:399)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:187)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
    at com.sun.proxy.$Proxy10.addBlock(Unknown Source)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.locateFollowingBlock(DFSOutputStream.java:1532)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1349)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:588)
put: File /bigdatacase/dataset/user_table.txt._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1).  There are 0 datanode(s) running and no node(s) are excluded in this operation.

解决方法:

将hadoop数据区赋予写的权限

找了好多解决方案均无效,最后被修改权限拯救

SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/opt/spark/spark-2.4.0-bin-hadoop2.7/jars/slf4j-log4j12-1.7.16.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/opt/Hadoop/hadoop-2.7.2/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/opt/hbase-1.2.6/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory] 25/03/21 15:50:53 WARN Utils: Your hostname, master resolves to a loopback address: 127.0.0.1; using 192.168.180.130 instead (on interface ens33) 25/03/21 15:50:53 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address 25/03/21 15:50:53 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Setting default log level to "WARN". To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel). 25/03/21 15:50:56 WARN FileStreamSink: Error while looking for metadata directory. Traceback (most recent call last): File "/home/abz/PycharmProjects/untitled1/2024.10.22.test.py", line 6, in <module> df = spark.read.csv("传媒综合.csv", header=True, inferSchema=True, sep="|", encoding='utf-8') File "/opt/spark/spark-2.4.0-bin-hadoop2.7/python/pyspark/sql/readwriter.py", line 472, in csv return self._df(self._jreader.csv(self._spark._sc._jvm.PythonUtils.toSeq(path))) File "/opt/spark/spark-2.4.0-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__ File "/opt/spark/spark-2.4.0-bin-hadoop2.7/python/pyspark/sql/utils.py", line 63, in deco return f(*a, **kw) File "/opt/spark/spark-2.4.0-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py", line 328, in get_return_value py4j.protocol.Py4JJavaError: An erro
03-22
<think>我们之前已经讨论过解决SLF4J绑定冲突的方法,即通过移除HBase或Hadoop中重复的slf4j-log4j12绑定JAR包。但是,用户现在报告在尝试重命名HBase的slf4j-log4j12-1.7.25.jar时提示文件不存在。这可能是由于以下原因:1.用户可能记错了文件名(例如版本号不同)或路径不正确。2.用户可能已经移除了该文件,或者安装的HBase版本不包含该文件。3.用户可能没有进入正确的HBase的lib目录。因此,我们需要引导用户进行以下步骤:###步骤1:确认HBase的安装目录用户需要知道HBase的安装目录(即$HBASE_HOME)。通常,HBase安装在类似`/opt/programs/hbase-2.0.2`的路径下(根据用户之前的日志,我们看到了`/opt/programs/hbase-2.0.2`)。但是,用户的实际安装路径可能不同。我们可以建议用户通过以下命令查找:```bash#如果设置了HBASE_HOME环境变量echo$HBASE_HOME#或者使用find命令查找(如果不知道具体位置)sudofind/-namehbase-typed2>/dev/null|grep-P'hbase-\d'```###步骤2:进入HBase的lib目录并查找冲突的JAR进入HBase的lib目录,然后列出所有slf4j相关的JAR文件:```bashcd$HBASE_HOME/libls-lslf4j*```用户可能会看到类似以下的结果:```slf4j-api-1.7.25.jarslf4j-log4j12-1.7.25.jar#注意:这是我们要找的绑定JAR```或者,由于版本差异,文件名中的版本号可能不同(例如1.7.10、1.7.30等)。###步骤3:如果文件确实不存在,考虑HadoopJAR如果用户确实在HBase的lib目录下没有找到`slf4j-log4j12-*.jar`,那么可能是用户已经删除了它,或者HBase的打包方式不同。此时,我们需要检查Hadoop的类路径中是否仍然存在多个绑定。用户之前看到的错误信息中提到了两个绑定:1.HBase的:`/opt/programs/hbase-2.0.2/lib/slf4j-log4j12-1.7.25.jar`2.Hadoop的:`/opt/programs/hadoop-2.7.6/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar`因此,用户应该去Hadoop的目录下移除(或重命名)Hadoopslf4j-log4j12JAR。###具体操作建议根据用户的情况,我们可以给出两个方案:**方案A:移除HBase的绑定(如果存在)**```bash#进入HBase的lib目录cd/opt/programs/hbase-2.0.2/lib#请确保路径正确#重命名或删除HBase的slf4j-log4j12jarsudomvslf4j-log4j12-1.7.25.jarslf4j-log4j12-1.7.25.jar.bak#如果文件存在```**方案B:移除Hadoop的绑定(如果HBase的绑定不存在)**```bash#进入Hadoop的commonlib目录cd/opt/programs/hadoop-2.7.6/share/hadoop/common/lib#重命名或删除Hadoopslf4j-log4j12jarsudomvslf4j-log4j12-1.7.10.jarslf4j-log4j12-1.7.10.jar.bak```###注意事项1.操作前建议备份文件。2.使用`sudo`如果权限不足。3.操作完成后,再次运行`hbaseshell`查看警告是否消失。###如果两个地方都没有找到文件?如果用户在两个目录下都没有找到对应的文件,那么可能是用户的环境已经解决了该问题,或者使用了其他日志绑定。此时,可以检查类路径中是否还有其他地方存在`slf4j-log4j12`的JAR。可以使用以下命令:```bashsudofind/-nameslf4j-log4j12-*.jar2>/dev/null```###其他解决方案:排除依赖(高级)如果用户使用HBase时是通过其他方式启动(例如在程序中嵌入),则可以考虑在构建工具(如Maven)中排除冲突的依赖。但此问题发生在hbaseshell,所以通常不需要。###总结用户遇到文件不存在的错误,很可能是因为路径不正确或文件版本号不同。请用户按照上述步骤仔细检查,并选择移除其中一个绑定。§§相关问题§§1.如何设置HBaseHadoop的环境变量(如$HBASE_HOME)?2.除了SLF4J绑定冲突,HBase还有哪些常见的日志配置问题?3.如何永久修改HadoopHBase的类路径以避免JAR冲突?</think>### 解决HBase Shell SLF4J绑定冲突的文件定位问题 您遇到的`文件不存在`错误通常是由于路径不准确或版本差异导致的。以下是完整的解决步骤: #### 1. **精确查找冲突JAR文件** ```bash # 在HBase目录搜索 find /opt/programs/hbase-* -name "slf4j-log4j12-*.jar" 2>/dev/null # 在Hadoop目录搜索 find /opt/programs/hadoop-* -name "slf4j-log4j12-*.jar" 2>/dev/null ``` > 📌 注意:版本号可能不是精确的1.7.25,实际文件名可能类似`slf4j-log4j12-1.7.x.jar` #### 2. **解决方案:修改类路径配置(推荐)** 如果无法定位文件,可通过修改`hbase-env.sh`直接排除冲突包: ```bash # 编辑HBase环境配置 vim $HBASE_HOME/conf/hbase-env.sh # 添加以下内容(根据实际路径调整) export HBASE_CLASSPATH="/opt/programs/hadoop-2.7.6/etc/hadoop" export HBASE_SKIP_ERRORS="true" export HADOOP_USER_CLASSPATH_FIRST="true" # 优先使用Hadoop的日志绑定 ``` #### 3. **验证配置生效** ```bash # 重新加载环境变量 source $HBASE_HOME/conf/hbase-env.sh # 检查HBase类路径 hbase classpath | grep slf4j ``` 正确配置后应只显示**一个**绑定路径(通常是Hadoop的) #### 4. **备选方案:创建符号链接** 如果必须删除文件但找不到: ```bash # 定位Hadoop的绑定文件 HADOOP_JAR=$(find /opt/programs/hadoop-2.7.6 -name slf4j-log4j12-*.jar) # 在HBase中创建指向它的符号链接 ln -s $HADOOP_JAR $HBASE_HOME/lib/ ``` #### 原理说明 1. **冲突根源**:HBaseHadoop各自包含`slf4j-log4j12`实现包[^1] 2. **解决方案优先级**: - ✅ 类路径配置 > 符号链接 > 文件删除 - 修改配置是最安全的方式,避免破坏依赖关系 3. **版本差异处理**:使用通配符`*`匹配版本号变化 > ⚠️ 操作提示:修改配置文件前建议备份 `cp hbase-env.sh hbase-env.sh.bak`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值