如何根据hadoop中的特定条件在一个datanode上存储数据?

时间:2016-06-02 22:55:17

标签: java hadoop

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

  

/年/月/日

现在我想强迫hadoop存储,例如每月一个文件夹(如果超出空间,则为更多)仅限datanode,因此当我执行读取请求时,namenode应该在最好的情况下只返回一个datanode作为数据块的位置。

这可能吗?如何在Java中实现(比如在datanode上将所有文件基于父文件夹的哈希分组)?或者这是一个hadoop配置?

2 个答案:

答案 0 :(得分:0)

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

hadoop fs -setrep 1 'file_name'

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

答案 1 :(得分:0)

在datanode级别不可用。

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

这不适用于多个文件,即一个月内的所有文件都属于一个datanode。因为如果您使用上述想法,您将在一台计算机中存储一个文件(一天),但是月份的第二天数据可能会放在不同的数据节点下。即使我们找到了将同一个月的多天文件放在同一个数据节点下的工作,它也会在hadoop负载分配后最终出现在不同的机器上。

最好留下低级数据存储&分配给hadoop。 如果您只想选择有限的数据集,就像您建议的那样,那么最好采用像hive这样的抽象,并根据月份创建一个分区。