我正在尝试使用MapReduce将数据写入Accumulo的表中。以下是我为accumulo编写的mapreduce代码。
Job job = Job.getInstance(conf);
AccumuloOutputFormat.setZooKeeperInstance(job, accumuloInstance, zooKeepers);
AccumuloOutputFormat.setDefaultTableName(job, accumuloTableName);
AccumuloOutputFormat.setConnectorInfo(job, accumuloUser, new PasswordToken(accumuloPassword));
在执行时,我得到以下异常:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/thrift/TException
at org.apache.accumulo.core.client.mapreduce.lib.util.ConfiguratorBase.setConnectorInfo(ConfiguratorBase.java:107)
at org.apache.accumulo.core.client.mapreduce.AccumuloOutputFormat.setConnectorInfo(AccumuloOutputFormat.java:94)
at core.accumulo.mapreduce.AccumuloMapReduceWrite.main(AccumuloMapReduceWrite.java:96)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.util.RunJar.main(RunJar.java:212)
我该如何解决这个问题?我也尝试过并引用过一些URL。但这无济于事。
您的作业类路径似乎缺少Thrift类。我假设您正在使用标准的hadoop job
命令运行作业。
在这种情况下,您有两个选项:
-
手动将必要的jar添加到类路径中。这将是
thrift.jar
、accumulo-start.jar
、accumulo-core.jar
,可能还有accumulo-trace.jar
,具体取决于您的版本。您需要使用-libjars
选项指定这些内容,可以通过博客文章获得更完整的阅读。 -
使用内置的Apache Accumulo工具启动您的作业。Accumulo的大多数版本都带有一个名为
tool.sh
的启动程序脚本,该脚本将自动为您添加适当的jar。它通常出现在$ACCUMULO_HOME/bin/tool.sh
下。一些发行版可能会将其称为其他东西,例如accumulo-tool
,以消除它与其他工具之间的歧义。示例见用户手册(第三个代码块)。