读取hadoop和一致性级别的操作

时间:2014-07-24 10:38:14

标签: hadoop hbase consistency

我在HDFS上设置分布式HBase,我试图了解读取操作期间系统的行为。

这就是我理解读取操作的高级步骤的方法。

  1. 客户端连接到NameNode以获取包含他感兴趣的行的副本的DataNode列表。
  2. 从此处客户端缓存DataNode列表并开始直接与所选DataNode通信,直到它需要来自其他DataNode的其他行,在这种情况下它会再次询问NameNode。
  3. 我的问题如下:

    1. 谁选择要联系的最佳副本DataNode?客户如何选择“最接近”的副本? NameNode是否按排序顺序返回相对DataNode的列表?
    2. 当客户端切换到另一个已请求行的DataNode时,有哪些方案(如果有)?例如,如果其中一个DataNode变得过载/慢,那么客户端库是否可以从NameNode返回的列表中找到另一个DataNode?
    3. 是否有可能从其中一个副本获取过时数据?例如,客户端获取DataNode列表并开始从其中一个读取。同时,有一个写请求来自另一个客户端到NameNode。我们有dfs.replication == 3和dfs.replication.min = 2. NameNode考虑在3个节点中的2个上刷新到磁盘后写入成功,而第一个客户端正在从第3个节点读取并且还不知道(还)有另一个已经提交的写入?
    4. Hadoop在支持HBase时保持相同的阅读策略?
    5. 谢谢

1 个答案:

答案 0 :(得分:3)

  

谁选择要联系的最佳副本DataNode?客户如何选择"最接近"复制品? NameNode是否按排序顺序返回相对DataNode的列表?

客户是决定最佳联系人的客户。它按此顺序选择它们:

  1. 该文件位于同一台计算机上。在这种情况下(如果配置正确),它将使DataNode短路,并作为优化直接转到文件。
  2. 文件位于同一机架中(如果配置了机架感知)。
  3. 该文件位于其他位置。
  4.   

    当客户端切换到另一个已请求行的DataNode时,有哪些方案(如果有)?例如,如果其中一个DataNode变得过载/慢,那么客户端库是否可以从NameNode返回的列表中找到另一个DataNode?

    它并不那么聪明。如果它认为DataNode已关闭(意味着它超时),则会切换,但不是我所知道的任何其他情况。我相信它只会转到列表中的下一个,但它可能会再次联系NameNode--我不是100%肯定。

      

    是否有可能从其中一个副本获取过时数据?例如,客户端获取DataNode列表并开始从其中一个读取。同时,有一个写请求来自另一个客户端到NameNode。我们有dfs.replication == 3和dfs.replication.min = 2. NameNode考虑在3个节点中的2个上刷新到磁盘后写入成功,而第一个客户端正在从第3个节点读取并且不知道(但是)还有另一个已经提交的写入?

    陈旧数据是可能的,但不是在您描述的情况下。文件是一次写入和不可变的(除了追加,但如果你不必,不要追加)。 NameNode不会告诉你文件是否存在,直到完全写入。在追加的情况下,羞辱你。从本地文件系统上的主动附加文件读取的行为也是不可预测的。你应该期望在HDFS中也一样。

    如果您检索阻止位置列表并且NameNode决定在您访问它之前立即迁移所有这三个数据,那么可能会发生一种陈旧的数据。我不知道那里会发生什么。在使用Hadoop的5年中,我从未遇到过这个问题。即使在做东西的同时运行平衡器也是如此。

      

    Hadoop在支持HBase时保持相同的阅读策略?

    HDFS不对HBase进行特殊处理。有一些关于u sing a custom block placement strategy with HBase的讨论,以获得更好的数据位置,但这些都在杂草​​中。