• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

尼古拉斯豆

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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中,放入内存,大多是这一种方式。)
。。。。
}
}



 

 








posted on 2012-03-27 17:02  尼古拉斯豆  阅读(391)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3