数据分区:数据湖设计中的良好实践。

  

  > Data partitioning is just like organizing a library.

  为什么要分区?

  想象一下,您在市图书馆中正在寻找Fyodor Dostoevsky的《犯罪与惩罚》一书。 您所要做的只是,如果您不在俄罗斯,则只需参加"国际文学"课程,然后寻找那些姓氏都以" D"开头的作家们。 但是,如果由于某些奇怪的原因,图书管理员决定在购书之日划分时段,那么这种简单的查询就不会那么容易了。 在这种情况下,您不仅会在哪里找到书,而且在不同日期获得的同一本书的副本会散布在不同的书架上。 您可能需要一整年的时间才能在该图书馆中找到一本书!

  这种情况与Data Lake必须解决的最常见问题之一没有什么不同:数据整理。 显然,长ETL管道的结果存储在一个具有有意义名称的"文件夹"中,例如,客户数据集的客户。 但是,每个"文件夹"都存储大量数据并不稀奇,因此,对其内容进行良好的分区对于使对其进行高效查询至关重要。

  让我们看一个具体的例子。 数据科学家正在开发一种机器学习模型,以预测生活在维也纳的顾客的购买行为,例如猫和恨足球。 如果客户数据集按我喜欢的城市,动物和我讨厌的运动划分,那么数据科学家将确切地知道在哪里可以找到他/她所需的数据。 另一方面,如果按性别对数据集进行分区,则数据科学家编写的应用程序别无选择,只能分析客户数据集的每一行以查找相关数据。

  显然,分区数据集有助于查询数据。 但是,分区良好的数据集所带来的优势远远不止于此。

  通过良好的分区策略避免数据改组

  第二个更现实的例子。 想象一下,有一个用于更新组织中商品价格的流,并且创建了一个数据集以监视昨天哪些商品具有价格更新。 一个明显的选择是按update_date对输入数据集进行分区。 在这种情况下,监视作业必须仅读取单个分区中的文件。

  

  > Due to the partitioning of the input dataset by update_date, a lot of shuffle (lines in color) are

  如果……几个月后创建了新工作,以找出商店中每种商品的最新价格,该怎么办? 在这种情况下,由于数据集按update_date进行了分区,因此每个文章的更新都分布在日期分区上,并且作业必须查询更多数据。 而且,一旦每个分区都获得了给定商品的最新价格更新,则必须在执行此查询的集群节点之间对每个分区中的信息进行混洗,以找出哪个分区具有最新价格更新。 不用说,数据改组将大大减慢作业的运行时间。

  

  > The input dataset is now partitioned by article-id. In this case, no shuffling at all is necessary

  如果输入数据按商品ID划分,则第二项工作显然会受益。 在这种情况下,每个文章的所有更新都被隔离在一个分区中,因此该工作只需找出每个文章具有最新更新文凭时间戳的行,而根本不会进行任何数据改组。 如果作业按article-id / update_date进行分区,则更加容易。 在这种情况下,您需要做的是列出文件,以确定每个文章的最新更新时间。

  不幸的是,很难决定采用银弹分区策略,因为将来的工作可能需要以截然不同的方式查询数据。 最有可能的是,维护Data Lake的工程团队可能不得不经常重新审视其数据分区策略。

  数据分区的缺点。

  显然,您在Data Lake中拥有的分区越多,创建的文件数量就越大。 但是,众所周知,使用Spark之类的数据处理框架列出打开/关闭文件的速度很慢,并且如果文件过多,则占用分区数据集的作业性能可能会降低。 在这种情况下,一种替代方法是合并单个分区的所有文件。

  最近,Databricks开发了Delta Lake,它基本上创建了一个JSON文件,其中包含有关数据集的元数据,例如模式,对数据集的每次写操作,分区等的事务日志。DeltaLake背后的整个思想是一项工作 消耗此数据可以读取元数据来确定需要读取哪些文件,从而避免了昂贵的列出操作。 最有趣的是,为避免大型数据集的分区无休止地嵌套,Databricks上的Delta Lake支持为每个分区中的列编写一些基本统计信息。 因此,我们不能以对使用它的所有作业都有效的方式对输入数据集进行重新分区,而只能将一些与新作业相关的列的基本统计信息附加到元数据中。 即使新作业没有快速的性能,它仍将部分受益于列统计信息,而无需重新设计输入数据集的分区。

  结论

  好的数据分区策略可以将ETL管道从耗费大量时间和数小时的计算能力的野兽转变为紧凑的工作,而这些工作几乎不需要处理单元之间的通信。 在开发新的数据平台或重新访问现有平台的体系结构时,工程师应定义良好的策略,以对Data Lake中的所有数据集进行分区。 最新版本的Spark和新的Delta Lake具有令人敬畏的功能,支持数据分区,工程师应使用/滥用它们!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值