为报告目的构建自己的“Data Lake”

2021-03-15 07:47:49

现在,科技公司通过数据驱动的决策发誓。它对特定的商业KPI可能是良好的,但是,如果采取过于迄今为止,它可能导致不正确的优化(过于本地),对员工的社会压力,不正确的商业决策,没有意义的指标。

对您的业务有充分的洞察力,您的技术资源很重要,不要让我错了。但我们会尝试在本文中展示哪些陷阱朝着朝鲜的“数据”咒语。此外,我们如何在过去的两年里改变我们在Fretlink的数据处理数据的方式。

免责声明:这篇博客文章介绍了我们的方法和解决方案,考虑我们的“合理的大数据”(而不是“大数据”),我们最大的桌子含有几百万行(10 6)和几亿行(10 8 )。

当团队很小,不得不快速增长,技术团队中没有人花时间建立,甚至想到数据处理平台。扰流板:这不是我们最好的举动。

该公司需要为我们的客户导出一些数据:我们提供纯电子表格出口。

在内部我们希望衡量我们的服务质量:我们为我们的电子表格出口添加了更多列。

财务团队需要定价会计数据:我们提供了略有不同的电子表格导出(其中包含的数据大多数......)。

我们的供应团队与我们的承运人合作伙伴遇见我们想要提供数据洞察:我们为我们的电子表格出口提供了更多的列。

我们的不同团队开始使用这些电子表格构建分析,但它通常导致结果不一致,或不同的计算逻辑:我们提供了一个自主的Tableau©服务器,以在“中央”点中收集分析。

我们现在将我们的主要单片分成4个与自己的数据库中的4个独立服务:让' s创建一个问题,以跟踪我们需要建立的内容:我们在未来的“报告”API时,我们时间。

我们有很多数据,但这都不是可靠的,可追溯(哪些接口产生了数据?),也没有质量良好。

每个团队都有自己的计算方法,他们自己的指标,它难以在内部的同样的事情上推理。

Tableau©是一个救世主\ o / ...。没有。它非常重(资源),数据准备是离线(用Tableau Prep)进行的,它没有神奇地解决“坏数据/数据源”问题,它真的很贵,......

首先关注数据的质量是关键。所以让'试图回答以下问题:

幸运的是,我们已经专注于将我们的泰勒斯应用程序分成多种专用服务,以便技术原因和更好的隔离软件职责。通过这样做,我们还确保为每个新服务使用强大的RDBMS解决方案PostgreSQL。将每个服务的所有数据暴露于我们的报告机构显然不是一种选择:

因为我们软件的内部结构有时会变得复杂,并且复杂性并不需要被我们的数据团队吸收(当然有时它确实如此并且您必须露出大多数原始数据模型,但需要思考仔细)。

此外,我们也希望为开发人员提供他们向公司公开的数据,其中包含一个相对简单的解决方案,不依赖于服务代码库。

总的来说,它不是因为您有许多数据需要在每个单个存储的列中生成分析或报告。

我们决定利用SQL视图(在SQL中,视图是基于SQL语句的结果集的虚拟表,以及PostgreSQL中的SQL模式的命名方式。因此,我们同意每项服务都应:

在Reporting Schema中创建SQL视图,以根据服务的数据公开虚拟表。

例如,我们专用于运营商的服务可以具有如下定义的数据库布局:

含义我们将仅在报告架构中公开一个名称,城市和容量编号,即使我们在服务本身内部提供了更多信息。这变得非常方便,因为我们在我们的服务内部和公开的报告数据之间建立了一个具体的映射。开发人员也很简单,通过编写SQL迁移,当公司需要更多数据时更改报告视图。要注意,将数据模型暴露于您的数据湖类似于暴露REST API:您需要发布向后兼容的更改,或者确保不会打破此数据源生成的报告。

让' s外推到显示数据的虚拟服务列表,如上所述,他们各自的报告架构暴露了数据:

一个非常常见的(和高度可取的)实践是避免在生产数据库上进行报告请求。实际上,报告请求有时可以是资源密集的,因此可以尝试在专用报告数据库服务器上为准实时数据设置一些流复制(或设置自动常规转储&如果您不需要恢复过程。数据):

现在是有趣的部分:我们希望与我们的数据分析师提供单一的数据库连接,以免担心潜在的复杂性。出于三个主要原因:

首先,因为在进行数据分析时,有多个数据库会令人讨厌。

其次,因为我们想要限制报告用户的权限,所以它们只能访问报告模式。

最后(也许是最重要的),无法从两个不同的数据库加入数据。

我们的“简单”解决方案是使用PostgreSQL提供的强大的外国表。通过使用Postgres_FDW模块(FDW代表外国数据包装器),我们可以将所有表从远程模式导入数据库。因此,我们在单个报告数据库中分别将每个服务报告外部架构分别进入专用架构(以清晰度为清楚地命名):

具体地,这里是我们用于为其中一个服务设置FDW的示例SQL脚本:

---------------------------------------------------------------- - 准备FDW和列出可用的服务-------------------------------------------------- -----------启用Postgres_fdw ExtensionCreate扩展如果不存在Postgres_fdw; - 创建“外国”运营商ServerCreate服务器(如果不存在),则#34;运营商 - 服务"外国数据包装器Postgres_fdw选项(主机' 127.0.0.1',dbname'运营商-db-name',端口' 5444&#39 ;,我们的数据库是本地的同一台服务器 - (由于流媒体复制) - 我们一定要告诉Postgres关于它的postgres,所以它可以“安全地” - 将成本估算代表到外国数据库而没有影响SQL表演_Remote_Estimate'真&#39 ; - -upothost数据库fdw_startup_cost' 10', - 使用fdw层fdw_tuple_cost&#39添加的每个元组的额外成本; 0.0001'); - 创建一个用户映射连接到“外国” - 运营商 - 服务ServerCreate用户映射如果不存在公共服务器"运营商服务"选项(用户'运营商-db-user'密码:' carriers_db_password' - “:”是psql的sql插值语法 - 你可以定义“\ set foo&”的变量#39; my_value&#39 ;;“postgresql.org/docs/13/pp-psql.html#app-psql-interpolation); ---------------- --------------------------------------------------------------- -----------------------------------空了任何现有的ObjectsDrop模式是否存在"运营商& #34;级联; - 创建一个专用架构,将收到外国TableCreate架构"运营商&#34 ;; - 架构&#34中的报告useralter默认权限的显式读取权限;运营商" &#34的桌子上的Grantselect; Reporting-Ro&#34 ;; ----------------------------进口外国表 - --- --------------------------------进口外国架构ReportingFrom Server"运营商服务"进入"运营商&#34 ;; ------------------------------------------------ -----------------------------------------------(https://www.postgresql.org/docs/current/postgres -fdw.html)---- ----在导入外国表后运行`Acareze`查询----是更新本地统计数据 - 外国表的好方法。它将有助于查询刨床运行更好----在外国表上查询。 ---------------------------------------------------------------- ---------------- do $$声明桌面文本;开始桌面:= string_agg('"' || finessing_table_schema ||&#39 ;"。"' || finessing_table_name ||''&#39 ;,')来自Information_Schema.foreign_Tables;执行'分析' ||桌面种植物;结束; $$;

可追溯性,因为所有数据都直接来自服务本身,流媒体复制,没有人为互动。

单个报告数据库入口点,可用于查询多个服务的数据。

让自己提醒自己一个简单的报告问题来测试这个设置:“巴黎航空公司的符合人数不到500欧元的订单数量少?”

从探险中选择count(distinct o.id)。作为leve join pricing.price作为p.Order_ID = O.ID左加入ariers.Carrier作为C上的C.ID = O.Carrier_idwhere P.Cents&lt 50000和c.city ='巴黎'

和#39; s所有🎉。现在,我们可以做一个多数据库的数据,这些数据被仔细选择要为我们的报告需求而接触。

我们现在对所有报告问题都有一个独特的入学点。这是一个非常好的结果。但是我们还不那么。

好吧,让' s简化了公开的数据模型,并尝试提供一层抽象,这将是软件开发世界与消费报告仪表板的用户之间的联系。对于该任务,我们决定再次获得SQL视图(虚拟表)的权力。

这次SQL视图不仅仅用于“过滤掉”我们的数据,它们被用作报告数据库的核心中的定义(因此由数据团队所拥有):

在更加有意义的报告模型中聚合我们的数据,这将更接近我们的业务分析。

提供数据团队可以“赠送鸡蛋”的地方,以丰富原始数据。

谈到报告或分析时,我们通常需要来自许多不同的地方。和生产数据的地方不一定是您正在建造的软件。事实上,您的公司有优先事项,您可以展示每次需要的“服务”。那个'为什么您的数据湖可以尝试弥合软件功能与您的业务数据之间的差距。

我们期望能够在我们的报告数据库内查询的非SQL数据来自:

(谷歌)床单(是的,是的i' M确定您有一些存储在某些电子表格中的商业指标😁)

将所有必要的数据注入专用的PostgreSQL数据库中! (是的,是的,我们真的很喜欢FretLink的PostgreSQL)通过这样做,我们将能够将任何非SQL /外部数据转换为普通的旧Postgres数据库,并在我们的报告数据库中使用额外的Postgres_fdw连接重用前面描述的技术。

尽管如此,这是可能的,因为您需要设置一个系统,可以将这些外部数据源同步到PostgreSQL数据库。幸运的是,这种情况在“数据”世界中很常见,许多公司试图为这个问题提供解决方案。其中一个是针迹,它赞助了一个“用于写入脚本的开源标准,该脚本移动数据”称为SINGER.IO,其中有许多社区支持的集成。

消耗数据流从那些抽头产生的目标,将其加载到目标数据库中。我们只需要一个:

显然,需要定期安排这种“同步”过程(我们每天自动同步此类数据,早上在中午和晚上时)。它与我们的内部Postgres数据库的流式复制不一样好,但它足以满足我们的报告需求。

你可能会问的结果?一整套内部数据,历史数据,在一个报告数据库中可用的外部数据。

注意:如果您不想自己处理同步(即水龙头和目标实用程序的使用),您可以直接查看缝针,该针脚提供在线服务来为您处理一切。您可以通过其Web界面配置您的源和目标(根据Rows的付费服务 - 在数百万美元中 - 您需要同步)。

我们在本文中看到的所有机器都是由于一层自动化而成为可能。我们在经典的连续送货管道(我们使用Gitlab-CI)中向整个机器进行协调,以便去除与数据的任何人类相互作用。由此产生的管道非常简单,分为两个阶段:

预先部署阶段,处理所有非标准数据的所有预处理/同步(参见“添加非SQL相关数据”段落)

我们遗漏的是制作整个“Data Lake”/“BI工具”/“ETL软件”(您将其命名为全公司的可持续工具。在本市管道中重要的是要确保以无状态方式构建报告数据库。意味着我们不需要担心报告数据库的恢复计划,以防灾难。或者我们不需要担心报告所需的数据。因为所有原始数据都存储在我们的服务数据库或外部服务中。其余的只是一堆SQL脚本,它在Git存储库中提交,并通过我们的连续交付管道部署。

如果我们缩小部署阶段,则简单地定义了报告数据库的构造步骤。并且通过按顺序执行来获得结果:

所有管理步骤首先,在目录db / admin / *中。需要用特权postgres用户执行的sql(包含设置FDW的SQL脚本并将远端模式导入“完全搜索数据通过A中所描述的单个报告数据库“段落)

然后,在其他目录DB / MAIN / *中的所有专用度量和聚合。需要由报告Postgres用户执行的SQL(包含“在您喜欢”段落“段落中的数据中显示的SQL脚本)

那个'很多! run-迁移脚本是一个死的简单shell脚本,如下所示:

#!/ usr / bin / env bashset -euo pipefailshopt -s nullglobfunction run_migration {local file =" $ 1" echo"运行迁移$ file" psql \ --set on_error_stop =上\ --set on_error_rollback = \ -echo-errors" $ eporting_db_uri" \ -f" $ file"}函数run_migrations {if [ - [-z" $ 1" ]];然后回声"用法:./run-migrations.sh migration_directory"退出另外一个本地目录=" $ 1" " $目录" / *。sql do run_migration" $ files"完成fi} run_migrations" $ 1"

现在我们的“数据湖”机械准备好了,让'利润和使用它!

当您在一个已经组织很好的大公司内工作时,这一点似乎是显而易见的。但它&#39仍然很重要,不能记住它。

确实拥有一支对您的IT系统产生的报告数据负责的人团队至关重要。带来:

能够为常见问题进行分解(它经常发生的是,公司中的两个不同的人具有相对较近的问题,可以用普通的仪表板/图形回答

上述所有技术设置确实为整个“数据流水线”添加了一点复杂性。这可以否定。然而,它有助于让不同的团队更加靠近。

数据分析师对开发人员团队的内部构件有更好的意义' S系统

非技术精明员工可以直接从数据团队产生的结果中获利,而无需重新建立自己的分析

最后一个带走本文是与你分享“蛋糕上的樱桃”。我们在过去的18个月内使用的工具以生成Visual Reporting仪表板:元数据库

满足公司中每个人的简单开放方式,以提出问题并从数据中学习。

在作为开源软件的顶部(我们在Fretlink的开源),它'是一个非常活跃的项目,这很好地呈现出视觉报道。它有一个易于掌握和用户友好的界面。该软件允许您:

用两种不同的方式写下“问题”(它的术语):与简单的UI编辑器一起使用,这些编辑器可以使用不流利的人员

或者使用正常的SQL编辑器,您可以在普通的SQL中写下您的问题

将您的“问题”组织进入仪表板,提供:过滤器(可以过滤掉仪表板的所有问题),嵌入到您自己的应用程序,修订历史记录中...

该工具很快成为我们在公司中“消费”报告数据的入口点。

在文章的开始(在“控制”监控报告数据“段落)中,所有模式都可以通过元数据库界面探索:

当你浏览你' ll看到可用表列表,然后一直到表格'列:

用户友好的编辑器是一个非常好的触感。它为用户提供了一种视觉掌握SQL查询如何构建(甚至不处理SQL语言)。这是三类完成的:

数据:您可以从下拉列表中提供的一个数据源中选择您的需要

总结:当您需要组的何时...结果...通过所选表中的列可用,并选择您想要汇总的公制(行数,但累计值的计数,累计计数,......)

一旦您准备就绪,请单击“可视化”按钮以获得结果。 Metabase将尝试自动猜测所需的可视化类型(表,行图或例如枢轴表)。但显然,您可以将其更改为从此列表中选择所需的一个:

创建您的图表后,您可以在美丽的仪表板内将它们全部分组。这里'从元数据库文档中获取的示例仪表板:

漂亮的触摸是能够在您自己的应用程序中嵌入仪表板。 (⚠️后台集成不需要支付许可证,但如果您想在您销售的产品中嵌入仪表板,则需要支付商业许可证)

如果您想知道如何具体嵌入仪表板,您可以查看巧妙云提供的小型教程,该教程解释得很好:“在Ruby上集成了Ruby上的元数据库”(或任何其他Web应用程序)

从技术上讲,我们很高兴提出一个相对简单的解决方案来与数据一起使用。实际上,管理PostgreSQL数据库相对容易(我们有经验),我们解决了我们最初使用的所有问题,只使用高质量的开源软件。 PostgreSQL照顾数据的组合,Gitlab-CI作为我们的自动化管道和元数据库,为最终用户显示美丽图形是我们建议的。

这种完整的PostgreSQL选择显然具有不可忽略的成本,该成本是向我们的一些数据团队同事教授先进的SQL。我们试图花时间这样做,因为我们觉得分享我们的团队的知识很重要。截至今天,结果是好的,我们的数据团队对公司的质量仪表板充满信心,并相反,该公司信赖了所产生的数据可视化。

要得出结论,我' ll释放了一个良好的文章来自Manom​​ano Tech博客(“过于数据驱动的危险?”)这总结了我们尝试实现我们自己的数据机械迁移的关键目标:

用他们可以的方法,工具和数据团队授权贵公司 ......