4

Hadoop中共享全局信息的几种方法

 3 years ago
source link: https://blog.csdn.net/yanxiangtianji/article/details/24185385
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
Hadoop中共享全局信息的几种方法_yanxiangtianji的专栏-CSDN博客_hadoop共享

搞不懂这么久以前的一篇纯技术文章,居然突然说包含敏感词,给我下架了,让我重新发。。。

------

在编写Hadoop MapReduce程序的过程中有时候需要在各个Mapper或者Reducer中使用一些共享的全局数据,例如在处理整数数据表格的时候有时候需要让每个Reducer知道各个列的取值范围或是一些图算法中需要让各个Reducer知道图的连通关系。

加入key/value对通用,但效率不高将共享文件放在HDFS上,采用Hadoop的文件操作API访问通用,效率一般(可读可写)将共享信息加入JobConf/Configure对象,使用set/get系列方法访存较适用于小信息,效率最高将共享信息加入DistributedCache对象较适用于大量共享信息(只能读)

1, 最基本的方法是把需要共享的信息加到key/value对中。这种方法简单易行(用Text表示value,然后在正常数据后面加间隔符和全局数据),但是网络效率和处理效率都受到非常严重的影响。另外有时候还需要重新设计MR的内容。

2, 把共享文件放在HDFS上,在每个Mapper/Reducer中使用HDFS的文件API去访问。这种方法比较通用,但是需要涉及HDFS的文件操作,较为复杂且效率会受到影响。

读写HDFS的API与标准Java文件API有一点差异,需要使用特定的对象来创建InputStream/OutputStream。下面举一个从HDFS文件中读取信息的例子。

其中的关键点在于:首先根据当前的JobConf获得当前的文件系统(它默认从hadoop下的配置文件中读取相关信息,同样适用于单节点模式);然后要使用FileSystem的成员方法open打开文件(它返回一个FSDataInputStream,它是InputStream的子类),千万不要试图使用一般的Java文件API打开输入流或直接使用Hadoop的Path打开文件,如new Scanner(p.toString())或new Scanner(new Path(hdfs.getHomeDirectory(),p).toString()),会出现找不到文件的异常(即使文件就在所显示的目录里面)

3, 使用JobConf的set*方法写入配置信息,再在Mapper/Reducer的configure方法里面使用JobConf的get*方法读取相关信息。

由于信息是写入JobConf的,读取的时候不设计HDFS的读写,效率最高。但是这种方法难以共享大量信息。比较适合设置一些全局变量。

实现的时候需要重载Mapper/Reducer的configure方法。

set*方法在JobConf中根据指定的名字创建一个指定类型值,get*方法根据名字访问已经存入的值,对于基本类型可以通过一个额外的参数指定访问失败时返回的默认值(class方法失败时返回null)。可以使用setInt/getInt,setFloat/getFloat这样的方法存取如int、float这样的类型;存取单个字符串直接使用set/get方法;setStrings/getStrings方法的访问的是一个String类型的数组。

4, 写入DistributedCache。它是Hadoop专门为共享一些只读的全局信息提供的一个较为简单的机制。Hadoop将所有加入DistributedCache的文件都copy了一份到相关节点的本地临时目录中(还记得配置hadoop时候的配过的那个需要写本地路径的临时目录项吗?),因此对这些文件的读写完全是本地文件的读写操作。因为这些文件只被从HDFS复制到了本地而不回传,所以对它们的写操作是没有意义的也是无法共享的。

使用的时候需要先调用DistributedCache的静态方法addCacheFile将共享文件/目录的URI加入到任务JobConf中;访问之前使用DistributedCache的另一个静态方法getLocalCachedFiles将job中的共享文件全都列出来,然后就可以使用标准的Java文件API打开文件了。

在Mapper/Reducer中需要重载configure方法。

原载于http://blog.csdn.net/yanxiangtianji

转载请注明出处


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK