hive / hadoop如何确保每个映射器处理本地数据?

时间:2011-08-04 12:56:21

标签: hadoop hive hdfs

困扰我的2个基本问题:

  • 如何确定hive用于存储表格的32个文件中的每一个都位于其独特的机器上?
  • 如果发生这种情况,我怎样才能确定如果hive创建了32个映射器,每个映射器都可以处理其本地数据? hadoop / hdfs是否能保证这种魔力,或者作为智能应用程序确实会发生这种情况?

背景: 我有一台32台机器的蜂巢集群,并且:

  • 我的所有表都是使用"CLUSTERED BY(MY_KEY) INTO 32 BUCKETS"
  • 创建的
  • 我使用hive.enforce.bucketing = true;
  • 我验证了,确实每个表都存储为用户/配置单元/仓库中的32个文件
  • 我正在使用HDFS复制因子2

谢谢!

2 个答案:

答案 0 :(得分:5)

  1. 数据放置由HDFS决定。它将尝试在机器上平衡字节。由于复制,每个文件将在两台机器上,这意味着您有两台候选机器用于本地读取数据。
  2. HDFS知道每个文件的存储位置,Hadoop使用此信息将映射器放置在与存储数据相同的主机上。您可以查看作业的计数器,以查看“本地数据”和“机架本地”映射任务计数。这是Hadoop的一个功能,您无需担心。

答案 1 :(得分:1)

没有连接,使用了通常的Hadoop Map Reduce数据局部机制(Spike的答案中描述了它)。
特别是对于蜂巢我会提到地图连接。可以告诉配置单元仅用于映射的表的最大大小是多少。当其中一个表足够小时,Hive将使用分布式缓存机制将此表复制到所有节点,并确保所有连接过程在本地发生在数据上。 这个过程有很好的解释: http://www.facebook.com/note.php?note_id=470667928919