Hadoop中的DistributedCache(大数据文件与小数据文件做连接等其他操作时用)
DistributedCache是用来作两个输入文件的连接,或者对比的。比如:我工作中碰到的一个业务,在一个大数据库文件中(每行一条记录)查找是否有敏感词(所有敏感词集中放在一个文件中,约5000个)。
用DistributedCache的约束就是需要其中一个文件不是那么大。能装入mappper端内存。
工作原理:将小文件分发到所有map端(执行map的子节点),实现文件本地化,这样节省网络带宽和IO,
DistributedCache类路径:
import org.apache.hadoop.filecache.DistributedCache;
所用到方法:
static void addCacheFile(URI uri, Configuration conf)
static Path[] getLocalCacheFiles(Configuration conf)
添加cachefile文件:
public static void main(String[] args)
{
Configuration conf = getConf();
JobConf job = new JobConf(conf, wordcount.class);
DistributedCache.addCacheFile(new Path(args[0]).toUri(), job.getConfiguration());
}
也可以在hadoop命令行中指定文件路径,这样就不用addCacheFile()了。
hadoop jar -files 敏感词.txt WordCount.jar 数据文件.txt output
添加了cachefile后,在map端读取此文件:
public static class MyMapper extends Mapper<Object, Text, Text, IntWritable>{
BufferedReader fis = null;
public void configuration(JObConf conf)
{
try{
Path[] cacheFile = DistributedCache.getLocalCacheFiles(conf);
} catch (IOException ioe) {
System.err.println("Caught exception while getting cached files: " + StringUtils.stringifyException(ioe));
}
for (Path pathwaysFile : pathwaysFiles) {
try {
fis = new BufferedReader(new FileReader(pathwaysFile.toString()));
}catch (IOException ioe) {
}
}
}
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
从fis中读取数据进行操作(或者在configuration()中直接将数据读入hashmap中,放入内存,大多是这一种方式。)
。。。。
}
}
浙公网安备 33010602011771号