6

困扰我的2个基本问题:

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

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

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

谢谢!

4

2 回答 2

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

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

于 2011-08-05T08:49:45.113 回答