Heim > Datenbank > MySQL-Tutorial > [原创] Hadoop 2.x的DistributedCache无法工作的问题

[原创] Hadoop 2.x的DistributedCache无法工作的问题

WBOY
Freigeben: 2016-06-07 16:34:33
Original
1122 Leute haben es durchsucht

转载请注明出处: http://www.codelast.com/ 现象:和 这个 帖子描述的一样,简单说来就是,在Hadoop 2.x上,用新的DistributedCache的API,在mapper中会获取不到这个cache文件。 下面就详细地描述一下新旧API的用法区别以及解决办法。 『1』 旧API 将HDFS文

转载请注明出处:http://www.codelast.com/

现象:和这个帖子描述的一样,简单说来就是,在Hadoop 2.x上,用新的DistributedCache的API,在mapper中会获取不到这个cache文件。
下面就详细地描述一下新旧API的用法区别以及解决办法。

『1』旧API
将HDFS文件添加到distributed cache中:

Configuration conf = job.getConfiguration();
DistributedCache.addCacheFile(new URI(inputFileOnHDFS), conf);  // add file to distributed cache
Nach dem Login kopieren

其中,inputFileOnHDFS是一个HDFS文件的路径,也就是你要用作distribute cache的文件的路径,例如 /user/codelast/123.txt
在mapper的setup()方法中:

Configuration conf = context.getConfiguration();
Path[] localCacheFiles = DistributedCache.getLocalCacheFiles(conf);
readCacheFile(localCacheFiles[0]);
Nach dem Login kopieren

其中,readCacheFile()是我们自己的读取cache文件的方法,可能是这样做的(仅举个例子):

private static void readCacheFile(Path cacheFilePath) throws IOException {
  BufferedReader reader = new BufferedReader(new FileReader(cacheFilePath.toUri().getPath()));
  String line;
  while ((line = reader.readLine()) != null) {
    //TODO: your code here
  }
  reader.close();
}
Nach dem Login kopieren

文章来源:http://www.codelast.com/
『2』新API
上面的代码中,addCacheFile() 方法和 getLocalCacheFiles() 都已经被Hadoop 2.x标记为 @Deprecated 了。
因此,有一套新的API来实现同样的功能,这个链接里有示例,我在这里再详细地写一下。
将HDFS文件添加到distributed cache中:

job.addCacheFile(new Path(inputFileOnHDFS).toUri());
Nach dem Login kopieren

在mapper的setup()方法中:

Configuration conf = context.getConfiguration();
URI[] localCacheFiles = context.getCacheFiles();
readCacheFile(localCacheFiles[0]);
Nach dem Login kopieren

其中,readCacheFile()是我们自己的读取cache文件的方法,可能是这样做的(仅举个例子):

private static void readCacheFile(URI cacheFileURI) throws IOException {
  BufferedReader reader = new BufferedReader(new FileReader(cacheFileURI.getPath()));
  String line;
  while ((line = reader.readLine()) != null) {
    //TODO: your code here
  }
  reader.close();
}
Nach dem Login kopieren

但是就像文章开头的那个链接里所描述的问题一样,你可能会发现 context.getCacheFiles() 总是返回null,也就是你无法读到cache文件。
这个问题有可能是这个bug造成的,你可以对比一下你的Hadoop版本。
文章来源:http://www.codelast.com/
『3』解决办法
(1)打patch
(2)升级Hadoop版本
(3)使用旧的DistributedCache API,经测试OK
文章来源:http://www.codelast.com/

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage