hadoop分布式缓存

分布式缓存一个最重要的应用就是在进行join操作的时候,如果一个表很大,另一个表很小很小,我们就可以将这个小表进行广播处理,即每个计算节点上都存一份,然后进行map端的连接操作,经过我的实验验证,这种情况下处理效率大大高于一般的reduce端join,广播处理就运用到了分布式缓存的技术。

DistributedCache将拷贝缓存的文件到Slave节点在任何Job在节点上执行之前,文件在每个Job中只会被拷贝一次,缓存的归档文件会被在Slave节点中解压缩。将本地文件复制到HDFS中去,接着J哦不Client会通过addCacheFile() 和addCacheArchive()方法告诉DistributedCache在HDFS中的位置。当文件存放到文地时,JobClient同样获得DistributedCache来创建符号链接,其形式为文件的URI加fragment标识。当用户需要获得缓存中所有有效文件的列表时,JobConf 的方法 getLocalCacheFiles() 和getLocalArchives()都返回一个指向本地文件路径对象数组。


下面贴一下我的部分代码:在run函数中

[java]  view plain copy
  1. DistributedCache.createSymlink(job.getConfiguration());//  
  2.         try {//#的作用是以后用的时候直接input就可以了  
  3.             DistributedCache.addCacheFile(new URI(args[1]+"/#input"), job.getConfiguration());  
  4.         } catch (URISyntaxException e1) {  
  5.             // TODO Auto-generated catch block  
  6.             e1.printStackTrace();  
  7.         }  
  8.           
在map端打开分布式缓存的文件并读如Hashtable中

[java]  view plain copy
  1.          
  2. private Hashtable<String, DefinedMyself> word_hash = new Hashtable<String,DefinedMyself<span style="text-indent: 118px; ">>();</span>  
  3.   
  4. public void setup(Context context) throws IOException, InterruptedException{  
  5.     String[] selected_region = null;  
  6.     Path p[] = DistributedCache.getLocalCacheFiles(context.getConfiguration());  
  7.       
  8.     FileReader reader = new FileReader("input");  
  9.     BufferedReader br = new BufferedReader(reader);  
  10.     System.out.println("this is OK");  
  11.     String s1 = null;  
  12.       
  13.     int i=0;  
  14.   
  15.     while((s1 = br.readLine())!=null){  
  16.         String[] word = s1.split("\\|");  
  17.   
  18.         //do something you want  
  19.         }  
  20.     }  
  21.   
  22.     br.close();  
  23.     reader.close();                                                                        

注意:

1. DistributedCache将拷贝缓存的文件到所有Slave节点

2.包含两种DistributedCache.getLocalCacheFiles(job),DistributedCache.getLocalArchives(job)

3.具体的流程

(1) distributeCatch 上传到HDFS

(2) jobtracker端的任务调度器将作业分发到各个tasktracker

(3)任何一个tasktracker收到第一个任务后,由distributeCache自动将作业文件缓存到本地目录,自动解压,然后启动任务

(4)其他的tasktracker自动运行,distributeCache不在进行重复下载

    4.具体的源代码类包括3个 org.apache.hadoop.filecache包中

(1) DistributeCache类:用户直接使用的外部类,通过addXX,setXXX,getXXX来配置

(2)TaskDistributeCacheManager类:hadoop内部类,管理一个作业相关的缓存文件

(3)TrackerDistributeCacheManager类:Hadoop内部类,管理一个tasktracker上的所有缓存文件

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值