元数据
存储数据后,下一步是保存其元数据(有关数据本身的信息)。最常见的元数据是架构。通过使用外部元数据存储库,可以通过数据湖或数据管道中的不同工具对其进行查询以推断数据模式。
如果将Avro用作原始数据,则外部注册表是一个不错的选择。这样,您可以轻松地从过程中分离提取物。
摄取数据后,OLAP引擎通常将SQLDDL用于查询。Hadoop生态系统中最常用的数据湖/数据仓库工具是Apachehive,它提供元数据存储,因此您可以像定义了体系结构的数据仓库一样使用数据湖。您可以在配置单元上运行SQL查询,并连接许多其他工具(例如spark)以使用sparkSQL运行SQL查询。Hive是Hadoop生态系统中的重要工具,可为您的分析和查询提供集中的元数据库。其他工具(例如ApacheTajo)基于hive构建,以在您的数据湖中提供数据仓库功能。
Apacheimpala是Hadoop的本地分析数据库,它提供元数据存储。您仍然可以使用hcatalog连接到配置单元以获取元数据。
Apachephoenix还具有可与hive一起使用的metacore。Phoenix使用OLTP来启用对事务具有酸属性的查询。它非常灵活,并通过使用HBase作为备份存储在NoSQL世界中提供了读取模式的体系结构。Apachedruid或Pinot还提供元数据存储。
数据处理
此阶段的目标是使用单个体系结构清理,规范化,处理和保存数据。最终结果是具有定义良好的体系结构的可信数据集。
通常,您需要执行某种处理,例如:
·验证:通过将数据存储在单独的存储中来验证数据并隔离不良数据。根据数据质量要求,在达到特定阈值时发送警报。
整理和清理:清理数据并将其存储为另一种格式以进行进一步处理,例如用Avro替换低效的JSON。
·价值的标准化
·重命名字段
·…
请记住,目标是创建可在以后的下游系统上使用的可信数据集。对于数据工程师来说,这是关键角色。这可以作为流或批处理来完成。
在批处理的情况下,流水线处理可以分为三个阶段
·预处理:如果原始数据不干净或格式不正确,则需要进行预处理。此阶段包括一些基本验证,但目标是准备要在下一步中有效处理的数据。在此阶段,您应该尝试展平数据并将其保存为二进制格式,例如Avro。这将加快进一步处理的速度。这个想法是行级操作将在下一阶段执行,并且嵌套查询非常昂贵,因此现在对数据进行展平将在下一阶段提高性能。
·信任阶段:对数据进行验证,清理,规范化,然后将其转换为存储在配置单元中的通用模式。目标是创建数据所有者理解的受信任的通用数据集。通常,将创建数据规范,数据工程师的职责是应用转换以匹配规范。最终结果是镶木地板格式的数据集,可以轻松查询。选择正确的分区并优化数据以执行内部查询至关重要。您可能希望在此阶段部分地预先计算一些聚合,以提高查询性能。
·报告阶段:此步骤是可选的,但通常是必需的。不幸的是,当使用数据湖时,单一模式无法满足所有用例。这就是数据仓库和数据湖之间的区别。查询HDFS的效率不如数据库或数据仓库,因此需要进一步优化。在此阶段,您可能需要规范化数据以将其存储在不同的分区中,以便不同的涉众可以更有效地查询数据。这个想法是创建针对不同下游系统(数据集市)优化的不同视图。在此阶段,如果您不使用OLAP引擎,则还可以计算聚合(请参阅下一节)。对谁将查询数据一无所知的受信任阶段为用户优化了数据。如果客户端是高度交互的,则您可能希望在此阶段引入快速存储层,例如用于快速查询的关系数据库。另外,您可以使用OLAP引擎,我们将在后面讨论。
逻辑与流相同,但是它将在定义的DAG中作为流运行。Spark允许您将具有历史数据的流加入,但有一些限制。稍后我们将讨论OLAP引擎,它更适合于将实时数据与历史数据合并。
处理框架
一些可用于处理的工具是:
·ApacheSpark:这是最著名的批处理框架。它是Hadoop生态系统的一部分,该生态系统是一个托管集群,可提供令人难以置信的并行性,监控和出色的UI。它还支持流处理(结构化流)。基本上,spark在内存中运行MapReduce作业,其性能是常规MapReduce的倍。它与hive集成在一起以支持SQL,并可用于创建hive表,视图或查询数据。它具有很多集成,支持多种格式,并且拥有庞大的社区。所有云提供商都支持它。它可以作为Hadoop集群的一部分在yarn上运行,或者在kubernetes和其他平台上运行。它具有许多用于特定用例的库,例如SQL或机器学习。
·ApacheFlink:第一个统一批处理和流传输的引擎,但主要侧重于流传输。它可以用作像Kafka这样的微服务的主干。它可以作为Hadoop集群的一部分在yarn上运行,但是自创建以来,它已针对其他平台(例如kubernetes或mesos)进行了优化。它非常快并提供实时流,使其成为低延迟流处理(尤其是有状态流)中的火花比更好的选择。它还具有用于SQL,机器学习等的库。
·ApacheStorm:ApacheStorm是一个免费的开源分布式实时计算系统,该系统专注于流传输,并且是Hadoop生态系统的托管解决方案部分。它具有可伸缩性,容错能力,可确保您的数据将得到处理,并且易于设置和操作。
·Apachesamza:另一个出色的有状态流处理引擎。Samza允许您构建有状态的应用程序以实时处理来自多个来源(包括ApacheKafka)的数据。在yarn上运行的Hadoop生态系统的托管解决方案部分。
·ApacheBeam:ApacheBeam本身不是引擎,而是结合了所有其他引擎的统一编程模型的规范。它提供了可以与不同语言一起使用的编程模型,因此开发人员在处理大数据管道时不必学习新的语言。然后,它插入不同的后端以处理可以在云中或本地运行的处理步骤。Beam支持前面提到的所有引擎,您可以轻松地在它们之间切换并在任何平台上运行它们:云,纱线,mesos,kubernetes。如果您要开始一个新项目,我真的建议您从Beam开始,以确保将来可以使用您的数据管道。
在此处理阶段的最后,您已经准备好数据并可以使用了!但是为了做饭,厨师必须与团队合作
布局
数据管道编排是一个跨过程,可管理所有其他任务之间的依赖关系。如果使用流处理,则需要编排每个流应用程序的依赖关系,而对于批处理,则需要安排和编排作业。
任务和应用程序可能会失败,因此您需要一种以统一的方式计划,重新计划,重放,监视,重试和调试整个数据管道的方法。
诸如dagster或prefect之类的较新框架添加了更多功能,并允许您跟踪向管道添加语义的数据资产。
一些选项是:
·Apacheoozie:oozie是Hadoop的调度程序。作业被创建为DAG,并且可以由时间或数据可用性触发。它与诸如sqoop之类的提取工具和诸如spark之类的处理框架集成在一起。
·Apacheairflow:airflow是用于计划,运行和监视工作流的平台。使用DAG创建复杂的工作流程。图中的每个节点都是一个任务,边定义了任务之间的依赖关系。气流调度程序遵循一组您描述的指定依赖项,在一组工作线程上执行您的任务。它为您生成DAG,以最大程度地提高并行度。DAG是用Python编写的,因此您可以在本地运行它们,对其进行单元测试,并将其与开发工作流程集成。它还支持SLA和警报。路易吉(Luigi)是功能相似的气流的替代品,但气流比路易吉(Luigi)具有更多功能和更好的可扩展性。
·达格斯特的机器学习,分析和ETL的新协调员。主要区别在于,您可以跟踪数据的输入和输出,类似于用于创建数据流的Apachenifi解决方案。您还可以在任务中实现其他值。它还可以并行运行多个作业,易于添加参数,易于测试,提供简单的版本控制等。它仍然有点不成熟,并且由于需要跟踪数据而可能难以扩展,这对于nifi是一个问题。
·预览与dagster相似,提供本地测试,版本控制,参数管理等。预览之所以与众不同,是为了克服气流执行引擎的局限性,例如改进的调度程序,参数化的工作流程,动态的工作流程,版本控制和改进的测试。它具有一个核心的开源工作流管理系统和一个完全不需要设置的云产品。
·Apachenifi:nifi还可以安排作业,监视,路由数据,警报等。它专注于数据流,但是您也可以处理批处理。它运行在Hadoop之外,但可以触发火花作业并连接到HDFS/S3。
简而言之,如果您需要编排不需要共享数据的独立任务,请使用气流或Ozzie。对于需要数据沿袭和跟踪的数据流应用程序,对非开发人员使用nifi,对开发人员使用dagster或prefect。
资料品质
大数据的一个经常被忽略的重要方面是数据质量和保证。由于数据质量问题,该公司每年将损失很多钱。问题是,这在数据科学领域仍然是一个不成熟的领域,开发人员已经工作了数十年并且拥有出色的测试框架和方法(例如BDD或TDD),但是您如何测试管道?
该领域存在两个常见问题:
误解的要求:转换和编排逻辑常常变得非常复杂。业务分析师可以用他们的领域语言编写需求,而开发人员经常会犯错误,并计划,计划,开发,测试和部署具有错误需求的技术上正确的解决方案。这些类型的错误非常昂贵。
·数据验证:管道测试与代码完全不同。开发软件时,您要测试功能性,这是确定性的黑盒测试。对于给定的输入,您始终会获得相同的输出。对于数据资产,测试更为复杂:您需要声明数据类型,值,约束等。另外,您需要应用聚合来验证数据集,以确保行数或列数正确。例如,很难检测到一天中您的数据量是否下降了10%,或者是否正确填充了某些值。
该公司在数据质量和测试方面仍处于起步阶段,这造成了巨大的技术负担。我真的建议查看这篇文章以获取更多信息。
为了减轻这些问题,请尝试遵循DDD原则并确保设置了边界并使用了公共语言。使用支持数据沿袭的框架,例如nifi或dagster。
一些