Java Hadoop字数示例-空指针异常
我是Hadoop初学者。我的设置:RHEL7,hadoop-2.7.3 我正在试着运行这个程序。我只是将源代码复制到新的eclipse项目中,并将其导出到wc.jar文件中 现在,我已经按照链接中的说明配置了hadoop。然后我从以下几点开始: 在输入目录中创建输入文件:Java Hadoop字数示例-空指针异常,java,eclipse,hadoop,Java,Eclipse,Hadoop,我是Hadoop初学者。我的设置:RHEL7,hadoop-2.7.3 我正在试着运行这个程序。我只是将源代码复制到新的eclipse项目中,并将其导出到wc.jar文件中 现在,我已经按照链接中的说明配置了hadoop。然后我从以下几点开始: 在输入目录中创建输入文件: echo "Hello World, Bye World!" > input/file01 echo "Hello Hadoop, Goodbye to hadoop." > input/file02 启动环境:
echo "Hello World, Bye World!" > input/file01
echo "Hello Hadoop, Goodbye to hadoop." > input/file02
启动环境:
sbin/start-dfs.sh
bin/hdfs dfs -mkdir /user
bin/hdfs dfs -mkdir /user/<username>
bin/hdfs dfs -put input input
bin/hadoop jar ws.jar WordCount2 input output
没有给出结果(输出)。为什么我会得到那个例外
谢谢
编辑:
多亏了建议的解决方案,我意识到还有第二次尝试(在wordCount示例中):
然后运行:
bin/hadoop jar ws.jar WordCount2 -Dwordcount.case.sensitive=true input output -skip patterns.txt
一切都很好 问题可能是代码的这一部分:
caseSensitive = conf.getBoolean("wordcount.case.sensitive", true);
if (conf.getBoolean("wordcount.skip.patterns", true)) {
URI[] patternsURIs = Job.getInstance(conf).getCacheFiles();
for (URI patternsURI : patternsURIs) {
Path patternsPath = new Path(patternsURI.getPath());
String patternsFileName = patternsPath.getName().toString();
parseSkipFile(patternsFileName);
}
}
此处getCacheFiles()
出于任何原因返回null
。这就是为什么当您尝试迭代patternsURIs
(它只有null
)时,会遇到异常
要解决此问题,请在开始循环之前检查patternsURIs
是否为null
if(patternsURIs != null) {
for (URI patternsURI : patternsURIs) {
Path patternsPath = new Path(patternsURI.getPath());
String patternsFileName = patternsPath.getName().toString();
parseSkipFile(patternsFileName);
}
}
您还应该检查为什么会得到
null
,如果不希望得到null
,则问题发生在映射器的setup()
方法中。这个wordcount示例比通常更高级,允许您指定一个包含映射器将过滤掉的模式的文件。此文件将添加到main()
方法中的缓存中,以便映射程序可以在每个节点上打开它
您可以在main()
中看到正在添加到缓存中的文件:
问题在于此检查conf.getBoolean(“wordcount.skip.patterns”,true)
如果未设置,则默认为true
,在您的情况下不会设置。因此,patternsURIs
或附近的东西(我没有行号)将为空
因此,您可以将
wordcount.case.sensitive
更改为默认值false
,在驱动程序(主方法)中将其设置为false
,或者提供一个跳过文件来修复它。非常感谢!我将尝试此更改,但我想在深入代码之前运行该示例。我会告诉你最新情况。你可以在我的问题中看到编辑-我猜出来了:-)非常感谢!。您可以在我的问题中看到编辑-我从您的答案中了解到:-)
caseSensitive = conf.getBoolean("wordcount.case.sensitive", true);
if (conf.getBoolean("wordcount.skip.patterns", true)) {
URI[] patternsURIs = Job.getInstance(conf).getCacheFiles();
for (URI patternsURI : patternsURIs) {
Path patternsPath = new Path(patternsURI.getPath());
String patternsFileName = patternsPath.getName().toString();
parseSkipFile(patternsFileName);
}
}
if(patternsURIs != null) {
for (URI patternsURI : patternsURIs) {
Path patternsPath = new Path(patternsURI.getPath());
String patternsFileName = patternsPath.getName().toString();
parseSkipFile(patternsFileName);
}
}
for (int i=0; i < remainingArgs.length; ++i) {
if ("-skip".equals(remainingArgs[i])) {
job.addCacheFile(new Path(remainingArgs[++i]).toUri());
job.getConfiguration().setBoolean("wordcount.skip.patterns", true);
} else {
otherArgs.add(remainingArgs[i]);
}
}
@Override
public void setup(Context context) throws IOException, InterruptedException {
conf = context.getConfiguration();
caseSensitive = conf.getBoolean("wordcount.case.sensitive", true);
if (conf.getBoolean("wordcount.skip.patterns", true)) {
URI[] patternsURIs = Job.getInstance(conf).getCacheFiles();
for (URI patternsURI : patternsURIs) {
Path patternsPath = new Path(patternsURI.getPath());
String patternsFileName = patternsPath.getName().toString();
parseSkipFile(patternsFileName);
}
}
}