Hadoop 2.6中Yarn分布式缓存文件无法访问问题求助
解决Hadoop 2.6中Yarn分布式缓存文件无法访问的问题
兄弟,你遇到的问题主要有两个核心点:Context对象为空,以及Hadoop 2.x版本中DistributedCache的API已经更新了,咱们一步步来搞定:
1. 先解决最直接的空指针问题
你代码里写了Context context = null;然后直接调用context.getCacheFiles(),这肯定会报错啊!Context对象是Hadoop框架在运行Mapper/Reducer任务时自动传入的,不能自己随便初始化个null来用。
正确的做法是在你的Mapper或者Reducer类的setup()、map()或者reduce()方法里,使用框架传入的Context参数来获取缓存文件。
2. 适配Hadoop 2.6的分布式缓存API
Hadoop 2.x开始,原来的DistributedCache.addCacheFile()已经被标记为过时了,官方推荐直接用Job对象的方法来添加缓存文件,而不是操作Configuration。
你原来的添加缓存文件代码可以改成这样:
Configuration conf1 = new Configuration(); Job job = Job.getInstance(conf1); // 改用Job的addCacheFile方法,替代过时的DistributedCache API job.addCacheFile(new URI(args[0]));
3. 正确访问缓存文件的示例代码(以Mapper为例)
下面给你一个完整的Mapper示例,展示如何正确获取并读取分布式缓存里的pattern.properties文件:
import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URI; import java.util.Properties; public class PatternMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private Properties patternProps = new Properties(); @Override protected void setup(Context context) throws IOException, InterruptedException { super.setup(context); // 从框架传入的Context中获取缓存文件URI数组 URI[] cacheFiles = context.getCacheFiles(); if (cacheFiles != null && cacheFiles.length > 0) { // 缓存文件会被自动下载到任务节点的工作目录,直接用文件名访问即可 File propFile = new File(new File(cacheFiles[0].getPath()).getName()); patternProps.load(new FileInputStream(propFile)); } } @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // 这里就可以使用缓存里的配置了 String targetPattern = patternProps.getProperty("target_pattern"); // 你的业务逻辑代码... context.write(new Text(targetPattern), new IntWritable(1)); } }
4. 额外注意事项
- 确保
args[0]对应的是HDFS上的文件路径,比如hdfs://your-namenode:9000/user/xxx/pattern.properties,如果是本地文件,要先上传到HDFS再使用; - 检查HDFS上的这个文件是否有可读权限,避免任务节点无法下载;
- 如果你的作业是运行在YARN集群上,确保集群的资源配置足够,没有出现缓存文件下载失败的情况。
内容的提问来源于stack exchange,提问作者user1452759
相关产品推荐
相关产品推荐

