Architecture 数据湖:修复摄取与ETL时损坏的文件 客观的

Architecture 数据湖:修复摄取与ETL时损坏的文件 客观的,architecture,etl,data-ingestion,data-lake,Architecture,Etl,Data Ingestion,Data Lake,我正在构建datalake,一般流程看起来像Nifi->Storage->ETL->Storage->Data Warehouse 数据湖的一般规则听起来像是在摄取阶段没有预处理。所有正在进行的处理都应该在ETL中进行,所以您对原始和处理的数据有出处 问题 源系统发送损坏的CSV文件。这意味着除了标题和数据之外,第一行也是我们永远不会使用的自由格式元数据。只有一个表损坏,损坏的CSV目前由single Spark作业使用(我们称之为X) 问题: 在Nifi层移除这两条线是一个好方法吗?参见“变通

我正在构建datalake,一般流程看起来像Nifi->Storage->ETL->Storage->Data Warehouse

数据湖的一般规则听起来像是在摄取阶段没有预处理。所有正在进行的处理都应该在ETL中进行,所以您对原始和处理的数据有出处

问题 源系统发送损坏的CSV文件。这意味着除了标题和数据之外,第一行也是我们永远不会使用的自由格式元数据。只有一个表损坏,损坏的CSV目前由single Spark作业使用(我们称之为
X

问题: 在Nifi层移除这两条线是一个好方法吗?参见“变通办法”中的选项3

权变措施
  • 处理Spark作业中损坏的记录
    X
    。IMHO,这是一种糟糕的方法,因为我们将来会在不同的工具中使用该文件(数据治理模式爬虫,可能是一些类似Athena/ADLA的引擎,而不是ADLS/S3)。意味着应在多个位置实现损坏的记录处理逻辑
  • 修复ETL层上损坏的文件,并将其存储在“修复”层。所有正在进行的活动(ETL、数据治理、MPP引擎)将只在“固定”层而不是“原始”层中工作。对我来说,为单个CSV创建一个新层是一项开销
  • 在Nifi层修复(从CSV中删除前两个字符串)。表示“原始”存储层将始终包含可读数据。这很好,因为它很简单,处理逻辑在一个地方实现

  • 首先,我认为你的问题很精彩,从你揭示心理过程的方式来看,我可以说你已经有了答案

    如你所说

    数据湖的一般规则听起来像是在摄取阶段没有预处理

    这是哲学的底线,所有的炒作都是围绕着这个容易被过分简化的想法展开的

    如果我们检查的定义

    数据湖是一个集中的存储库,允许您以任何规模存储所有结构化和非结构化数据。您可以按原样存储数据,而无需首先构建数据结构,并运行不同类型的分析,从仪表盘和可视化到大数据处理、实时分析和机器学习,以指导更好的决策

    这是一个基本的定义,但让我们用它作为“对权威的诉求”。他们明确表示,您可以“按原样”存储数据

  • 我的第一个问题是:“你能”严格地说是“你应该”吗?。此外,他们还提到,它允许您“运行不同类型的分析,从仪表盘和可视化到大数据处理”,等等
  • 我的第二个问题是:如果数据实际上在任何情况下都是故意不稳定的……那么将其转储到那里是否合法 在同一个链接中,在下面一点,也可以说

    数据湖体系结构的主要挑战是存储原始数据时不会忽略内容。为了使数据可用,数据湖需要有定义的机制来编目和保护数据。如果没有这些元素,数据将无法被找到,或者无法被信任,从而导致“数据沼泽”。满足更广泛受众的需求需要数据湖具有治理、语义一致性和访问控制

    总的来说,我的看法是,为了遵循“不进行预处理”的规则,把所有东西都扔到那里,是一种比教皇更天主教的普遍尝试,或者是一种过度简化规则的普遍趋势。我相信“按现状”的想法,它的威力更多地体现在不在注入中进行数据过滤或转换,假设我们真的不知道未来所有可能的用例是什么,那么拥有原始数据是好的和可扩展的。但这并不意味着拥有我们知道已损坏的数据是好的,我相信质量是一项要求nt始终用于数据,并且在所有阶段中至少应可访问

    这让我想到了下一个想法:一个非常重复的想法是数据湖允许模式在读时(,)因此,如果我们不想让每个可能想使用它的人的生活变得过于复杂,那么尽可能多地保留某种模式的东西是有意义的,否则,我们可能会在一些情况下使它无用,因为使用它的开销可能会令人沮丧“模式在阅读中的死亡”正是关于缺乏治理所增加的复杂性。因此我想消除一些混乱将有助于数据湖的成功

    到目前为止,我认为我的立场对我自己来说是非常清楚的——在我开始撰写回复时,我的立场并没有那么明确——但我会尝试用最新的参考文献来总结,这是一篇我读过几次的文章。这篇文章最早于2014年在gartner.com的新闻室发表,名为整篇文章很有意思,但我会强调这一部分

    因此,数据湖带来了巨大的风险。最重要的是,无法确定数据质量或其他分析师或用户的发现血统,这些分析师或用户以前在使用数据湖中的相同数据时发现了价值。根据其定义,数据湖接受任何数据,没有监督或治理。没有描述性元数据作为一种维护机制,数据湖有可能变成数据沼泽

    我同意这一点。一开始很有趣。保存所有东西,看你S3 bucket填充,甚至在Athena或Presto中运行一些查询,或者在大量gzip文件上运行一些Spark作业,感觉我们生活在一个神奇的时刻。但后来这个小污染来了,我们接受了它,有一天S3 bucket不是10而是100,而且小的例外不是2个,而是20个,太多的事情需要记住,事情变得越来越混乱

    最终,这是基于观点的。但我想说,有用的数据会让你未来的自我更快乐

    我是这么说的
    spark.read
      .option("badRecordsPath", "/tmp/badRecordsPath")
      .format("csv")
      .load("/input/csvFile.csv")