【问题标题】:How to store data on one datanode based on specific criteria in hadoop?如何根据hadoop中的特定标准将数据存储在一个数据节点上?
【发布时间】:2016-06-02 22:55:17
【问题描述】:

是否可以将数据保存在 hadoop 中的一个数据节点上,这意味着它不会(或者像空间不足时非常有限)分布在整个系统中(复制很好)。 就像我每分钟都记录日志并将它们存储在 hadoop 上的文件夹结构中,如下所示:

/年/月/日

现在我想强制 hadoop 存储例如每个月仅在一个(如果超出空间,则为更多)数据节点上的文件夹,因此当我执行读取请求时,名称节点最好只返回一个数据节点作为数据块的位置。

这可能吗? Java 中的实现会是什么样子(比如根据父文件夹的哈希将所有文件分组到一个数据节点上)?或者这是一个hadoop配置?

【问题讨论】:

  • 您可以让这些文件按 Hive 分区布局,而不是弄乱副本计数。如果你有这样的结构化数据,这将比限制你的副本更快
  • @cricket_007 基于我发现的“Hive [...] 并存储为 HDFS 上表目录中的子目录。”感谢 pail,我已经获得了基于我的 java 对象的子文件夹结构。 Hive 不能保证数据不会在数据节点中广泛分布,对吧?
  • 对,Hive 存储在 HDFS 中。没听说过桶。无论你在做什么 Mapreduce,Hive 的输出都没有什么不同,我只是说对数据进行分桶/分区可以更快地访问。总的来说,将数据存储在一个数据节点上从来都不是一个好的选择,因为它会产生单点故障。副本和计算尝试感知机架以最小化集群带宽,因此您不应该担心 namenode 读取请求。 hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-hdfs/…
  • @cricket_007 Pail 允许您根据文件夹结构中的属性“排序”数据。我对复制很好,但只有当一个数据节点确实失败时才应该使用它。但我猜 HDFS 已经以最好的方式对其进行了排序,所以我不应该乱用它
  • 复制是双面的。副本存在的位置以及需要多少副本来提供容错。如果您阅读该链接和接下来的几节,它会提到 Rack Awareness 以及如何减少数据节点发生故障且需要副本时数据的混洗方式

标签: java hadoop


【解决方案1】:

在数据节点级别不可能。

对于单个文件,您可以通过将块大小设置为大于文件大小并将复制因子设置为 1 来确保将其推送到一台机器中。请注意,它仅适用于一个文件。您必须将块大小重置为默认值,否则您最终将使用新的块大小推送 hdfs 中的所有文件。

这不适用于多个文件,即一个月内的所有文件都属于一个数据节点。因为如果您使用上述想法,您将在一台机器上存储一个文件(一天),但每月的第二天数据可能会放在不同的数据节点下。即使我们找到一种解决方法,将同一个月的多天文件放在同一个数据节点下,在 hadoop 负载分配后它最终会在不同的机器上。

最好将低级数据存储和分发留给 hadoop。 如果您对仅选择有限的数据集感兴趣,例如您建议的情况,那么最好使用一些抽象,例如 hive 并基于月份创建分区。

【讨论】:

    【解决方案2】:

    如果您仅将文件保存在一个 DN 中,则很可能会丢失数据。因为 DN 通常是功能较弱的商品硬件。无论如何,您可以使用以下命令将复制因子设置为 1。

    hadoop fs -setrep 1 'file_name'
    

    这将设置特定文件的复制。

    【讨论】:

    • 我通常对复制没问题,我只是想确保将数据分组到尽可能少的注释上。类似于 I 和 III 上的 datasetA,但不是 I 和 II 上 datasetA 的 part1,IV 和 VI 上 datasetA 的 part 2,...
    猜你喜欢
    • 1970-01-01
    • 2019-12-23
    • 2013-06-11
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多