我有VirtualBox VM以伪分布式模式运行HBase和Hadoop。我修改了一些简单的MapReduce代码来计算给定HBase表中的行数(Hbase MapReduce RowCounter代码)。当我将修改后的代码编译成 jar 文件,将其传输到 VM,并通过 hadoop命令行正常运行时,一切都很棒。但是,我希望能够做的是从我的Windows机器上的Java客户端运行它(从Java代码,而不是通过ssh命令来执行hadoop命令行 - 即hadoop jar)。当我尝试从Windows端(Java客户端)运行它时,所有必要的连接都与VM上的Hadoop和HBase建立了连接,但是我收到一个"classnotfoundexception",Hadoop找不到我的Mapper类。
我已经手动将jar文件复制到HDFS上,并尝试通过设置配置选项(conf.set("mapred.jar","hdfs:///RowCountTest.jar");)将Java客户端指向该位置。但是,它仍然无法找到该类(不知道它是否在寻找jar)。
首先,你知道当从远程客户端运行作业时,Hadoop需要做什么才能识别jar存储的HDFS中的类文件吗?
其次,您是否知道是否有任何方法可以在不预加载jar文件的情况下将必要的类文件与作业一起"传递"到集群?
您必须将jar文件复制到LocalFileSystem中的某个位置(而不是HDFS),并在 hadoop-env.sh 文件中设置HADOOP_CLASSPATH变量以指向相同位置。
更改 hadoop-env.sh 文件后,必须重新启动mapreduce服务。 - 工作追踪器 - 任务跟踪器
注意: MapReduce作业将在变量中指定的位置HADOOP_CLASSPATH查找类(jar)。