现象:和这个帖子描述的一样,简单说来就是,在Hadoop 2.x上,用新的DistributedCache的API,在mapper中会获取不到这个cache文件。
下面就详细地描述一下新旧API的用法区别以及解决办法。
『1』旧API
将HDFS文件添加到distributed cache中:
1
2
|
Configuration conf = job.getConfiguration(); DistributedCache.addCacheFile( new URI(inputFileOnHDFS), conf); // add file to distributed cache
|
其中,inputFileOnHDFS是一个HDFS文件的路径,也就是你要用作distribute cache的文件的路径,例如 /user/codelast/123.txt
在mapper的setup()方法中:
1
2
3
|
Configuration conf = context.getConfiguration(); Path[] localCacheFiles = DistributedCache.getLocalCacheFiles(conf); readCacheFile(localCacheFiles[ 0 ]);
|
其中,readCacheFile()是我们自己的读取cache文件的方法,可能是这样做的(仅举个例子):
1
2
3
4
5
6
7
8
|
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();
} |
文章来源:http://www.codelast.com/
『2』新API
上面的代码中,addCacheFile() 方法和 getLocalCacheFiles() 都已经被Hadoop 2.x标记为 @Deprecated 了。
因此,有一套新的API来实现同样的功能,这个链接里有示例,我在这里再详细地写一下。
将HDFS文件添加到distributed cache中:
1
|
job.addCacheFile( new Path(inputFileOnHDFS).toUri());
|
在mapper的setup()方法中:
1
2
3
|
Configuration conf = context.getConfiguration(); URI[] localCacheFiles = context.getCacheFiles(); readCacheFile(localCacheFiles[ 0 ]);
|
其中,readCacheFile()是我们自己的读取cache文件的方法,可能是这样做的(仅举个例子):
1
2
3
4
5
6
7
8
|
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();
} |
但是就像文章开头的那个链接里所描述的问题一样,你可能会发现 context.getCacheFiles() 总是返回null,也就是你无法读到cache文件。
这个问题有可能是这个bug造成的,你可以对比一下你的Hadoop版本。
文章来源:http://www.codelast.com/
『3』解决办法
(1)打patch
(2)升级Hadoop版本
(3)使用旧的DistributedCache API,经测试OK
如果还是不行的话,请参考以下方式:
job.addCacheFile(new URI("/user/mart_coo/gis/mapreduce/input/addressindex.txt#local"));
@Override protected void setup( Mapper<LongWritable, Text, Text, Text>.Context context) throws IOException, InterruptedException { if (context.getCacheFiles() != null && context.getCacheFiles().length > 0) { readCacheFile("./local"); } super.setup(context); }
相关推荐
hadoop2.X新特性介绍
理清Hadoop1.x与Hadoop2.x区别,对比分析。 Hadoop是大数据惊世之作,必学的东西,需要知道: 它由哪些部分组成? 各自的作用是什么? 如果工作的?
Hadoop2.x HA环境搭建Hadoop2.x HA环境搭建Hadoop2.x HA环境搭建
hadoop2.x 介绍,及对比hadoop1.x的区别。hadoop2.x的新特性的详细介绍。
《Hadoop 2.X HDFS源码剖析》以Hadoop 2.6.0源码为基础,深入剖析了HDFS 2.X中各个模块的实现细节,包括RPC框架实现、Namenode实现、Datanode实现以及HDFS客户端实现等。《Hadoop 2.X HDFS源码剖析》一共有5章,其中...
这是一份详细,具体的Hadoop2.x的学习文档,包含了hadoop2.x中的hadfs文件系统,mr计算框架,yarn资源管理器,使用了图文的方式讲解
Hadoop 2.x Administration Cookbook 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
企业级Hadoop 2.x项目实战
hadoop 2.x 安装文档 hadoop 2.5配置
Hadoop是大数据技术中最重要的框架之一,是学习大数据必备的第一课,在Hadoop平台之上,可以更容易地开发和运行其他处理大规模数据的框架。尚硅谷Hadoop视频教程再次重磅升级!以企业实际生产环境为背景,增加了更...
hadoop2.x安装指南.
Hadoop3.x系统文档Hadoop3.x系统文档Hadoop3.x系统文档
在这篇文章中,我们将讨论Hadoop 2.x与Hadoop 3.x之间的比较。 Hadoop3版本中添加了哪些新功能,Hadoop3中兼容的Hadoop 2程序,Hadoop 2和Hadoop 3有什么区别? 二、Hadoop 2.x与Hadoop 3.x比较 本节将讲述Hadoop 2...
英文的,讲解hadoop1.x与hadoop2.x配置异同
Hadoop 2.x Administration Cookbook 英文azw3 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
Apache Hadoop2.x 安装入门详解 PDF
本片文档是整合的Hadoop2.X 的安装与配置,包含三个节点,希望对有所帮助
解决hadoop运行报错:Could not locate executable null\bin\winutils.exe in the Hadoop binaries. 需要的winutils工具包,各个版本:2.6.x 2.7.x 2.8.x 3.0
Hadoop 3.x(MapReduce)----【Hadoop 序列化】---- 代码 Hadoop 3.x(MapReduce)----【Hadoop 序列化】---- 代码 Hadoop 3.x(MapReduce)----【Hadoop 序列化】---- 代码 Hadoop 3.x(MapReduce)----【Hadoop ...
大数据学习视频资料Linux基础教程 hadoop2.x spark storm flume