Hadoop中分布式缓存的困惑

Posted

技术标签:

【中文标题】Hadoop中分布式缓存的困惑【英文标题】:Confusion about distributed cache in Hadoop 【发布时间】:2014-05-20 05:31:21 【问题描述】:

分布式缓存实际上是什么意思?在分布式缓存中拥有一个文件意味着它在每个数据节点中都可用,因此该数据不会有节点间通信,还是意味着文件在每个节点的内存中? 如果没有,我可以通过什么方式在整个作业的内存中保存一个文件?是否可以为 map-reduce 以及 UDF 完成此操作..

(特别是有一些配置数据,相对较小,我想将它们保存在内存中,因为 UDF 适用于 hive 查询...?)

感谢和问候, 德鲁夫·卡普尔。

【问题讨论】:

【参考方案1】:

DistributedCache 是 Map-Reduce 框架提供的一种工具,用于缓存应用程序所需的文件。一旦你为你的工作缓存了一个文件,hadoop 框架就会让它在你运行 map/reduce 任务的每个数据节点(在文件系统中,而不是在内存中)上可用。然后,您可以在 Mapper 或 Reducer 作业中将缓存文件作为本地文件访问。现在您可以轻松地读取缓存文件并在代码中填充一些集合(例如 Array、Hashmap 等)。

参考https://hadoop.apache.org/docs/r2.6.1/api/org/apache/hadoop/filecache/DistributedCache.html

如果您还有问题,请告诉我。

您可以在 UDF 代码中将缓存文件作为本地文件读取。使用 JAVA API 读取文件后,只需填充任何集合(在内存中)。

参考网址http://www.lichun.cc/blog/2013/06/use-a-lookup-hashmap-in-hive-script/

-阿什

【讨论】:

嘿,谢谢您的回复...所以我更关心我们何时以及如何将分布式缓存中的某些内容放入内存中?在 Hive 的情况下,我需要访问 UDF 内分布式缓存中的此文件。我怎么把它弄到那里?我不应该从 UDF 中读取 HDFS 文件,对吧? 我已经修改了帖子。只需参考提到的 URL。 这正是我正在寻找的。谢谢!如果 UDF 中的地图只填充一次,我仍然有点担心。是否有一些配置单元的文档支持这一点,或者我可以通过某种方式验证这种行为? 分布式缓存概念对所有 hadoop map-reduce、pig、hive 等都以相同的方式工作。在您的 mapper/reducer 函数中,只需在迭代记录以处理之前填充一个集合。通过这种方式,您只需为 map/reduce 任务映射填充一次。 这些文件是只读的吗?它们可以被任何映射器或减速器修改吗?

以上是关于Hadoop中分布式缓存的困惑的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop分布式缓存通过通用选项-文件

Hadoop DistributedCache分布式缓存的使用

读取驱动程序 Hadoop 中的文件

Hadoop 2.x 中的分布式缓存

Hadoop 分布式缓存 (Cloudera CH3)

flink常见的核心概念