【发布时间】: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 以及如何减少数据节点发生故障且需要副本时数据的混洗方式