首先,我认为您的问题很精彩,并且在您展示心理过程的方式中,我可以说您已经有了答案。
正如你提到的
Data Lake 的一般规则听起来像是在摄取阶段没有预处理。
这是哲学底线,所有的炒作都围绕着这个容易过度简化的想法。
如果我们检查AWS 对什么是数据湖的定义。
数据湖是一个集中式存储库,可让您以任意规模存储所有结构化和非结构化数据。您可以按原样存储数据,而无需首先构建数据,并运行不同类型的分析——从仪表板和可视化到大数据处理、实时分析和机器学习,以指导更好的决策。
这是一个基本定义,但让我们将其用作“诉诸权威”。他们清楚地说您可以“按原样”存储数据。
- 我的第一个问题是:“你可以”是否意味着“你应该”?此外,他们提到它允许您“运行不同类型的分析——从仪表板和可视化到大数据处理”等。
- 我的第二个问题是:如果数据在任何情况下故意不稳定......无论如何将其转储到那里是否合法?
在同一个链接,有点下面,也说
数据湖架构的主要挑战是原始数据的存储不受内容监督。为了使数据可用,数据湖需要定义机制来分类和保护数据。没有这些元素,就无法找到或信任数据,从而导致“数据沼泽”。满足更广泛受众的需求需要数据湖具有治理、语义一致性和访问控制。
总的来说,我的看法是,把所有东西都扔在那里以遵循“没有预处理”的规则,这是一种比教皇更天主教的普遍尝试,或者可能是一种过度简化规则的普遍趋势。我相信这个想法的“原样”,它的力量更多的是在不进行数据过滤或注入转换的方向上,假设我们真的不知道未来所有可能的用例是什么,所以拥有原始数据是好且可扩展。但这并不意味着拥有我们知道已损坏的数据是好的,我相信质量始终是数据的要求,并且在所有阶段至少应该是可访问的。
这让我想到了下一个想法:一个非常重复的想法是数据湖允许读取模式(AWS、Intuit、IBM、O'Reilly)。既然如此,尽可能多地保留某种模式的东西是有意义的,如果我们不想使每个可能想要使用它的人的生活过于复杂,否则,我们可能会在无用的情况下将其渲染为使用它的开销可能令人沮丧。实际上,上面的 O'Reilly 文章,名为“读取模式的死亡”,正是谈到了缺乏治理所增加的复杂性。所以我想消除一些混乱将有助于数据湖的成功。
到目前为止,我认为我的立场对我自己来说是非常清楚的——当我开始写回复时并没有那么多——但我会尝试用最新的参考资料来结束,那是一篇我读过几次的文章。早在 2014 年就在 gartner.com 的新闻发布室发表,名为《Beware of the Data Lake Fallacy》。整篇文章都很有趣,但我会强调这部分
因此,数据湖存在重大风险。最重要的是无法确定数据质量或其他分析师或用户的发现谱系,这些分析师或用户以前在使用湖中的相同数据时发现了价值。根据其定义,数据湖接受任何数据,无需监督或治理。如果没有描述性元数据和维护它的机制,数据湖就有变成数据沼泽的风险。
我同意这一点。一开始很有趣。保存所有内容,查看填充的 S3 存储桶,甚至在 Athena 或 Presto 中运行一些查询,或者在大量 gzip 文件上运行一些 Spark 作业,感觉我们正处于一个生活的神奇时刻。但随后这种小污染来了,并且我们接受它,有一天 S3 存储桶不是 10 而是 100,小例外不是 2 而是 20,要记住的事情太多,事情变得越来越混乱。
最终这是基于意见的。但我想说,可用的数据会让你未来的自己更快乐。
说这个,我会去你的选择:
处理 Spark 作业 X 中损坏的记录。您说过。那将是憎恨你自己和你的团队,诅咒他们做可以避免的工作。
修复 ETL 层上损坏的文件并将它们存储在“修复”层。你说的,开销太大了。您将不断尝试删除第一层。实际上,我预测您最终会采用生命周期策略来自动删除旧对象以节省成本。
看起来整洁而诚实。没有人能告诉你“这太疯狂了”。您唯一需要确保的是,实际上您将删除的数据与业务无关,并且将来没有您现在无法想象的可能用途。即使在这种情况下,我也会遵循一些安全的方法:
- 在 Nifi 层从 CSV 中删除前两个字符串,并将可读数据保存在“原始”存储层中
- 为了保护自己免受“我们没有看到这种情况发生”的情况,请保留一个元数据存储桶,您可以在其中保存删除了这 2 行的简单文件,以便您将来可以在需要时访问它们,并且您可以回复对于任何有不同意见的人,将来可以说“你不应该删除那个”。但我这么说是因为我无法想象这两行是什么,也许这完全是矫枉过正。
就个人而言,我喜欢数据湖,我喜欢每个系统背后的理念,但我也喜欢逐案质疑一切。我在平面文件、json、csv 中拥有大量数据,以及基于此的大量生产工作负载。但是我的数据湖最漂亮的部分并不是真正纯粹的未处理数据,我们发现进行第一次最小化清理非常强大,并且在可能的情况下 - 对于从根本上插入而不是更新的数据 - 也将其转换为 Parquet 或 ORC 和甚至用 snappy 压缩它。我可以告诉你,我真的很喜欢使用这些数据,甚至直接对它运行查询。原始数据是的,但可用。