自己在写MAR/REDUCE代码时,遇到了一个问题,一个大数据文件和一个小数据文件匹配计算,但是小数据文件太小,所以想采用HIVE的MAP JOIN的方式,把小数据文件放到直接大数据文件map的datanode的内存中,这样少了MR代码的1对N的数据文件关联。
实现这个的最佳方案就是利用distributed cache。HIVE的MAP JOIN也是利用这个技术。
首先简要介绍一下distributed cache是如何使用的,然后总结下自己在使用distributed cache遇到的问题,这些问题网上也有人遇到,但是没有给出明确的解释。希望能够帮助同样遇到此类问题的朋友。
distributed cache至少有如下的两类类应用:
1.MAP、REDUCE本身和之间共享的较大数据量的数据
2.布置第三方JAR包,可以避免集群的删减导致部分依赖的机器的JAR包的丢失
distributed cache使用的流程总结如下:
1.在HDFS上准备好要共享的数据(text、archive、jar)
2.在distributed cache中添加文件
3.在mapper或者reducer类中获取数据
4.在map或者reduce函数中使用数据
1.数据本来就在HDFS上,所以省去了流程中的第一步
可以使用hadoop fs -copyFromLocal把本地文件cp到HDFS上
2.在distributed cache中添加文件
public static void disCache(String dimDir, JobConf conf) throws IOException {
FileSystem fs = FileSystem.get(URI.create(dimDir), conf);
FileStatus[] fileDir = fs.listStatus(new Path(dimDir));
for (FileStatus file : fileDir) {
DistributedCache.addCacheFile(URI.create(file.getPath().toString()), conf);
}
}
因为我利用的数据是HIVE脚本生成的,所以无法指定具体的文件路径,采用这种方式把一张HIVE表的所有数据都加载到cache中。如果能直接明确知道文件名称就简单很多了,例如:
DistributedCache.addCacheFile(URI.create(“/mytestfile/file.txt”), conf);
3.在mapper或者reducer中获取数据
public void configure(JobConf job) {
try {
urlFile = DistributedCache.getLocalCacheFiles(job);
seoUrlFile = "file://" + urlFile[0].toString();
allUrlFile = "file://" + urlFile[1].toString();
getData(seoUrlFile, seoUrlDim);
getData(allUrlFile, allUrlDim);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我在流程2中添加了两个文件,通过DistributedCache.getLocalCacheFiles(job)获取Path[],针对不同文件调用getData,把文件数据放在不同的List中seoUrlDim,allUrlDim
如此一来,distributed cache的过程就结束了,接下来就在map()或者reduce()中使用这些数据就OK了。
4.在map或者reduce函数中使用数据
一定要区分流程3和4,3是获取数据,4是使用数据。我就是在前期没弄明白这个的差异,导致内存溢出。
虽说好像挺简单的,但是在实现这个代码的过程中有如下几个问题困扰了我好久,网上也没找到很好的解决方案,后来在兄弟的帮助下搞定
1.FileNotFoundException
2.java.lang.OutOfMemoryError: GC overhead limit exceeded
1.FileNotFoundException
这个问题涉及到DistributedCache.getLocalCacheFiles(job) 这个函数,此函数返回的Path[]是执行map或者reduce的datanode的本地文件系统中路径,但是我在getData中利用的SequenceFile.Reader的默认filesystem是hdfs,这就导致获取数据时是从hdfs上找文件,但是这个文件是在本地文件系统中,所以就会报出这个错误FileNotFoundException。
例如,DistributedCache.getLocalCacheFiles(job)返回的PATH路径是:/home/dwapp/hugh.wangp/mytestfile/file.txt,在默认文件系统是hdfs时,获取数据时会读hdfs://hdpnn:9000/home/dwapp/hugh.wangp/mytestfile/file.txt,但是我们是在本地文件系统,为了避免数据获取函数选择"错误"的文件系统,我们在/home/dwapp/hugh.wangp/mytestfile/file.txt前加上"file://",这样就会从本地文件系统中读取数据了。就像我例子中的seoUrlFile = "file://" + urlFile[0].toString();
2.java.lang.OutOfMemoryError: GC overhead limit exceeded
这个问题是我在没搞明白如何使用distributed cache时犯下的错误,也就是我没弄明白流程3和4的区别。我把流程3中说的获取数据的过程放在map函数中,而在map函数中其实是使用数据的过程。这个错误因为使每用一个map就要获取一下数据,也就是初始化一个list容器,使一个datanode上起N个map,就要获取N个list容器,内容溢出也就是自然而然的事情了。
我们一定要把获取数据的过程放在mapper或reducer类的configure()函数中,这样对应一个datanode就只有一份数据,N个map可以共享着一份数据。
内容单薄,望志同道合之士互相学习。
分享到:
相关推荐
Hadoop使用常见问题以及解决方法,简单实用
安装hadoop的时候或者使用的时候,会出现hadoop常见问题及解决方法
hadoop安装时,会遇到不同问题,这里只是列举我自己遇到的问题
hadoop2.2集群搭建遇到的各种问题。
hadoop使用distcp问题解决 然后用distcp从1.0.3的集群拷数据到2.0.1的集群中。 遇到问题处理
NULL 博文链接:https://201201314056.iteye.com/blog/2193117
(这是Hadoop的基础) 2.必须ssh无密码登录 3./etc/host 里配置 master和slaves 4.修改/etc/hostname 主机名 5、/etc/profile的java和Hadoop配置路径 6.hadoop namenode format 7./hadoop/etc/slaves这个文件里必须...
下面的文档是一些概念介绍和操作教程,可帮助你开始使用Hadoop。如果遇到了问题,你可以向邮件列表求助或者浏览一下存档邮件。 Hadoop快速入门 Hadoop集群搭建 Hadoop分布式文件系统 Hadoop Map-Reduce教程 ...
win10下hadoop2.7.2安装包及hadoop.dll和winutils.exe,解决win10下安装hadoop无法使用问题
Hadoop使用常见问题以及解决方法.doc Hadoop使用常见问题以及解决方法.doc
Hadoop_Spark相关面试问题总结 - Hadoop知识库.pdf Hadoop_Spark相关面试问题总结 - Hadoop知识库.pdf Hadoop_Spark相关面试问题总结 - Hadoop知识库.pdf
ES和HADOOP使用问题和需求
在windows环境下开发hadoop时,需要配置HADOOP_HOME环境变量,变量值D:\hadoop-common-2.7.3-bin-master,并在Path追加%HADOOP_HOME%\bin,有可能出现如下错误: org.apache.hadoop.io.nativeio.NativeIO$Windows....
windows平台上,使用Eclipse hadoop插件,开发基于hdfs文件的中文分词统计和排序功能,以唐诗三百首为例,找出其中使用频率最高的词语。
在 Hadoop 中,MapReduce 底层的分布式文件系统是独文模块,用户可按照约定 的一套接口实现自己的分布式文件系统,然后经过简单的配置后,存储在该文件 系统上的数据便可以被 MapReduce 处理。 官网下载速度非常缓慢...
Hadoop 2.7.1 中文文档 Hadoop 2.7.1 中文文档 Hadoop 2.7.1 中文文档
Hadoop API使用材料,与大家共享!
Hadoop是一个主要由Java语言开发的项目,基于Hadoop的MapReduce程序也主要是使用Java语言来编写。...经过调研,在MapReduce任务中使用C++程序的方法主要有三种:Hadoop Streaming、Hadoop Pipes以及Hadoop JNI。
hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文...