Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hadoop字数示例-空指针异常_Java_Eclipse_Hadoop - Fatal编程技术网

Java 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 启动环境:

我是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
启动环境:

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);
         }
     }
}