为什么数据管道无法实现100%自动化?

为什么数据管道无法实现100%自动化?

即使是人工智能解决方案,也无法弥补供应商基础设施和最终数据工程限制(时间)方面的差距。

数据工程:等待的游戏

我经历过的最糟糕的等待之一,是在一艘满载乘客的船上,在季风中空转。如果这听起来还不够糟糕的话:我是船长。在船上掌舵时,这种时刻会让你怀疑为什么会有人把船或水体浪漫化。当然,在理想的条件下,大多数船只提供了一种高效、舒适的旅行方式。汽车甚至大多数飞机都可以在暴风雨来临时上升或下沉,而水上船只及其乘客则不同,当遇到恶劣天气时,他们所能做的只有等待。

遗憾的是,无论您的数据管道在技术上多么完美、多么富有弹性,即使是最优秀的数据团队也无法预测或超越摄取的某些方面。我遇到过的两个最重要的“无法控制”的挑战是:

  1. 与供应商相关的故障或“上游”故障,我们所能做的就是提交工单并等待回复。
  2. 无法预测的加载时间

虽然我可以就第一个挑战写一个很好的文集系列,但我试图成为所有数据供应商和API维护者的朋友,所以我们不会讨论这个问题。不过,我确实想讨论一下第二点,重点是以不可预测的时间间隔或通过非常规渠道接收数据源。如果你想了解更多关于数据科学的相关内容,可以阅读以下这些文章:
苹果面试流程:数据科学家的完整指南
每个数据科学家都应该知道的关于回归的三个简单的事情
5个ChatGPT插件,让你领先于99%的数据科学家!
数据科学初学者必备的7个备忘单!

最大的挑战:没有应用程序接口

现在,数据管道协调通常可分为两大类:

  1. 事件驱动(由Webhook或Airflow任务等上游刺激触发)
  2. 计划

管道的频率取决于利益相关者的需求和技术限制。有些资源密集型流程可能每天运行一次,有些可能每周运行一次,有些甚至可能每小时或每5分钟运行一次。

我们可以使用基于cron的工具(如Google Cloud Scheduler)来建立和维护这些可预测的时间表。但还有一些离群进程。它们仍然是必要的,但可能无法完全符合上述定义。而且,不幸的是,你可能会发现自己任由供应商摆布。

例如,有些报告可能只在可用时才提供。

你甚至可能会遇到我遇到过的一种非常规情况,即供应商还没有应用程序接口,但仍需要向你和你的团队提供数据。

在这种情况下,他们可能会每天手动向你发送一封电子邮件。

这些方法除了会让那些被文档齐全、直观的应用程序接口惯坏了的工程师绞尽脑汁思索变通的解决方案,以便从非常规渠道获取数据外,还会增加报告的不确定性。虽然无代码管道和定制报告(手动准备和发送)听起来很不错,但当这些方法因为没有解决方案而失败或根本无法如期完成时,还是会令人沮丧。

必须告诉任何利益相关者他们的数据还没有准备好,这是一场艰难的对话,因为对于工程师来说,数据摄取失败可能只是一个技术错误,但被迫“盲目飞行”而没有数据可能会导致收入损失。而且,如果出现收入问题,你会得到提醒,你也会感受到这一点:如果公司的底线下降,有时你的薪水也会下降。

在这些情况下,你能做的最好的事情不是让你的管道更有弹性,而是制定一个具体的、可操作的应急计划。确保在与提供无时间表交付的供应商打交道时,确保有个人联系人,如果可能的话,还有一些获取数据作为备份的方法。例如,我与一家供应商合作,该供应商利用第三方查询工具让我们编写类似SQL的查询,以开发我们基于Webhook的管道(my baby)所摄取的报告。

但是,如果数据的时间出现问题,我仍然可以获得这些数据,因为每天早上,我都会通过电子邮件收到结果的CSV。我还可以随时使用查询工具的用户界面生成CSV。因此,虽然这并不是一个典型的基于API的数据摄取解决方案,但它实际上具有很强的弹性,并受到冗余保护。

非常规问题,非常规解决方案

当然,如果配置得当,电子邮件报告仍然可以成为自动化解决方案。你可以创建各种流程,将文件从Gmail或Outlook等电子邮件提供商推送到云驱动器。

最后,我要分享一下我最近解决的一个问题,如果我没有找到一点变通方法,这个问题将完全由人工完成。正如我所分享的,我一直在使用GCP上的数据源和解决方案组合构建自己的报表基础架构。和其他优秀的企业一样(虽然我远非如此),我需要获取收入数据。虽然我这样做不是为了赚钱,因为我很幸运有一份全职工作,但它确实是衡量哪些工作“有效”的重要指标。

然而,尽管尝试了几种不同的方法,我还没有找到手动提取每个故事的付费数据的方法。我找到的最接近的方法是从合作伙伴计划仪表板的JSON化版本中提取历史付款数据,并以这个故事为灵感。

起初,我会下载文件,然后使用Python手动解析数据。不过最近,我改变了方法,将文件存储在谷歌云存储中。由于我将我的管道配置为每月初抓取该文件的最新版本,我唯一需要手动做的工作就是确保该文件保持更新。

以下是我的代码,供参考:

import pandas as pd 
import requests
import re
import json
from datetime import datetime
from google.cloud import bigquery
from google.cloud import storage
import config as cfg
import logging
import google.cloud.logging

logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=logging.INFO, datefmt='%I:%M:%S')

client = google.cloud.logging.Client()
client.setup_logging()

def get_file(file: str):
    
    bucket = storage.Client().get_bucket("medium_info")
    bucket = bucket.blob(file)
    pay = bucket.download_as_string()
    pay = pay.decode("utf-8")

    return pay

def get_paid():
    
    medium_text = get_file(cfg.file)

    logging.info(f"Downloading {cfg.file} from GCS...")
  
    med_df=pd.DataFrame(json.loads(re.sub(r'^.*?{', '{', medium_text)))

    pay_info = pd.json_normalize(med_df.loc['postAmounts', 'payload'], sep= '_')

    logging.info("Creating data frame...")
  
    pay_info['post_firstPublishedAt'] = pd.to_datetime(pay_info['post_firstPublishedAt'], unit='ms')
    pay_info['post_firstPublishedAt'] = pay_info['post_firstPublishedAt'].dt.strftime("%Y-%m-%d")

    final_df = pay_info[["post_title", "post_firstPublishedAt", "post_id", "totalAmountPaidToDate"]]

    final_df.rename(columns={"post_title": "postTitle", "post_id": "postId", "post_firstPublishedAt": "postFirstPublishedAt"}, inplace=True)

    final_df['totalAmountPaidToDate'] = final_df['totalAmountPaidToDate'] / 100
    
    final_df['dtUpdated'] = pd.Timestamp.now("US/Eastern")
    
    return final_df

问题是,虽然每月从1号开始,但数据总是要到2号或3号才会发布,直到故事已经有机会盈利了。为了考虑到这一点,就像在Stripe管道中一样,我会在月初设定我的时间表,通常是在11号左右。

Stripe管道cron计划表,图片来自作者

然后,我使用手机提醒等更简单的技术来确保完成下载流程。值得庆幸的是,只要文件存在于数据桶中、包含数据且格式未变,管道就会自动摄取文件并将数据上传到BigQuery

当我读到关于数据自动化的思考文章(我写过一些)或听到对人工智能的担忧时,我有理由相信,像上面分享的这些非常规用例将会让人类继续处于循环之中。

由于不是每家公司都能以相同的速度扩展数据基础设施,因此会有一些供应商不具备以同步、按需方式(如通过API)提供数据的能力。

尽管我很想认为自己已经在自动化方面做了很多工作,并进而优化了工作流程,但数据工程中总会有人工劳动的因素。

总有1-2%的工作需要你的判断力和脑力。

即使你只是用大脑撰写一封电子邮件,告诉供应商你还没有收到数据。

感谢阅读!你还可以订阅我们的YouTube频道,观看大量大数据行业相关公开课:https://www.youtube.com/channel/UCa8NLpvi70mHVsW4J_x9OeQ;在LinkedIn上关注我们,扩展你的人际网络!https://www.linkedin.com/company/dataapplab/

原文作者:Zach Quinn
翻译作者:Qing
美工编辑:过儿
校对审稿:Jason
原文链接:https://medium.com/pipeline-a-data-engineering-resource/the-simple-reason-your-data-pipelines-will-never-be-100-automated-0e0ade43d3cb