hadoop distributedcache
1.hadoop DistributedCache使用。
Hadoop有一个叫做分布式缓存(distributed cache)的机制来将数据分发到集群上的所有节点上。为了节约网络带宽,在每一个作业中,各个文件通常只需要复制到一个节点一次。
缓存文件复制位置:mapred-site.xml中
<property>
<name>mapred.local.dir</name>
<value>/home/hadoop/tmp</value>
</property>
操作步骤:
1.将数据的分发到每个节点上:
Configuration conf = new Configuration();
DistributedCache.addCacheFile(new URI("/user/hadoop/input/ref.png"), conf); //路径为hdfs中的路径
DistributedCache.addCacheFile(new URI("/user/hadoop/input/ref.png"), conf); //路径为hdfs中的路径
注意,此操作一定要在创建Job,将conf传递给Job之前进行,否则数据文件的路径不会被Mapper中取到。
出现“The method addCacheFile(URI, Configuration) in the type DistributedCache is not applicable for the arguments (URI, Configuration)”错误的时候,检查下程序对URI和Configuration类的import是否正确,应该分别是 java.net.URI和org.apache.hadoop.conf.Configuration
2.在每个Mapper中获取文件。 在setup中获得Path。
private Path[] refPathFromDistributedCache; @Override protected void setup(Context context) throws IOException, InterruptedException { // TODO Auto-generated method stub conf = context.getConfiguration(); refPathFromDistributedCache = DistributedCache.getLocalCacheFiles(context.getConfiguration()); super.setup(context); }
3.打开文件。因为分布式文件存放在各个节点的本地文件系统中,所以必须FileSystem.getLocal(conf);不然会提示找不到文件。
FileSystem reffs = FileSystem.getLocal(conf); FSDataInputStream in = null; for(Path tmpRefPath : refPathFromDistributedCache) { if(tmpRefPath.toString().indexOf("ref.png") != -1) { in = reffs.open(tmpRefPath); break; } }
2.DistributedCache效率比对。
测试了下,发现DistributedCache效率提升明显。
3.分布式文件内存化。
这个hadoop貌似没这个功能,得换个框架,比如spark.
参考文献: