·Python基础知识,简单介绍语言特性。
·如何自动处理文本,编写命令行工具和自动处理文件系统。
·Linux实用程序、包管理、构建系统、监控、监测和自动化测试。
·云计算、IaC、Kubernetes和Serverless。
·站在DevOps的角度探讨机器学习和数据工程。
·构建、部署和优化一个机器学习项目。
前言
一次,Noah 在海中游泳,突然一波海浪袭来,把他卷入深水,无法呼吸。他挣扎着,奋力游出水面,可是海浪一波未平一波又侵袭而来。他的体力渐渐不支,慢慢沉入海中。而他没有放弃,还在拼命挣扎,但是海浪并没有停歇的意思。在与海浪的殊死搏斗中,他的体力所剩无几,他不知道自己会不会命丧于此。他无法呼吸,浑身无力,真害怕自己会溺水身亡。直面死亡的恐惧使他认识到,要想活命就必须保存体力、随波逐流,不能一味挣扎。
不使用DevOps 的初创企业就像Noah 那一次的经历一样,让人心惊胆战。生产环境中的火情频繁,几个月得不到解决;一切都是手动操作的,连续几天被警报消息吵醒……这样的问题持续下去,牺牲的只能是你的健康。脱离死亡漩涡的唯一出路就是DevOps。
万事开头难,逐个解决问题,总有一天能打通整个环节。可以先搭建一个服务器,着手测试代码,并把目前手动执行的任务自动化。一定要做点什么,做什么都可以,重要的是行动。先把第一步走稳,而且要实现自动化。
初创企业,也可以说所有公司面临的一个共通性问题是,总想寻求“救世主”来解决问题。性能有瓶颈:“我们需要性能工程师”;销售不利:“我们需要首席营收官”;部署流程不畅:“我们需要DevOps 工程师”。
在某公司,Noah 的一个项目持续了一年多,期间使用不同语言重写了三次Web 应用。
现在只需要找一个“性能工程师”扫尾了。记得当时只有笔者初生牛犊不怕虎,问了句“性能工程师是做什么的”。性能工程师负责解决一切弹性伸缩问题。那一刻,Noah 突然认识到,他们是在寻找“救世主”。对救世主的依赖最能揭示新产品或初创企业危机四伏的状况。连自己都拯救不了的人何谈拯救整个公司。
在其他一些公司,Noah 经常听到这样的抱怨:“要是能雇一个资深Erlang 工程师多好”“要是能雇一个人帮我们增加营收多好”“要是能雇一个人教我们规范财务制度多好”“要是能雇一个Swift 开发者多好”……难道多雇这么一个人,你的初创企业或新产品就能存活下来吗?即便真有这样的救世主,也要找到症结所在方能力挽狂澜。
对于寄希望于雇一位性能工程师的公司来说,真正的症结在于技术监督不力,在于用人不当(对真正能解决问题的人大喊大叫是解决不了问题的)。工作表现不好的人就解雇,让知道如何解决问题的团队成员发声,推翻当前的工作清单从头来过,调入合格的工程管理人员,这样性能问题将迎刃而解,根本不用救世主降临。
在创业的路上,不要指望别人;你和你所在的团队要设法保护自己,通力合作,规范流程,笃信未来。遇到问题,不是再雇一个人就能解决的;出现问题,要客观、认真地分析,找出根源所在,一步一步地行动,最终找到解决方案。求人不如求己,根本没什么救世主。
就像在风暴中即将溺水的人一样,能拯救你(或公司)的人只有你自己。你就是公司要找的那个救世主,或许你会发现,你的同事也是。
混乱的状况也是有出路的,且听我们慢慢道来。
DevOps 在笔者心中的含义
软件行业中很多抽象的概念是无法准确定义的,云计算、敏捷和大数据就是如此,这些概念如何定义,取决于参与讨论的是哪些人。鉴于此,笔者不打算给DevOps下一个严格的定义。下面简单说一下DevOps 出现的必然因素:
?? 开发和运维团队双向合作。
?? 把几天甚至几周的运维任务精简到几分钟到几小时。
?? 让开发人员积极参与,不然还是开发与运维各自为战。
?? 运维人员需要具备一定的开发技能,至少要懂Bash 和Python。
?? 开发人员需要具备一定的运维技能。开发人员的职责不限于编写代码,还要负责把系统部署到生产环境并监控异常。
?? 自动化、自动化、自动化。不掌握开发技能无法准确实现自动化,不掌握运维技能无法正确实现自动化。
?? 转变观念,让开发人员掌握话语权,至少要能自主部署代码。
?? 可通过CI/CD 流水线实现。
?? GitOps。
?? 在开发和运维部门之间共享一切(工具、知识等)。
?? 在设计、实现、部署和自动化上持续协作,合作是成功的基石。
?? 不能自动化执行的操作让人心里不踏实。
?? 文化:等级制度< 流程。
?? 多个微服务> 巨型单体。
?? 持续部署系统是软件团队的核心和灵魂。
?? 没有救世主。
?? 持续交付不是可选项,而是必达的命令。
如何阅读本书
本书可按任意顺序阅读。随便翻看一章,你都会找到对你的工作有所帮助的内容。有经验的Python 程序员可以跳过第1 章。如果你对惨痛经验、案例分析和人物访谈感兴趣,可以先阅读最后一章。
内容结构
本书内容按讨论话题的不同分为以下几部分。
第一部分介绍Python 基础,涵盖语言基础知识、文件和文件系统的自动化处理及命令行工具的编写。
第二部分讨论运维技术,涵盖Linux 实用程序、包管理、构建系统、监控和监测,以及自动化测试。这些是胜任DevOps 工作的必备技能。
第三部分介绍云技术基础,涉及云计算、IaC、容器技术、Kubernetes 和Serverless。
目前,软件行业紧缺掌握云技术的人才。掌握这一部分的知识,你的薪水和事业都将更上一层楼。
第四部分讨论数据处理,在DevOps 的背景下介绍机器学习运维和数据工程。这一部分还有一个完整的演练项目,你可以使用Flask、Sklearn、Docker 和Kubernetes实践机器学习模型的构建、部署和落地。
第五部分即最后一章,是DevOps 惨痛经验、案例分析、人物访谈。这一章适合睡前阅读。
Python 基础
?? 第1 章 Python DevOps 基础知识。
?? 第2 章 文件和文件系统自动化处理。
?? 第3 章 使用命令行。
运维技术
?? 第4 章 Linux 实用程序。
?? 第5 章 包管理。
?? 第6 章 持续集成和持续部署。
?? 第7 章 监控和日志。
?? 第8 章 pytest 在DevOps 中的应用。
云技术基础
?? 第9 章 云计算。
?? 第10 章 IaC。
?? 第11 章 容器技术:Docker 和Docker Compose。
?? 第12 章 容器编排:Kubernetes。
?? 第13 章 Serverless 技术。
数据处理
?? 第14 章 MLOps 和机器学习工程。
?? 第15 章 数据工程。
案例分析
?? 第16 章 DevOps 惨痛经验和人物访谈。
排版约定
本书采用下述排版约定:
斜体(Italic)
表示新术语、URL、电子邮件地址、文件名和扩展名。
等宽字体(Constant Width)
表示程序清单,在段落中出现则表示程序元素,如变量、函数名、数据库、数据类型、环境变量、语句和关键字。
粗体等宽字体(Constant Width Bold)
表示命令或其他由用户直接输入的文本。
斜体等宽字体(Constant Width Italic)
表示应该替换成用户提供的值,或者由上下文决定的值。
使用代码示例
本书的补充材料(代码示例、练习题,等等)可到https://pythondevops.com 下载。另外,可到Pragmatic AI Labs 的YouTube 频道(https://oreil.ly/QIYte)中观看与本书代码相关的DevOps 内容。
如有技术疑问想与作者探讨,或者在使用代码示例过程中遇到问题,请发电子邮件到technical@pythondevops.com。
本书是要帮你完成工作的。一般来说,如果本书提供了示例代码,你可以把它用在你的程序或文档中。除非你使用了很大一部分代码,否则无须联系我们获得许可。例如,用本书的几个代码片段写一个程序无须获得许可,销售或分发O’Reilly 图书的示例光盘则需要获得许可;引用本书中的示例代码回答问题无须获得许可,将书中大量的代码放到你的产品文档中则需要获得许可。
我们很希望但并不强制要求你在引用本书内容时加上引用说明。引用说明一般包括书名、作者、出版社和ISBN。例如:“Python for DevOps by Noah Gift, Kennedy Behrman, Alfredo Deza, and Grig Gheorghiu. (O'Reilly). Copyright 2020 Noah Gift,Kennedy Behrman, Alfredo Deza, Grig Gheorghiu, 978-1-492-05769-7.”。
如果你觉得自己对示例代码的用法超出了上述许可的范围,请通过permissions@oreilly.com 与我们联系。
O’Reilly 在线学习平台(O’Reilly Online Learning)
近40 年来,O’Reilly Media 致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。
我们有一群独家专家和创新者,他们通过图书、文章、会议和在线学习平台分享知识和技术。O’Reilly 的在线学习平台提供按需访问的直播培训课程、详细的学习路径、交互式编程环境,以及由O’Reilly 和其他200 多家出版社出版的书籍和视频。详情请访问http://oreilly.com。
联系我们
任何有关本书的意见或疑问,请按照以下地址联系出版社。
美国:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
北京市西城区西直门南大街2 号成铭大厦C 座807 室(100035)
奥莱利技术咨询(北京)有限公司
勘误、示例和其他信息可到oreil.ly/python-for-devops 上获取。
对于本书的评论或技术性问题,请发送电子邮件到:bookquestions@oreilly.com
要了解O’Reilly 图书、培训课程、会议和新闻的信息,请访问以下网站:
http://www.oreilly.com
我们的Facebook:http://facebook.com/oreilly。
我们的Twitter:http://twitter.com/oreillymedia。
我们的YouTube:http://www.youtube.com/oreillymedia。
致谢
首先,笔者要感谢本书的两位主要技术审校。
第一位是Wes Novack,他是一名架构师和工程师,擅长公有云系统和Web 级SaaS应用。他负责设计、构建和管理复杂的系统,为托管在AWS 和GCP 上使用不同语言的大型微服务生态系统实现高可用性基础设施、持续交付流水线和快速发布。Wes 使用不同的语言、框架和工具定义Iac、推动自动化及减少劳作。他在技术社区十分活跃,并积极参与教学、研讨会和会议;他还是Pluralsight 视频教程的讲师。Wes 是DevOps 领域文化– 自动化– 精益– 度量– 分享(culture, automation, lean,measurement, Sharing,CALMS)模型的倡导者。他的Twitter 账号是@WesleyTech,博客地址是https://wesnovack.com。
第二位是Brad Andersen,他是一名软件工程师和架构师,已从事软件设计和开发30 年。他是变革和创新的引路人,曾在各种企业组织和初创企业中担任领导职务和开发人员。Brad 目前在加利福尼亚大学伯克利分校攻读数据科学硕士学位。Brad 的更多信息见他的LinkedIn 个人资料。
笔者还要感谢Jeremy Yabrow 和Colin B. Erdman,感谢他们提供的建议和反馈。
Noah
感谢与我合写本书的Grig、Kennedy 和Alfredo。与如此高效的团队合作真是让人心旷神怡。
Kennedy
感谢与我合写本书的各位,与你们合作特别愉快。感谢家人对我的耐心和理解。
Alfredo
写作本书的九年前,即2010 年,我找到了人生第一份软件工程工作。那一年我31 岁,没有大学学历,以前也没有从业经验,只能接受底薪,忍受没有医疗保险。我学到了很多,遇见了许多了不起的人,通过不懈地努力掌握了大量专业知识。那些年,如果没有人给我机会,没有人为我指明方向,我不可能有今天的成就。
感谢Chris Benson,他发现了我对知识的渴望,一直为我寻找学习的机会。
感谢Alejandro Cadavid,他发现我不辞辛劳,总是愿意做那些别人不愿意做的事。
在我感到心灰意冷,旁人觉得我一无是处时,是您帮我找到了工作。
Carlos Coll 带领我进入编程领域,在我自暴自弃时也没有放弃我。学习编程改变了我的生活,感谢Carlos 对我谆谆教导,督促我学习,指导我发布了人生第一个程序。
感谢Joni Benton,感谢他对我的信任,还帮我找到了第一份全职工作。
感谢Jonathan LaCour,他是一位鼓舞人心的老板,一直帮助我提升自我。您的建议珍贵无比。
感谢Noah,我们建立了深厚的友谊,您的指引是我巨大的动力源泉。我一直记得我们一起工作的日子,尤其是从头开始重新构建基础设施那次。在我还对Python 一无所知时,您的耐心和指导完全改变了我的生活。
最后,特别感谢我的家人。感谢我的妻子Claudia,她从不怀疑我的学习能力和上进心,在我笔耕不辍时毫无怨言。感谢我的孩子们,Efrain、Ignacio 和Alana,我爱你们。
Grig
感谢所有开源软件的创作人员。没有他们,我们的工作将充满崎岖。同样感谢所有写作博文、免费分享知识的人。最后,感谢与我合写本书的各位,这是一次充满乐趣的旅程。
Noah Gift是西北大学和杜克大学研究生院数据科学专业与工程项目的讲师和顾问。
Kennedy Behrman是一位资深顾问,专门为初创企业设计和实施云解决方案。
Alfredo Deza是一位软件工程师和开源软件开发者,他重建了公司的基础设施。
Grig Gheorghiu是一名程序员、研究实验室主任、系统/网络/安全架构师和软件测试工程师。
目录
前言 . 1
第1 章 Python DevOps 基础知识 11
1.1 安装和运行Python 12
1.1.1 Python shell 12
1.1.2 Jupyter Notebooks13
1.2 过程式程序设计 13
1.2.1 变量 14
1.2.2 基本的数学运算 15
1.2.3 注释 15
1.2.4 内置函数16
1.3 执行控制 17
1.3.1 if/elif/else .17
1.3.2 for 循环 .18
1.3.3 while 循环 20
1.4 处理异常 20
1.5 内置对象 21
1.5.1 对象是什么 .21
1.5.2 对象的方法和属性 22
1.5.3 序列 23
1.6 函数 .35
1.6.1 函数剖析36
1.6.2 函数是对象 .37
1.6.3 匿名函数38
1.7 使用正则表达式 39
1.7.1 搜索 39
1.7.2 字符集合40
1.7.3 字符类 41
1.7.4 分组 41
1.7.5 具名分组42
1.7.6 查找所有42
1.7.7 查找迭代器 .42
1.7.8 替换 43
1.7.9 编译 43
1.8 惰性求值 44
1.8.1 生成器 44
1.8.2 生成器推导 .45
1.9 更多IPython 功能 .46
1.9.1 在IPython 中运行UNIX shell 命令46
1.9.2 使用IPython 的魔法命令 47
1.10 练习题 .47
第2 章 文件和文件系统自动化处理 49
2.1 读写文件 49
2.2 使用正则表达式搜索文本 .59
2.3 处理大型文件 .61
2.4 加密文本 62
2.4.1 哈希和hashlib 63
2.4.2 使用Cryptography 库加密 63
2.5 os 模块 65
2.6 使用os.path 管理文件和目录 .67
2.7 使用os.walk 遍历目录树 70
2.8 使用pathlib 处理路径对象 71
第3 章 使用命令行 . 73
3.1 使用shell 73
3.1.1 使用sys 模块探知系统信息 73
3.1.2 使用os 模块处理操作系统 .74
3.1.3 使用subprocess 模块派生进程 .75
3.2 编写命令行工具 77
3.2.1 使用sys.argv .79
3.2.2 使用argparse .81
3.2.3 使用click .85
3.2.4 使用fire 90
3.2.5 实现插件系统 95
3.3 案例分析:使用命令行工具提速Python 96
3.3.1 使用Numba JIT 编译器 97
3.3.2 通过Python CUDA 使用GPU 99
3.3.3 使用Numba 真正多核多线程运行Python 代码 100
3.3.4 k 均值聚类算法 .101
3.4 练习题 .103
第4 章 Linux 实用程序 105
4.1 磁盘实用程序 106
4.1.1 衡量性能106
4.1.2 分区 .108
4.1.3 获取特定的设备信息 109
4.2 网络实用程序 111
4.2.1 SSH 隧道 111
4.2.2 使用Apache Benchmark(ab)评测HTTP . 112
4.2.3 使用molotov 做负载测试 . 113
4.3 CPU 实用程序 . 116
4.3.1 CPU 实用程序简介 116
4.3.2 使用htop 查看进程 . 116
4.4 使用Bash 和ZSH 118
4.4.1 自定义Python shell . 119
4.4.2 递归路径模式匹配 120
4.4.3 搜索和替换确认提示 120
4.4.4 删除Python 临时文件 122
4.4.5 列出和筛选进程 122
4.4.6 UNIX 时间戳 123
4.5 Python 与Bash 和ZSH 混合使用 124
4.5.1 随机密码生成器 124
4.5.2 这个模块是否存在 125
4.5.3 进入模块所在的目录 125
4.5.4 把CSV 文件转换成JSON 文件 .126
4.6 Python 单行程序 .127
4.6.1 调试器 127
4.6.2 这段代码的运行速度有多快 128
4.7 strace .129
4.8 练习题 .131
4.9 实操题 .132
第5 章 包管理 133
5.1 打包简介 .134
5.1.1 打包的重要性 .134
5.1.2 何时不需要打包 134
5.2 打包准则 .135
5.2.1 恰当的版本号 .135
5.2.2 更改日志136
5.3 选择一种策略 137
5.4 打包方案 .138
5.4.1 Python 原生包 138
5.4.2 Debian 包 145
5.4.3 RPM 包 153
5.5 使用systemd 管理服务 160
5.5.1 长时间运行的进程 161
5.5.2 创建项目161
5.5.3 systemd 单元文件 .163
5.5.4 安装单元164
5.5.5 处理日志166
5.6 练习题 .167
5.7 实操题 .168
第6 章 持续集成和持续部署 . 169
6.1 真实案例分析:把维护不善的WordPress 网站转换成Hugo 169
6.1.1 设置Hugo .171
6.1.2 把WordPress 文章转换成Hugo 文章 .172
6.1.3 创建并更新Algolia 索引 174
6.1.4 使用Makefile 编排流程 176
6.1.5 使用AWS CodePipeline 部署 .176
6.2 真实案例分析:使用Google Cloud Build 把Python 应用部署到
Google App Engine 中 178
6.3 真实案例分析:NFSOPS 185
第7 章 监控和日志 187
7.1 构建可靠系统的关键概念 187
7.2 不可变的DevOps 原则 188
7.2.1 集中处理日志 .188
7.2.2 案例分析:生产数据库塞满硬盘 .189
7.2.3 自建还是购买? 190
7.2.4 容错 .190
7.3 监控 192
7.3.1 Graphite .192
7.3.2 StatsD .192
7.3.3 Prometheus 193
7.4 监测程序 .197
7.4.1 监测程序概述 .197
7.4.2 命名约定200
7.5 日志 201
7.5.1 为什么很难 202
7.5.2 basicconfig 202
7.5.3 深度配置203
7.5.4 常用模式208
7.6 ELK 栈 .209
7.6.1 Logstash .210
7.6.2 Elasticsearch 和Kibana .212
7.7 练习题 .215
7.8 实操题 .216
第8 章 pytest 在DevOps 中的应用 217
8.1 测试小钢炮pytest 217
8.2 pytest 入门 .218
8.2.1 使用pytest 测试 218
8.2.2 与unittest 的区别 .220
8.3 pytest 特性 .222
8.3.1 conftest.py 223
8.3.2 出色的assert223
8.3.3 参数化 225
8.4 固件 226
8.4.1 入门 .227
8.4.2 内置固件229
8.5 基础设施测试 231
8.5.1 什么是系统验证 232
8.5.2 Testinfra 简介 .233
8.5.3 连接远程节点 .233
8.5.4 特性和特殊固件 237
8.5.5 案例 .238
8.6 使用pytest 测试Jupyter Notebooks 241
8.7 练习题 .242
8.8 实操题 .242
第9 章 云计算 243
9.1 云计算基础知识 .244
9.2 云计算的类型 246
9.3 云服务的类型 246
9.3.1 IaaS 247
9.3.2 MaaS 251
9.3.3 PaaS .251
9.3.4 Serverless 252
9.3.5 SaaS .255
9.4 IaC .256
9.5 持续交付 .256
9.6 虚拟化和容器 256
9.6.1 硬件虚拟化 256
9.6.2 SDN .257
9.6.3 SDS .257
9.6.4 容器 .257
9.7 分布式计算面临的挑战和机遇 258
9.8 云时代Python 的并发、性能和进程管理 260
9.9 进程管理 .261
9.9.1 使用subprocess 管理进程 261
9.9.2 使用multiprocessing 库解决问题 .263
9.9.3 使用Pool() 派生进程 264
9.9.4 FaaS 和Serverless 267
9.9.5 使用Numba 提升Python 的性能 267
9.9.6 使用Numba JIT 编译器 .267
9.9.7 使用高性能服务器 268
9.10 小结 269
9.11 练习题 269
9.12 实操题 270
第10 章 IaC 271
10.1 基础设施自动化工具分类 272
10.2 手动配置 274
10.3 使用Terraform 自动配置基础设施 .275
10.3.1 配置S3 bucket .276
10.3.2 使用ACM 配置SSL 证书 .279
10.3.3 配置Amazon CloudFront 分配 280
10.3.4 配置Route 53 DNS 记录 283
10.3.5 把静态文件复制到S3 中 284
10.3.6 删除使用Terraform 配置的所有AWS 资源 .285
10.4 使用Pulumi 自动配置基础设施285
10.4.1 为AWS 新建一个Pulumi Python 项目 286
10.4.2 为过渡堆栈创建配置值 291
10.4.3 配置一个ACM SSL 证书 291
10.4.4 配置Route 53 区域和DNS 记录 292
10.4.5 配置一个CloudFront 分配 .295
10.4.6 为网站的URL 配置一个Route 53 DNS 记录 296
10.4.7 创建并部署一个新堆栈 297
10.5 练习题 300
第11 章 容器技术:Docker 和Docker Compose 301
11.1 Docker 容器是什么 .302
11.2 创建、构建、运行及删除Docker 映像和容器 .302
11.3 把Docker 映像发布到Docker 注册处中 .306
11.4 使用相同的映像在不同的宿主机中运行Docker 容器 308
11.5 使用Docker Compose 运行多个Docker 容器 310
11.6 把Docker Compose 运行的服务移植到新主机和操作系统中 323
11.7 练习题 327
第12 章 容器编排:Kubernetes . 329
12.1 Kubernetes 相关概念简述 330
12.2 使用Kompose 根据docker-compose.yaml 创建Kubernetes 清单 331
12.3 使用minikube 把Kubernetes 清单部署到本地Kubernetes 集群 .333
12.4 在GCP 中使用Pulumi 创建GKE Kubernetes 集群 349
12.5 把Flask 示例应用部署到GKE 中 352
12.6 安装Helm chart Prometheus 和Grafana 359
12.7 销毁GKE 集群 .364
12.8 练习题 365
第13 章 Serverless 技术 367
13.1 把同一个Python 函数部署到三大云服务商中 .370
13.1.1 安装Serverless 框架 .370
13.1.2 把Python 函数部署到AWS Lambda 中 .370
13.1.3 把Python 函数部署到Google Cloud Functions 中 373
13.1.4 把Python 函数部署到Azure 中 380
13.2 把Python 函数部署到自托管的FaaS 平台中 384
13.2.1 把Python 函数部署到自托管的PaaS 平台的优势 384
13.2.2 把Python 函数部署到OpenFaaS 中 .385
13.3 使用AWS CDK 配置DynamoDB 数据表、Lambda 函数和
API 网关方法 .393
13.4 练习题 415
第14 章 MLOps 和机器学习工程 417
14.1 机器学习是什么 417
14.1.1 监督型机器学习 .417
14.1.2 建模 420
14.2 Python 机器学习生态环境 423
14.2.1 Python 机器学习框架和生态系统 423
14.2.2 PyTorch 深度学习 424
14.3 机器学习云平台 428
14.4 机器学习成熟模型 429
14.4.1 机器学习重点术语 .429
14.4.2 第1 层:问题构建、范围界定和问题定义 430
14.4.3 第2 层:持续交付数据 431
14.4.4 第3 层:持续交付净化数据 .432
14.4.5 第4 层:持续交付探索性数据分析 434
14.4.6 第5 层:持续交付传统机器学习和AutoML 434
14.4.7 第6 层:机器学习运作反馈环 435
14.5 使用Docker 和Kubernetes 部署sklearn Flask 应用 435
14.5.1 EDA 440
14.5.2 建模 441
14.5.3 调整GBM 缩放 442
14.5.4 拟合模型 .443
14.5.5 评估 444
14.5.6 adhoc_predict 445
14.5.7 JSON 工作流 446
14.5.8 缩放输入 .446
14.5.9 adhoc_predict 447
14.5.10 缩放输入 448
14.6 练习题 448
14.7 实操题 449
14.8 学习评价 449
第15 章 数据工程 . 451
15.1 小数据 452
15.1.1 小数据与大数据 .452
15.1.2 处理小数据文件 .452
15.2 写文件 453
15.3 读文件 453
15.4 使用生成器流水线逐行读取和处理 453
15.5 使用YAML .454
15.6 大数据 455
15.7 大数据工具、组件和平台 457
15.7.1 数据源 .458
15.7.2 文件系统 .458
15.7.3 数据存储 .459
15.7.4 实时流式采集 460
15.8 案例分析:自制数据流水线 461
15.9 Serverless 数据工程 462
15.9.1 使用AWS Lambda 处理CloudWatch 事件 463
15.9.2 使用Amazon CloudWatch 日志分析AWS Lambda 463
15.9.3 使用AWS Lambda 填充Amazon Simple Queue Service .464
15.9.4 连接CloudWatch 事件触发器 468
15.9.5 创建事件驱动型lambda .469
15.9.6 从AWS Lambda 中读取Amazon SQS 事件 .470
15.10 小结 .474
15.11 练习题 .475
15.12 实操题 .475
第16 章 DevOps 惨痛经验和人物访谈 . 477
16.1 产不出电影的电影厂 .478
16.2 推不出游戏的游戏坊 .480
16.3 耗时60 秒才启动的Python 脚本 .482
16.4 用缓存和智能监测程序浇灭火情 483
16.5 自动化会让你失业 484
16.6 DevOps 反模式 .485
16.6.1 反模式:没有自动化构建服务器 485
16.6.2 盲目行事 .486
16.6.3 协调难题不可避免 .486
16.6.4 没有团队合作 487
16.7 人物访谈 492
16.7.1 Glenn Solomon 492
16.7.2 Andrew Nguyen 493
16.7.3 Gabriella Roman .495
16.7.4 Rigoberto Roche .496
16.7.5 Jonathan LaCour .498
16.7.6 Ville Tuulos 500
16.7.7 Joseph Reis 502
16.7.8 Teijo Holzer 503
16.7.9 Matt Harrison 505
16.7.10 Michael Foord 507
16.8 一些建议 510
16.9 练习题 511
16.10 挑战题 . 511
16.11 毕业项目 511