首页 > 代码库 > Hive架构层面优化之六分布式缓存

Hive架构层面优化之六分布式缓存

案例:

Hadoop jar引用:hadoop jar -libjars aa.jar bb.jar ….

jar包会被上传到hdfs,然后分发到每个datanode

假设有20个jar文件,每天jar文件被上传上万次,分发达上万次(百G级),造成很严重的IO开销。

 

如何使这些jar包在HDFS上进行缓存,同一个jar只需上传和分发一次,后续所有的job可以节省此jar的上传和分发的开销,从而减少不必要的上传和分发呢?

解决方案:使用分布式缓存

 

MapReduce如何使用分布式缓存

Hadoop DistributedCache的使用

Configuration conf = new Configuration();DistributedCache.createSymlink(conf);//   假设:/user/bi/input/xxx.jar为文件名//  #后的testFile为指定的名称,可以用testFile代替前面的文件DistributedCache.addCacheFile(new URI("/user/bi/input/xxx.jar#testFile"), conf);Job job = new Job(conf); 

 

DistributedCache的操作一定要放在job的初始化之前,否则会报出文件找不到的异常

在map端打开:

FileReader fr = new FileReader("testFile");

 

 

Hive作业如何使用分布式缓存

hive的add jar 是基于分布式缓存来进行设计的,会将jar自动加入到分布式缓存中

在hive脚本使用:

add jar /opt/software/lib/UDF.jar;create temporary function getPageId as ‘com.xxx.GetPageID‘;

 

 或者是在通过设置hive的配置文件hive-site.xml 加入

<property>    <name>hive.aux.jars.path</name>    <value>file:///opt/software/lib/UDF.jar</value></property>