在过去的一年里,YipitData率先通过Databricks平台将其数据管道完全迁移到Apache Spark。bob体育客户端下载Databricks现在授权其40多名数据分析师独立创建数据摄取系统,管理ETL工作流,并为我们的客户提供有意义的金融研究。如今,YipitData分析师拥有端到端的生产数据管道,可以与1,700多个数据库和51,000个表进行交互,无需专门的数据工程师。本演讲解释了如何识别数据基础设施的关键领域,这些领域可以使用Databricks和PySpark进行抽象,以允许数据分析师拥有生产工作流。在YipitData,我们确定了数据管道中的敏感步骤,以构建强大的抽象,让我们的分析团队轻松安全地转换、存储和清理数据。与会者将发现使用Databricks和Spark api构建的实用程序代码片段,这些工具为数据分析师提供了一个清晰的接口,以运行可靠的表/模式操作、可重用的数据转换、Spark集群上的计划作业以及导入第三方数据和将数据导出到客户端的安全进程。
这次演讲还将展示我们集成Apache风流与Databricks的系统,这样分析师就可以在Databricks工作空间中快速构建和部署健壮的ETL工作流。系统管理员和工程师还将学习利用Databricks和风流元数据来发现由分析师管理的管道的大规模优化并创造业务价值。与会者将带着具体的策略、工具和架构离开,以推动他们的数据分析团队拥有生产数据管道,从而扩展他们的工程团队和业务。
-大家好。今天我很兴奋能和大家谈谈如何使用Databricks作为分析平台。bob体育客户端下载
为了让你们对我们将要讨论的内容有更多的了解,我将为你们提供各种策略和技术,以真正抽象出大量的数据操作,以扩展分析人员和工程组织。要做到这一点,我首先要说明为什么平台级解决方案对扩展这些问题是有意义的,以及我们在YipitData是如何成功地bob体育客户端下载处理这些问题的。然后,我将深入探讨我们在YipitData的数据平台,并向你们展示我们如何应对数据摄取、数据转换、详细的工作流自动化,甚至平台可见性方面的各种挑bob体育客户端下载战。
所以,一如既往,反馈是非常欢迎的,所以请随时评价和审查这节课。
现在我想先给大家介绍一下YipitData的工作背景。
因此,在YipitData,我们会回答投资者的关键问题。我们有大约70多个研究产品,覆盖美国和国际公司,因此,我们的客户,包括200多家投资基金和财富500强公司,可以期望每天收到电子邮件报告,excel文件和数据下载,涵盖关键绩效指标,并提供独特的见解,这些公司的表现和背后的一般市场前景。所以我们使用交易数据、网络数据、应用程序数据、目标面试来获取这些信息,我们不断评估新形式的数据集,以吸收并提供一个了解这些公司的独特窗口。我们今天谈论的这些产品和数据平台背后的团队,包括53名数据分析师和3名数据工程师。bob体育客户端下载现在我们在整个平台上总共有22名工程师,但这些人将会是使用平台和维护我们今天要讨论的平台的人。bob体育客户端下载
简单介绍一下我自己,我是YipitData的高级软件工程师。我帮助管理ETL工作负载的核心平台,所以我非常投入bob体育客户端下载于自动化各种转换工作,我们的分析师将使用我们今天讨论的平台进行工作,我来自纽约市。如果你想联系我,可以在领英上给我发消息。
所以给你一个覆盖的愿景,为什么我们想为我们的公司建立一个数据平台,我们希望我们的数据分析师从头到尾真正拥有我们的产品。bob体育客户端下载我们的产品是非常受数据驱动的,因此,我们已经在产品开发过程中确定了关键的垂直领域,其中包括数据收集,这是一种摄取和存储原始数据的过程,数据探索,我们开始在这个数据集中识别模式和趋势,一旦我们确定了这种洞察,我们就可以建立循环管道,使用ETL工作流将这些数据转换为干净的表。最后,这些干净的表格可以,提供给我们客户的报告资产。因此,虽然这些步骤在它们自己的细微差别和要求上有些独立,但我们已经认识到,要构建成功的产品需要很多深刻的技术直觉,而这种直觉需要应用于这些垂直领域的每一个领域,因此,这些步骤实际上是相互关联的。例如,了解客户对我们的报告的处理情况将有助于告知我们未来应该收集哪些数据,并了解我们应该收集什么样的数据以及如何收集数据,从而真正决定如何探索这些数据并设置这些重复的工作流。因此,我们意识到,我们实际上需要一个单一的团队从头到尾参与产品开发过程,而我们的数据分析师是最适合这样做的,因为他们是我们每天工作的这些数据集的专家。所以让他们从头到尾拥有这个过程可能会让你有点惊讶。这是因为,你正确地认为让一个小组从头到尾拥有这个过程有点疯狂,有各种各样的实现细节,包括摄取,转换,甚至生成报告,你怎么能期望一个人或一组人从头到尾拥有这个过程?这甚至可能与当今许多公司的运营方式背道而驰。这就是我们的平台级解决方案真正发挥作用的地方。bob体育客户端下载 We want our analysts to own this process from start to finish because they have that technical intuition and they can be the best people positioned to answer the questions our clients care about and build must-have products. But we don’t want them burdened by all of the implementation details, all of the data operations that make this product development life cycle time consuming. And that’s where our engineers really step in and provide a platform. They’re going to be building really powerful abstractions and provide them to our analysts, so that they can use these tools and utilities to do this product development on their own, without direct engineering support and so that way, they can develop these products efficiently, reliably, and scalably, without needing direct engineering guidance on doing so, or being bottlenecked by our engineering team.
所以简单地说,我们的平台是什么样子的,它是一个建立在Databricks生态系统之bob体育客户端下载上的Python库。因此,Databricks是我们平台的基本元素,因为它为分析师提供了一个很棒的笔记本界面,让他们可以开始研究数据并产bob体育客户端下载生见解。然而,即使有了这么棒的界面,我们的分析师还需要做很多工作,才能让产品投入生产。因此,我们所做的是,用PySpark和Databricks REST API建立一个自定义的Python库,它允许我们的分析师,有所有这些有用的实用函数来抽象出这些通常由工程师拥有的常见数据操作。因此,他们可以找到实用工具来创建一个表,设置一个Spark Job,设置一个ETL工作流,甚至真正监控系统中发生的所有事情,这些都可能发生在这个库中。在这节课中,我将详细讨论这个库以及如何求解,但关键在于,一切都归结于这个库。在演示的最后会有代码附录,在演示的最后会有代码幻灯片附录,大家可以去看看我们是如何实现这些函数的。
因此,要开始我们的平台和我们的方法,从我们如何摄取数据开始是非常重要bob体育客户端下载的,因为这是真正的切入点。为了让你了解我们每天要处理什么样的数据,我们有大约1pb的压缩Parquet在不断增长。虽然这无论如何都不庞大,但我们真正的挑战是,我们的数据集有如此多的多样性。我们要处理60,000个表和1,700个数据库,因此各种各样的表大小和模式迫使我们必须在平台级别上处理解决方案,并提供通用解决方案。bob体育客户端下载所以我们提供的任何一种效用函数,都需要能够在一般情况下工作并且能够处理我们的分析师所处理的任何一种数据集。
因此,我们的大部分存储层实际上来自原始的网络抓取数据,我们自己使用内部软件作为服务平台,叫做Readypipe。bob体育客户端下载我们在内部和外部都提供这种服务,但我们的分析师得到的是一个笔记本界面,他们可以在上面编写网页抓取代码。如果你曾经做过网页抓取,它本质上是一种反复捕捉该网站的快照并分析时间序列数据的练习。这里的挑战是网站经常变化,因此能够灵活地处理数据,并使数据快速可用以进行分析,这是让Readypipe成为我们数据平台如此重要的组成部分的关键。bob体育客户端下载Readypipe有很多组件,我要具体讲一下我们如何进行数据摄取。
所以,当你在Readypipe中保存数据并获取原始网络数据时,Readypipe会将数据发送到Kinesis Firehose,这是一项亚马逊服务,允许你将数据流传输到S3。因此,所有原始输入数据都以JSON文件的形式存储在S3中。我们使用JSON文件是因为,网络抓取的主要挑战是我们无法提前知道数据的模式。我们希望我们的分析师能够从网站上捕获任何数据点,而不是被思考他们有什么样的列,什么样的列类型所负担,所有这些东西都应该在后端处理,所以他们可以专注于重要的事情,也就是捕获信息。
从那里,我们要做的是,我们要转换这些JSON数据,使其在我们的数据湖中可用和可查询。
为此,我们将JSON数据转换为Parquet,这在Spark中是一种更高效和性能更好的文件格式。我们要做的是,我们实际上有一个正在运行的Spark集群,它订阅了这个JSON桶上的S3事件。因此,任何时候一个对象被写入该bucket时,Spark都能感知到该事件,并能够将JSON数据转换为Parquet文件。当这个过程发生时,这里的独特之处在于我们会对这个JSON对象感兴趣并看到有什么新列出现,当这些列出现时,我们在Glue中更新我们的亚metastore以查看这些新列,因此,我们的分析师能够快速进入这些数据并看到他们的数据集的图片,因为他们的模式是从那个网站演变而来的。
因此,即使使用Parquet文件和Parquet数据,在读取这些数据时也可能遇到瓶颈,这给分析人员带来了一个问题,因为我们希望他们查询这些信息。
我们所做的是一个叫做压缩的过程,它本质上是读入这些Parquet文件并压缩它们,使它们的文件数量更小,因为Spark发生的是,如果你有很多Parquet文件,你仍然会在S3做I/O操作搜索这些文件并试图读取它们时遇到瓶颈。压缩的作用是,减小文件大小,得到更大的文件,读取效率更高。所以我们通常的目标是200mb到1gb,这整个练习,我们在附件中有一个例子,本质上它需要一个Spark作业读取你的数据分区和底层的拼花数据,并将它们合并在一起,并将数据输出到一个新的S3位置。当我们这样做的时候,我们实际上更新了分区信息,所以我们使用这些压缩文件和步骤。压缩的关键在于正确的压缩过程和逻辑。如果您没有选择正确的文件数量,您可能会压缩得不够理想,并导致较差的性能。我们是这样做的,通过每个拼字组文件的列数,计算出他们的输入文件大小,计算出列的字节数,并估计出每行占用的字节数,乘以输入拼字组数据的行数,我们可以得到一个准确的文件大小估计,这让我们可以压缩会话速率。所以当你考虑做这个的时候我想把它标记为重要的东西。
因此,对于网络数据,我们有很多伟大的抽象,但对于第三方数据,我们有一系列不同的挑战。第三方数据在我们的存储中所占的比例越来越大,这实际上是一种让我们的分析师统一使用这些信息的练习。因此,与我合作的提供者以各种文件格式提供数据。我们可能会遇到访问这些数据的许可挑战,在我们的整个产品中跟踪这些数据也非常具有挑战性,然后在提供商提供更新时刷新这些数据集也非常具有挑战性,所有这些对分析师来说都很难单独拥有。幸运的是,Databricks为我们提供了大量分析和处理这些数据的实用工具,从而帮助我们管理这些第三方数据集。
因此,开箱即用,Databrick的生态系统有一个广告数据工具,可以让我们的分析师直接从我们的供应商那里收到文件,将这些文件上传到我们的存储层,然后在笔记本电脑中访问。但是,如果我们的分析师需要编程访问,例如,访问一个外部列表,三个我们不知道的桶,这是非常容易设置的,因为我们可以做的是在笔记本电脑中设置一个模板,允许他们在Databricks生态系统中扮演不同的角色,并开始读取数据。这样,我们的分析师就不需要访问控制台或访问CLI,他们自己就可以获得真正不公正的数据。我们所做的是,我们有一些模板和代码来帮助他们指导他们,把数据转换成拼花,添加一些额外的元数据,这样他们以后就可以跟踪它。现在我们花了这么多时间来获取数据并将其转换成可用的格式,我们的分析师工作才刚刚开始。他们花了很多时间,把这些原始数据转换和分析成干净可用的格式他们要做的是创建中间表在某种转换发生后将输入数据输出。
从他们的角度来看,他们真正想做的是设置一些转换代码使用Spark SQL或Pi Spark。然后将数据输出到一个新的表和数据库中。因为我们认识到这些是对分析人员很重要的输入,我们所做的就是帮助创建一个辅助函数来为他们完成创建表格的过程。现在你可能会想,为什么要这么麻烦地创建一个helper函数来创建一个表呢?Pi Spark有一些本地api,它们已经读取拼花文件,进行这些转换,然后将其输出到一个新的位置。我的意思是,为什么要写辅助函数呢?
面临的挑战是,当你与53个数据分析师和6万个表一起工作时,你需要有更多的结构化组织来确保事情可靠地发生。所以保持良好的餐桌卫生很重要。因此,您需要能够验证表名,以便它们满足您的产品需求。你需要有你的存储,它们是有组织的,所以你不会意外地覆盖任何数据,甚至有某种表版本,以防出现错误,或者分析人员需要查看以前的版本,数据集都是非常重要的,处理我们的金属存储和存储层中这么多的表,几乎有义务有自动的表维护来真正控制管理开销。虽然从基础设施的角度来看,这些都是很棒的概念,但我们的团队真正专注于分析。
因此,我们的分析师希望专注于业务价值,创造工作,为我们的客户提供答案,他们不想被这些结构化的实现细节所负担。他们是一个存储层。因此,我们将所有这些最佳实践集成到create table中,所以在附录中,你会发现,这个create table函数的一个例子,我们如何实现表版本控制,表验证,存储层组织,所有这些都自动供我们的分析师使用,无论何时他们使用这个helper函数,他们都可以专注于对他们来说重要的事情,但我们仍然从基础设施的角度获得所有的好处。
所以现在我们有了转换数据的好方法,我们还需要有一种使用Spark集群为这些转换提供动力的方法。现在,如果你以前使用过Spark, Spark集群有很多选择,硬件层、权限层、甚至Spark配置都有各种设置,这样你就可以访问你的metastore,你的S3数据,让你的Spark作业高效运行。
这里的问题是,对于我们的分析师来说,这是一个压倒性的设置,我们确实分散了他们的注意力,使他们无法专注于业务价值,从而产生锻炼。因此,在我们的平台上,我们决定采用一bob体育客户端下载种更抽象的方法,为我们的集群提供t恤尺寸。因此,我们的分析师可以看到,有小型、中型和大型类型的集群,为他们提供了一套集群菜单,这些集群之间的所有变化都是工作人员的数量大小,本质上是计算资源可用来支持该工作负载。在提供小型作业、池和表单实例方面,我们还添加了一些附加功能,以便这些只运行几分钟的作业能够快速处理,而我们的大型作业实际上是处理繁重的工作负载,如何使用额外的EBS卷来实现这些查询结果并真正处理这些大型作业。这里的关键是,在所有这些集群之间,有一个标准的Amarillo Meta存储和S3访问。因此,我们的分析人员使用这些集群中的任何一个都有一致的经验,他们应该只期望查询运行时发生变化。
因此,在这里,我们能够非常简单地启动这些Spark作业。所以我们的分析师,这个助手函数叫create job,它通过一个笔记本启动Spark作业,一个Databrick笔记本是一个输入,一些电子邮件通知和我们提到的集群大小。因此在底层,这个集群大小本质上映射到一个JSON配置,它包括Spark集群的所有细节,包括实例,我们的配置,运行时,所有这些东西都隐藏在库中,实际上直接提供给数据库rest API,它可以通过编程启动这个作业。
所以当我们使用Databricks启动那个作业时,
它开始做繁重的工作。因此,它将接受JSON配置,并从我们的云提供商提供适当的计算资源。然后它会监视这些实例,因为这项工作是训练,所以如果集群负载过重,它甚至可以在规模上进行额外的计算,或者确保这些实例在工作期间可用。然后在所有这些之上,它将应用广泛的Spark优化。因此,对于我们的分析师来说,我们在这里看到的是一个非常可靠的观察Spark工作的经验。所以他们可以完全控制这个过程,而不需要直接的工程支持。现在我们的分析人员有了这个构建模块来转换数据,然后用集群为这些转换提供动力,他们希望能够为重复的工作流对这些转换进行排序。
对于这些类型的ETL工作,气流是我们首选的工具,如果你不熟悉气流,它本质上是一个开源的Python库,允许你描述这些工作流程。bob下载地址气流提供了一个叫做DAG的结构,它允许你定义这些不同的工作以及工作之间的关系,根据如何组织这些工作的顺序。从那里,气流能够执行这些任务。这里的伟大之处在于它与Databricks一起工作,所以气流有充分的能力启动Databricks集群。这里的挑战是,它需要有人来管理这些代码,所以本质上,随着他们的ETL工作流的发展,一个人必须进入这个文件,为这些新作业添加额外的代码,然后将其部署到我们的风流服务器上,这对我们的分析师来说有点瓶颈。因为我们不想让他们承担维护这些的负担。所以我们所提供的本质上是一种通过编程创建这些dagg的方法,这些使用Databricks API的Python文件。那么,引擎盖下是什么样子的呢?
基本上,我们意识到我们的分析师正试图对各种笔记本电脑,各种Spark作业进行排序,一个接一个。因此,为了在Databricks工作区中提供该接口,我们将DAG定义为Databrick工作区中的I文件夹。在那个文件夹里是一系列的笔记本,是DAG上的单个任务或Spark作业,在每个笔记本里,我们会看到我们的分析师可以选择指定依赖关系图,这很好地映射到风流API的功能。
如果他们要按顺序运行a b c。在笔记本b中,他们可以简单地说它取决于笔记本a,笔记本c将取决于笔记本b,然后他们还为Spark作业指定集群。和我们之前描述的名字惯例不一样。这个笔记本代码的其余部分包括他们工作所需的所有转换逻辑。在这里,他们会讲到,使用create table任何类型的Pi Spark API或实用程序来真正实现转换逻辑。一旦我们的分析师定义了所有的笔记本电脑,我们能做的就是使用Databricks API,来获取所有的笔记本电脑,并建立这个依赖图,我们可以在我们的气流数据集中使用,所以我们基本上能够提取笔记本电脑路径,集群大小和依赖信息。
一旦我们有了这个图形结构,我们就可以围绕它构建一个Python文件来准备好这个气流代码并进行部署。从那里开始,一旦我们部署了这个气流代码,我们就在没有直接工程指导的情况下部署了这些管道。
因此,气流会一个接一个地旋转这些零件作业,在那个依赖图中编排它我们通过一个总线记录,气流提供的错误处理。然而,对于分析师来说,拥有这个过程是非常容易的,因为他们可以快速地向数据库文件夹添加新的笔记本电脑,只需一行修改就可以更改依赖关系图,因此他们所有的更改和编辑都发生在Databricks生态系统中,他们真的能够自己控制这个过程。
所以,现在我们有了这个工具来构建重复的工作流和所有这些在底层发生的操作,我们需要一些可见性来确保所有的系统按预期运行。
因此,对于我们的分析师来说,我们认识到,因为我们每天运行大约2000个气流测试,对这些ETL工作流进行良好的监控是至关重要的。我们所做的是,我们采用了已经内置的或警报系统,风流提供并构建定制的电子邮件通知,这是为Databricks经验量身定制的,所以我们的分析师可以收到错误警报,每当这些电子尾工作流失败,它可以快速链接到作业运行,数据库笔记本,甚至在一个块,就像重新启动这个工作流都从他们的收件箱。如果他们想要随着时间的推移调整他们的工作流程,他们会不断收到给他们一个想法的总结电子邮件。以下是所有正在运行的集群,它们花费了多长时间,以便了解它们的使用情况,并可以定期对这些工作流进行微调。
但在此之上,我们认识到有了Databricks, Readypipe,甚至是Airflow,所有这些丰富的元数据都可以帮助回答分析师的问题,以防出现问题,甚至可以用于管理目的。我们所做的是将这些日志标准化为拼花表,并在数据库中预先摄取它们。有了这些可用的表格,分析人员就能够排除他们遇到的任何问题,真正了解他们的系统发生了什么。
但即使有这些细粒度的数据,它也会让人有些不堪重负,所以为了真正简化这种监控,我们所做的是将这些细粒度的数据提取出来,并使用Databricks内置的图表工具将其可视化。因此,我们有内置的仪表盘和电子邮件报告,在某种程度上描绘出在我们平台的各种系统中发生的事情的结果。bob体育客户端下载这些数据被传送给我们的分析人员,他们可以迅速可视化,并确保事情按照预期进行。如果有什么问题,他们就会跳到我们讨论过的粒度数据中。最后,我想谈谈为什么我们要投资这些不同的工具和平台的组件,因为艺术办公室最有价值的地方是它开始邀请新的解决方案。bob体育客户端下载因此,我们所看到的是,我们的分析师,因为他们拥有所有这些产品开发的构建模块,所以他们能够真正抽象更多的工作,他们能够标准化查询和笔记本,这样他们就有一致的方法来分析这些产品,并在整个组织中共享。我们甚至看到我们的分析师真正自动化了他们的工作流程,触发了一个又一个ETL工作流,甚至在他们的电子邮件工作流结束后立即开始他们的报告流程,因此他们的整个流程从头到尾真正自动化了。作为工程师,看到这些模式的出现是非常令人兴奋的,因为这样我们就可以介入并提供更大的抽象和更多的实用工具平台,以不断扩大我们的解决方案,供我们的分析师使用。bob体育客户端下载希望通过这次演讲,你们已经了解了很多扩展数据平台的策略和技术。bob体育客户端下载所以如果你有兴趣和我们一起工作并且觉得我们在yipitdata的工作非常令人兴奋,我们正在招聘。 So go to yipitdata.com/careers or reach out to me. Thank you very much for your time.
YipitData
Anup是YipitData的高级软件工程师,YipitData是一家快速发展的金融科技初创公司,通过另类数据分析和研究来回答投资者的问题。在YipitData, Anup帮助将现有的数据基础设施迁移到Databricks平台,通过Apache Airflow管理ETL工作流的工具,并领导了专注于应用程序可见bob体育客户端下载性和软件可靠性的各种项目。此前,Anup曾在花旗集团(Citigroup)从事投资银行业务,并在印第安纳大学(Indiana University)学习。空闲时间,Anup喜欢游泳,对数据隐私问题和监管感兴趣。