1

我有一个 4 节点集群,并且在所有节点中都安装了 Hive(1 个名称节点和 3 个数据节点)。

我正在访问名称节点。当我想放置一个文件时会发生什么。在内部,名称节点和数据节点之间发生了什么?

同样,当我想通过数据节点放置文件时会发生什么?

我们在 Hive 中创建的表存储在哪里?

4

1 回答 1

0

我建议看看这部关于 HDFS 工作原理的优秀漫画。总结一下会发生什么:

  • 客户端知道块大小(默认为 64Mb),因此它首先将文件拆分为由该块大小定义的块。
  • 然后对于每个块,它会向 NameNode 发送一个查询,询问它可以将这个块写入哪些数据节点以及它想要写入多少个数据节点(复制因子)。
  • Namenode 回复一个按与客户端的距离增加排序的数据节点地址列表。
  • 客户端将块数据连同其他数据节点的地址一起发送到最近的数据节点。
  • 第一个数据节点还将传入数据流式传输到提供给客户端的列表中最近的数据节点,并将列表传递给第二个数据节点。
  • 第二个数据节点做同样的事情,如果需要,也会将数据流式传输到另一个数据节点。
  • 当所有数据都已写入输入文件的给定块的数据节点时,它们都会通知 Namenode 他们已经完成了该块的存储。
  • 数据节点完成后,客户端将要求对输入文件的其他块执行相同操作。
  • 当所有块都像这样存储后,客户端将告诉 Namenode 它已经完成,以便 Namenode 可以将有关此文件的元数据保存到磁盘。

有点复杂,但这就是协议的样子。

当您在 Hive 中创建表时,有关此表的元数据(列、SerDe、位置等)进入 Hive Metastore,这是所有 Hive 表的中央存储库。这个元存储有几个后端,最常见的是 Derby 或 MySQL,这通过属性javax.jdo.option.ConnectionURLjavax.jdo.option.ConnectionDriverNameHive 配置进行控制。最终数据在 HDFS 中的一个目录中结束,该目录hive.metastore.warehouse.dir默认为/user/hive/warehouse.

于 2013-06-03T07:42:13.607 回答