- 本书赞誉
- 前言
- 目标读者
- 不适合阅读本书的读者
- 本书结构
- 什么是数据处理
- 遇到困难怎么办
- 排版约定
- 使用代码示例
- 致谢
- 第 1 章 Python 简介
- 第 2 章 Python 基础
- 第 3 章 供机器读取的数据
- 第 4 章 处理 Excel 文件
- 第 5 章 处理 PDF 文件 以及用 Python 解决问题
- 第 6 章 数据获取与存储
- 第 7 章 数据清洗:研究、匹配与格式化
- 第 8 章 数据清洗:标准化和脚本化
- 第 9 章 数据探索和分析
- 第 10 章 展示数据
- 第 11 章 网页抓取:获取并存储网络数据
- 第 12 章 高级网页抓取:屏幕抓取器与爬虫
- 第 13 章 应用编程接口
- 第 14 章 自动化和规模化
- 第 15 章 结论
- 附录 A 编程语言对比
- 附录 B 初学者的 Python 学习资源
- 附录 C 学习命令行
- 附录 D 高级 Python 设置
- 附录 E Python 陷阱
- 附录 F IPython 指南
- 附录 G 使用亚马逊网络服务
- 关于作者
- 关于封面
14.7 大规模自动化
如果系统需要多台机器或者服务器来处理,或者报告是关于一个分布式系统或者其他事件驱动系统的,很可能你会需要比 Web 接口、notebook 和 corn 更加健壮的工具。如果你需要一个真正的任务管理系统并且想要使用 Python,你很幸运。在这一节中,我们会介绍一个健壮的任务管理工具,Celery(http://www.celeryproject.org),它能处理大量的任务,自动化 worker(你会在下一节学习 worker 相关的知识),并且提供监控解决方案。
我们还会介绍操作自动化。如果你管理着一系列的服务器或不同需求的环境,这会很有帮助。Ansible(http://www.ansible.com)是一个非常棒的自动化工具,能够帮助完成各种任务,从数据库迁移到大规模集成部署。
还有一些 Celery 的替代方案,例如 Spotify 的 Luigi(https://github.com/spotify/luigi)。如果你正在使用 Hadoop,并且有大规模任务管理的需要(特别是长时间运行的任务,这可能成为一个痛点),它非常有用。关于操作自动化的好的替代品确实有很多。如果你只需要管理很少的服务器,对于只使用 Python 的部署,一个好的选择是 Fabric(http://www.fabfile.org/)。
对于大规模的服务器管理,一个很好的选择是 SaltStack(http://saltstack.com/),或同很多部署与管理工具[例如 Chef(https://www.chef.io/chef/)或 Puppet(https://puppetlabs.com/)]一起使用 Vagrant(https://www.vagrantup.com/)。我们选择重点介绍在这一节中使用的一些工具,但是它们不是使用 Python 处理大规模自动化程序的唯一选择。考虑到领域的声望和必要性,我们建议在你最喜欢的科技论坛上参与大规模自动化的讨论,例如 Hacker News(https://news.ycombinator.com/)。
14.7.1 Celery:基于队列的自动化
Celery(http://www.celeryproject.org/)是一个用来创建分布式队列系统的 Python 库。有了 Celery,可以通过调度器或者通过时间和消息来管理任务。如果你正在寻找能够处理长时间运行的时间驱动的任务的、可扩展的工具,Celery 是一个很完整的解决方案。Celery 很好地集成了几个不同的队列。它使用设置文件、用户接口和 API 调用来管理任务。它非常容易上手,所以如果这是你第一次使用任务管理系统的话,没有必要害怕。
无论你如何创建 Celery 项目,都很可能包含下面的任务管理系统组件。
· 消息中间件(例如 RabbitMQ,https://www.rabbitmq.com/)
消息中间件类似于一个等待处理的任务的队列。
· 任务管理器 / 队列管理器(Celery)
这个服务会跟踪一些逻辑,这些逻辑控制着使用多少 worker、什么任务有优先权、以及何时重试,等等。
· worker
worker 是通过 Celery 控制的 Python 进程,执行 Python 代码。它们知道你让它们去执行什么任务,并且尝试执行这些 Python 代码到结束。
· 监控工具[例如 Flower(http://flower.readthedocs.org/en/latest/)]
允许查看 worker 和队列,对于回答类似于“昨晚什么失败了”这样的问题很有用。
Celery 有一个很有用的上手指南(http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html),但是我们发现最大的问题并不是学习如何使用 Celery,而是了解什么类型的任务适合于队列、什么类型不适合于队列。表 14-2 综述了一些有关基于队列自动化的问题和原则。
表14-2:队列还是非队列?
基于队列的任务管理需求 | 不需要队列的自动化需求 |
任务没有一个确定的截止日期 | 任务可以并且的确有截止日期 |
不需要知道有多少任务 | 可以轻松地量化需要完成什么任务 |
只是大体上知道任务的优先级 | 清楚地知道任务的优先级 |
任务不需要总按顺序发生,或者通常不是有顺序的 | 任务必需按顺序发生 |
任务有时花费很长的时间,有时花费很短的时间 | 需要知道任务花费多长时间 |
任务调用(或排队)基于一个事件或其他的 | 任务结束任务基于时间或其他可预测的事情 |
任务失败是可以的;可以重试 | 必须了解每一次任务的失败 |
有大量的任务,而且很有可能继续增长 | 每天只有几个任务 |
这些都是一般性的需求,但是它们指出了关于何时选择任务队列和何时最好运行在一个有警报、监控和日志的调度器上,这两者之间的一些理念区别。
任务的不同部分位于不同的系统中是没问题的,而且你在大公司会经常看到不同的任务“桶”(bucket)。也可以同时测试基于队列的和不基于队列的任务管理工具,以确定哪一种最适合你和你的项目。
Python 也有其他的任务和队列管理系统,包括 Python RQ(http://python-rq.org/)和 PyRes(https://github.com/binarydud/pyres)。这两者都是很新的库,因此在解决问题方面,可能没有足够的资源能够通过 Google 搜索到,但是如果你想要从 Celery 开始,之后转移到其他的选择上,你有了备选项。
14.7.2 Ansible:操作自动化
如果你当前的规模需要 Celery 帮助管理任务,很可能你同样需要一些帮助,来管理其他的服务和操作。如果项目需要在一个分布式系统上维护,你应该开始组织它们,这样可以轻松地通过自动化实现分布式。
Ansible(http://www.ansible.com/home)是一个自动化项目操作的非常棒的系统。Ansible 提供了一系列的工具,你可以用来迅速编写、部署和管理代码。你可以使用 Ansible 来迁移项目,备份远程机器上的数据。你还可以使用它根据需要来使用安全补丁或新的包更新服务器。
Ansible 有一个快速开始的视频(http://docs.ansible.com/quickstart.html),可用来了解所有的基础知识,但是我们同样想强调文档中描述的几个最有用的特性:
· MySQL 数据库管理(http://docs.ansible.com/mysql_db_module.html)
· Digital Ocean 基本单元和键管理(http://docs.ansible.com/ansible/list_of_cloud_modules.html#digital-ocean)
· 滚动升级和部署指南(http://docs.ansible.com/guide_rolling_upgrade.html)
同样建议你查看 Justin Ellingwood 的关于 Ansible 操作的介绍(https://www.digitalocean.com/community/tutorials/how-to-create-ansible-playbooks-to-automate-system-configuration-on-ubuntu)和 Servers for Hackers 关于 Ansible 的扩展介绍(https://serversforhackers.com/an-ansible-tutorial)。
如果你只有一两台服务器,或者只部署一两个项目,Ansible 很可能太高级或过于复杂,但是随着项目的成长,你需要一些工具来帮助保持项目的有效组织时,它就是一个很好的资源。如果你对操作和系统管理有兴趣,这是一个很值得学习和掌握的工具。
如果你更喜欢把操作留给你创建的一个很好的镜像上,每一次操作时只需要重新启动,大量的云服务提供商允许你这么做!对于你的数据处理需求来说,你并不需要成为一个操作自动化专家。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论