Hadoop中分布式缓存的困惑

9
分布式缓存是什么意思?将文件放入分布式缓存中意味着该文件在每个数据节点上都可用,因此对于该数据,不需要节点间通信,或者这是否意味着该文件在每个节点的内存中? 如果不是,通过什么方式可以使文件的数据在整个作业期间都保留在内存中?这可以同时用于 map-reduce 和 UDF 吗? (特别地,我有一些配置数据,相对较小,我希望在执行Hive查询时将其保留在内存中作为UDF使用...?) 谢谢和问候, Dhruv Kapur。
1个回答

20

DistributedCache是Map-Reduce框架提供的一种机制,用于缓存应用所需的文件。一旦您为作业缓存一个文件,Hadoop框架将在每个运行map/reduce任务的数据节点上(文件系统中而非内存中)使其可用。然后您可以在Mapper或Reducer作业中将缓存文件作为本地文件访问。现在您可以轻松读取缓存文件并在代码中填充某些集合(例如数组、哈希表等)。

详见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/

-Ashish


嘿,感谢您的回复...因此,我更关心的是什么时候以及如何将分布式缓存中的内容放入内存中?对于Hive而言,在UDF内部需要访问分布式缓存中的此文件。我该怎么把它放在那里?我不应该在UDF内部读取HDFS文件,对吧? - Dhruv Kapur
我已经修改了帖子。只需参考提到的URL即可。 - Ashish
这正是我正在寻找的。谢谢!我仍然有些担心UDF内部的映射是否只被填充一次。是否有hive支持此功能的文档,或者我可以验证此行为的某种方式? - Dhruv Kapur
这些文件可以像任何本地文件一样处理(需要检查写入权限)。但是为什么你想要修改呢?你的使用场景是什么? - Ashish
添加文件后,我尝试在我的UDF中访问它,但是出现了文件未找到的错误。如果我在Hive shell上运行列表命令,那么我可以在“mnt/tmp/<A long string>resource/”目录下找到它,但是UDF期望在“/user/hadoop”下找到它。我正在使用EMR。我有什么遗漏吗? - Ajeet
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接