Hbase MapReduce 执行示例代码报错

本文记录了一次在HBase环境下使用MapReduce进行行数计算时遇到的问题及解决方案,详细分析了错误原因,包括jar包冲突和版本问题,并提供了正确的执行命令和环境配置建议。

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

问题

公司同事在学习Hbase 视频中有一段是Hbase 使用MapReduce 的官方实例使用 RowCounter 计算表的行数。

执行命令:

/usr/bdapp/hadoop-2.7.7/bin/yarn jar /usr/bdapp/hbase-2.1.7/lib/hbase-server-2.1.7.jar RowCounter test:user

抛出错误如下:

Exception in thread "main" java.lang.ClassNotFoundException: RowCounter
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:348)
        at org.apache.hadoop.util.RunJar.run(RunJar.java:219)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:141)

这是一个很明显的错误:类找不到
分析一下原因:
1、jar包冲突:
排查方式:打印执行的环境。发现对应的jar包存在且无冲突。
2、版本问题,其中取消了该类。下载源码包,关键字查询确实不存在该类。


找到当前环境对应的官方文档:
在这里插入图片描述
执行该命令报错:

Unknown program 'org.apache.hadoop.hbase.mapreduce.RowCounter' chosen.
Valid program names are:
  CellCounter: Count cells in HBase table.
  WALPlayer: Replay WAL files.
  completebulkload: Complete a bulk data load.
  copytable: Export a table from local cluster to peer cluster.
  export: Write table data to HDFS.
  exportsnapshot: Export the specific snapshot to a given FileSystem.
  import: Import data written by Export.
  importtsv: Import data in TSV format.
  rowcounter: Count rows in HBase table.
  verifyrep: Compare data from tables in two different clusters. It doesn't work for incrementColumnValues'd cells since timestamp is changed after appending to WAL.

上边这段话意思是:
org.apache.hadoop.hbase.mapreduce.RowCounter
没有这个programe
有效的是下边这些:
export
rowcounter
这些命令


最终结果:

/usr/bdapp/hadoop-2.7.7/bin/hadoop jar /usr/bdapp/hbase-2.1.7/lib/hbase-mapreduce-2.1.7.jar rowcounter test:user

而后忽然发现文档有提醒:

$ HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` \
  ${HADOOP_HOME}/bin/hadoop jar ${HBASE_HOME}/lib/hbase-mapreduce-2.0.0-SNAPSHOT.jar \
  rowcounter usertable

所以建议大家学习时和你的教学视频使用一致的环境。
或者首先思考问题成因,一步一步解决问题。
实在不行就及时想朋友或其他人求助。

<think>好的,我现在需要解决用户在配置Hadoop HDFS时,在Idea中遇到的依赖配置报错问题。用户提到了引用[1]到[4],我需要结合这些引用来分析可能的原因和解决方案。 首先,用户提供的引用[1]提到将HADOOP_HOME添加到Path中,并引用了%HADOOP_HOME%\bin。这可能涉及到环境变量配置的问题。如果Hadoop的环境变量没有正确设置,Idea可能无法找到相的依赖库,导致编译或运行时错误。需要确认用户是否正确配置了HADOOP_HOME,并且bin目录下有必要的可执行文件和库文件。 接下来,引用[2]是于Maven依赖中的groupId org.apache.hadoop。用户可能在pom.xml中添加了Hadoop相的依赖,但版本不兼容或依赖项缺失可能导致报错。需要检查依赖的版本是否与本地安装的Hadoop版本一致。例如,如果用户使用的是Hadoop 3.3.1,那么依赖的版本也应该对应为3.3.1,否则可能出现类找不到或方法不存在的错误。 引用[3]提到了HFile数量超过默认值的问题,但这个问题似乎与MapReduce的配置有,特别是HBase的批量加载。虽然用户当前的问题是于HDFS的依赖配置,但这里可能涉及到MapReduce任务的相设置。如果用户在代码中使用了HBase的API,可能需要调整hbase-site.xml中的配置参数。不过这可能不是当前问题的核心,但需要留意是否有相配置错误。 引用[4]指出hdfs-site.xml中的heartbeat.recheck.interval和dfs.heartbeat.interval的单位不同,需要正确配置。如果用户修改了这些参数,但单位设置错误,可能导致HDFS服务无法正常启动或通信,间接导致Idea中的依赖报错。例如,节点间的心跳检测失败可能导致连接超时,但这类错误通常出现在运行时而非编译时,所以可能不是当前问题的直接原因,但需要确认配置文件的正确性。 综合来看,用户的问题可能集中在环境变量配置和Maven依赖管理两个方面。首先,检查HADOOP_HOME是否正确设置,并且Path中包含%HADOOP_HOME%\bin。其次,确保pom.xml中的Hadoop依赖版本与实际安装版本一致,同时包含所有必要的模块,如hadoop-common、hadoop-hdfs、hadoop-client等。此外,用户可能在Idea中运行代码时,缺少本地库的支持,例如winutils.exe在Windows环境下是必需的,缺少这个文件会导致HDFS操作失败。因此,建议用户下载对应版本的winutils并放入Hadoop的bin目录下。 另外,用户提到的引用[1]中的toString报错可能涉及到MapReduce作业中对象的序列化问题。检查是否在自定义的Writable类中正确实现了toString方法,或者是否在代码中错误地调用了某个未正确重写toString的方法,导致运行时异常。需要确保所有自定义的数据类型都正确实现了序列化和反序列化方法。 最后,用户可能需要清理Maven项目并重新导入依赖,或者检查Idea的缓存和重启情况,有时候依赖下载不完整或缓存问题也会导致编译错误。同时,确认Hadoop的配置文件(如core-site.xml、hdfs-site.xml)是否正确放置在项目的资源目录下,以便应用程序能够读取到正确的HDFS配置信息。</think>### Hadoop HDFS Idea依赖配置报错解决方案 #### 1. 环境变量验证 - **确认`HADOOP_HOME`配置** 确保系统环境变量中已正确设置`HADOOP_HOME`,指向Hadoop安装目录(如`C:\hadoop-3.3.1`),并将`%HADOOP_HOME%\bin`添加到Path中[^1]。 **操作步骤**: - 右键“此电脑” → 属性 → 高级系统设置 → 环境变量 → 新建系统变量`HADOOP_HOME` - 编辑Path变量,添加`%HADOOP_HOME%\bin` - **Windows依赖补充** 在Windows环境下,需下载`winutils.exe`和`hadoop.dll`,放置到`%HADOOP_HOME%\bin`目录中,否则会触发文件系统权限错误。 --- #### 2. Maven依赖配置 - **检查依赖版本一致性** 确保`pom.xml`中的Hadoop依赖版本与实际安装版本严格匹配。例如Hadoop 3.3.1的配置应为: ```xml <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.3.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>3.3.1</version> </dependency> ``` 若版本不匹配会导致`ClassNotFoundException`或`NoSuchMethodError`[^2]。 - **添加必要依赖模块** 若涉及MapReduceHBase操作,需补充以下依赖: ```xml <!-- HBase客户端(按需添加) --> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>2.4.9</version> </dependency> ``` --- #### 3. 配置文件加载问题 - **核心配置文件位置** 将`core-site.xml`、`hdfs-site.xml`等配置文件复制到项目的`src/main/resources`目录,确保运行时能正确读取HDFS地址、端口等键参数。 **示例配置片段**: ```xml <!-- core-site.xml --> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> ``` - **参数单位修正** 检查`hdfs-site.xml`中`heartbeat.recheck.interval`(毫秒)和`dfs.heartbeat.interval`(秒)的单位设置,错误单位会导致节点通信失败[^4]。 --- #### 4. Idea工程设置 - **重新加载Maven依赖** 在Idea中执行以下操作: - 右键项目 → Maven → Reimport - 菜单栏 → File → Invalidate Caches / Restart → 清理缓存并重启 - **本地库路径绑定(仅限Windows)** 在Run/Debug Configurations中添加VM参数: ``` -Djava.library.path=%HADOOP_HOME%/bin ``` --- #### 5. 代码层检查 - **序列化与反序列化** 若报错涉及`toString()`调用,检查自定义Writable类是否实现`toString()`方法。例如: ```java public class CustomWritable implements Writable { private String value; @Override public void write(DataOutput out) throws IOException { out.writeUTF(value); } @Override public void readFields(DataInput in) throws IOException { value = in.readUTF(); } @Override public String toString() { // 必须重写 return value; } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值