我写了一本名为「支撑大数据的技术[增补改订]」的书

经过技术评论社的修订,2017年出版的《支撑大数据的技术》将作为2021年版重新出版。

undefined

WEB+DB PRESS plus系列
【增补修订】支撑大数据的技术
——用一台笔记本学习数据基础设施的原理
https://gihyo.jp/book/2021/978-4-297-11952-2

改訂的背景

在这本书中,作者以自己在Treasure Data株式会社任职期间的经验为基础,解释了关于“如何构建大数据处理系统”的基础概念。在这次修订版中,除了对陈旧的描述进行了修正,还增加了一些关于机器学习和容器技术等话题。

关于本书的概要已在下一页总结。

    本書について ―改訂にあたって

本来只是打算重新书写旧第六章的示例代码,但是不知不觉间增加了很多附加内容,结果第一版相比,厚了大约60页。加上重新编写的页面,本次修订大约有100页的新内容。

虽然如此,在过去的四年中,大数据技术并没有发生很大的改变,我认为大部分内容仍然适用于初版。本书的内容原本主要是帮助读者“理解技术概念”或“整理技术术语”,但是我认为大数据基础技术本身在2016年左右已经完成,这是我个人的印象。

对于试图学习大数据技术的初学者来说,我认为通过阅读本书,可以帮助他们理解这一领域的整体情况。另一方面,对于已经阅读过初版的读者来说,是否值得阅读这个修订版是一个令人犹豫的问题,因为每个人所能获得的收获可能会有所不同。请参考下面总结的主要变更内容。

修改版中的修改內容 de

我新增了第6章,题为“大数据与机器学习”。内容是关于“特征库(Feature Store)”和“MLOps”的概要说明。

特征存储是从2018年开始流行的概念,旨在构建专为机器学习数据而设计的存储。例如,到2020年底推出了”Amazon SageMaker特征存储”,我认为它的普及还在未来。

在这个版本的修订中,我们通过查看三个特征存储(Michelangelo、Hopsworks、Feast)的架构来解释“特征存储的构建方式以及大数据技术如何被使用”的问题。有趣的是,每个特征存储都使用了Kafka和Spark。

一方面,关于MLOps,我们只简要介绍了”Kubeflow”的功能。对于已经了解MLOps的人来说,并没有什么新鲜的内容,但在构建数据管道时,”是使用通用的工作流管理工具(例如Airflow),还是使用专门为MLOps设计的管道工具”这是一个有分歧的判断点,所以我们将其作为在考虑数据基础设施时的一个选项来介绍。

最近几年来,工作流管理工具的种类真的非常多,让人有点犹豫该选哪个。目前来看,我认为主流的是”Apache Airflow”。虽然我也使用了大约三年,但渐渐地感到它有一些不方便之处,因此一直在寻找更好的选择。

我现在主要使用”Prefect”,在这次的改版中也经过了一番犹豫后决定以”Prefect”为主。虽然”Prefect”的核心功能是开源的,但也提供商业化的云服务,所以并不能完全算作纯粹的开源软件。不过,因为可以很容易地在Kubernetes上运行,个人我还是很喜欢它的。

重新实现示例代码

在新的第七章中,我们彻底重写了旧的第六章,并提供了用于加工和汇总文本数据的具体示例代码。这次我们放弃了对Homebrew的依赖,而是使用Ubuntu 20.04和Docker进行实现。(我们将使用Multipass作为虚拟机)

为了更方便地运行示例代码,在某些代码中还可以在Google Colab上运行。

    • 7.1節のサンプルコード

 

    7.3節のサンプルコード

Google Colab可以运行Spark了,真是个好时代啊!

在本次示例代码中,我们将通过以下步骤执行数据管道。

    1. 从网站上下载文本文件

 

    1. 保存在与S3兼容的对象存储中(创建数据湖)

使用Spark进行ETL过程(数据结构化)

使用Presto创建数据仓库

使用Metabase创建仪表盘(可视化)

最开始,这些任务将按顺序手动执行,最后使用工作流管理工具(Prefect)进行自动化。

将工作流程容器化

选择Prefect的一个原因是容器化工作流程非常简单。虽然现在已经不再是没有使用容器技术进行数据处理的时代,但是在Prefect中,我们可以使用下面的代码来构建Docker镜像并将其注册到注册表中,以便在Kubernetes等环境中运行。

from prefect import task, Flow
from prefect.environments.storage import Docker

# タスクを実装
@task
def my_task():
  # do something
  ...

# ワークフロー(タスクの実行順序)を定義
with Flow('my-flow') as flow:
  my_task()

# Dockerイメージをビルドしてレジストリにデプロイ
flow.storage = Docker(
  registry_url='ghcr.io/my-project',
)

# Prefectサーバーにメタ情報を登録(実行開始)
flow.register(project_name='my-project')

很遗憾,Prefect的手册有点难读,有时需要阅读源代码才能理解其规范。由于开发非常活跃且规范经常变动,也许现在还不是谈论该书籍的时机,但我希望能够传达一下什么是工作流程容器化。

顺便提一下,本书中未能记录在内的是,最新的Prefect 0.14版本中,Kubernetes环境下的资源分配方法已经发生了变化,现在可以轻松地通过工作流来指定。

    Prefect 0.14.0: Improved Flow Run Configuration
# Run on Kubernetes with a custom resource configuration
flow.run_config = KubernetesRun(cpu_request=2, memory_request="4Gi")

数据的可视化

将数据可视化软件重写为以开源软件“Metabase”和云服务“Google数据门户”为中心(第2章,第7章)。由于两者都是免费使用的,因此可以作为迈出的第一步轻松引入。

補充:本次修訂中未能提及的事項。

我会将我最终没有写的话题总结如下。

消息传递

从 Apache Kafka 0.11 版本开始,它支持“精确一次”消息传递。据说 Kafka 2.5 更加易于使用,但本次修订版无法完全涵盖这方面的内容。

    Improved Robustness and Usability of Exactly-Once Semantics in Apache Kafka

鉴于Kafka已成为消息传送的事实标准,因此更深入地探讨可能更好一些,但本书更注重批处理而不是流处理。

在中国,我们越来越经常看到这样的主张:放弃批处理的ETL,统一使用流处理。

    ETLは過去のものか – Apache Kafkaがデータ処理の未来なのか?

对于这个讨论,我对自己的观点没有太强烈的意见,但完全消除ETL是不可能的,作为学习顺序,我认为先掌握ETL的方法比先学Kafka更好。

然而,毋庸置疑,流处理确实更适合某些数据,所以最好准备了使用Kafka的简单示例代码。

工作流程管理

关于工作流管理的实例,我们只考虑了Prefect,但在执行大量SQL的工作流中,使用声明式工具会更容易。作者以前使用过”Digdag”,但最近开始使用更专注于执行SQL的”dbt”。Prefect中还包含了执行dbt任务的功能,可以在使用Prefect描述工作流的整体流程的同时,将SQL的执行部分交给dbt来处理。

对于被称为「容器原生工作流引擎」的「Argo」,我无法提供详细说明。在Kubernetes的周边,它似乎非常受欢迎,但我还是更喜欢使用Python来编写工作流。也许对于那些耗费资源的工作流,其中「一个任务等于一个容器」,Argo可能更适合。

根据不同的目的,ETL过程以数据传输为主,执行SQL来创建数据仓库,进行特征工程用于机器学习,以及执行机器学习的训练和部署等,可能会有不同的最佳工具。然而,由于不想过度增加使用的工具,这是一个令人困扰的问题。

大的

几乎没有关于使用「Dask」进行数据处理的讨论。对于适合存储在内存中的数据,使用pandas;对于需要使用大量计算机进行分布式处理的数据,使用Spark已成为标准。然而,在这两者之间的中等规模的数据处理中,Dask非常适用。

由于使用Dask的人通常是机器学习工程师或数据科学家,所以可能超出了本书的主要目标读者——数据工程师的职责范围。然而,最近机器学习工程师的数量似乎在增加,所以或许本来应该更详细地描述一下。

云服务

我对使用云服务构建数据基础设施一无所知。考虑到提供的服务如”AWS”和”Google Cloud”这样的平台,以及提供的多云服务例如”Snowflake”和”Databricks”,甚至包括专门的数据平台如”Treasure Data CDP”,我决定放弃继续写下去,因为已经没有什么好写的了。

我希望通过这本书所涉及的主题,能帮助读者理清基础知识,因为这些主题在任何使用服务的情况下都是必不可少的普适内容。

改动后的目录(从第六章开始)

从出版社的页面转载

第6章 ビッグデータと機械学習

6.1 特徴量ストア
- 機械学習のための特徴量ストア
- 特徴量ストアによるデータ管理
- 特徴量ストアの実装例
6.2 MLOps
- 機械学習のためにデータパイプラインを構築する
- MLOpsの全体構成 ……三段階の発展
- MLOpsと特徴量ストア
- Kubeflow ……機械学習のオーケストレーション
- その他の機能 ……Metadata,Katib,Tools for Servingなど
6.3 まとめ

第7章 [実践]ビッグデータ分析基盤の構築

7.1 ノートブックとアドホック分析
- 学習にあたって
- サンプルデータの内容 ……5分ごとの気温
- 作業環境の構築 ……MultipassでUbuntu 20.04を起動する
- PythonスクリプトによるCSVファイルの収集
- データの内容を確認する ……pandas
- Sparkによる分散環境を整える
- 可視化によるデータ検証 ……Tableau Public
7.2 バッチ型のデータパイプライン
- Dockerによる環境構築 ……ラップトップ上での開発環境
- オブジェクトストレージ ……MinIO
- 構造化データの管理 ……Hiveメタストア
- オブジェクトストレージへのデータ転送
- ETLプロセス ……Spark
- クエリエンジンによるデータ集計 ……Presto
- ダッシュボードツールによる可視化 ……Metabase
- 特徴量エンジニアリング ……SQLとSpark
7.3 ワークフロー管理ツールによる自動化
- Prefect ……スクリプト型のワークフロー管理
- バッチ型のデータパイプラインを定義する
- 本番環境におけるワークフロー管理
- ワークフローのオーケストレーション ……ロジックと構成定義とを分離する
- 作業環境の削除 ……multipass delete
7.4 まとめ
bannerAds