大数据全栈式开发语言 – Python
前段时间,ThoughtWorks 在深圳举办一次社区活动上,有一个演讲主题叫做“Fullstack JavaScript”,是关于用 JavaScript 进行前端、服务器端,甚至数据库(MongoDB)开发,一个 Web 应用开发人员,只需要学会一门语言,就可以实现整个应用。
受此启发,我发现 Python 可以称为大数据全栈式开发语言。因为 Python 在云基础设施,DevOps,大数据处理等领域都是炙手可热的语言。
领域 | 流行语言 |
---|---|
云基础设施 | Python, Java, Go |
DevOps | Python, Shell, Ruby, Go |
网络爬虫 | Python, PHP, C++ |
数据处理 | Python, R, Scala |
就像只要会 JavaScript 就可以写出完整的 Web 应用,只要会 Python,就可以实现一个完整的大数据处理平台。
云基础设施
这年头,不支持云平台,不支持海量数据,不支持动态伸缩,根本不敢说自己是做大数据的,顶多也就敢跟人说是做商业智能(BI)。
云平台分为私有云和公有云。私有云平台如日中天的 OpenStack, 就是 Python 写的。曾经的追赶者 CloudStack,在刚推出时大肆强调自己是 Java 写的,比 Python 有优势。结果,搬石砸脚,2015 年初,CloudStack 的发起人 Citrix 宣布加入 OpenStack 基金会,CloudStack 眼看着就要寿终正寝。
如果嫌麻烦不想自己搭建私有云,用公有云,不论是 AWS,GCE,Azure,还是阿里云,青云,在都提供了 Python SDK,其中 GCE 只提供 Python 和 JavaScript 的 SDK,而青云只提供 Python SDK。可见各家云平台对 Python 的重视。
提到基础设施搭建,不得不提 Hadoop,在今天,Hadoop 因为其 MapReduce 数据处理速度不够快,已经不再作为大数据处理的首选,但是 HDFS 和 Yarn——Hadoop 的两个组件——倒是越来越受欢迎。Hadoop 的开发语言是 Java,没有官方提供 Python 支持,不过有很多第三方库封装了 Hadoop 的 API 接口(pydoop,hadoopy 等等)。
Hadoop MapReduce 的替代者,是号称快上 100 倍的 Spark,其开发语言是 Scala,但是提供了 Scala,Java,Python 的开发接口,想要讨好那么多用 Python 开发的数据科学家,不支持 Python,真是说不过去。HDFS 的替代品,比如 GlusterFS,Ceph 等,都是直接提供 Python 支持。Yarn 的替代者,Mesos 是 C++ 实现,除 C++ 外,提供了 Java 和 Python 的支持包。
DevOps
DevOps 有个中文名字,叫做开发自运维。互联网时代,只有能够快速试验新想法,并在第一时间,安全、可靠的交付业务价值,才能保持竞争力。DevOps 推崇的自动化构建/测试/部署,以及系统度量等技术实践,是互联网时代必不可少的。
自动化构建是因应用而易的,如果是 Python 应用,因为有 setuptools, pip, virtualenv, tox, flake8 等工具的存在,自动化构建非常简单。而且,因为几乎所有 Linux 系统都内置 Python 解释器,所以用 Python 做自动化,不需要系统预安装什么软件。
自动化测试方面,基于 Python 的 Robot Framework 企业级应用最喜欢的自动化测试框架,而且和语言无关。Cucumber 也有很多支持者,Python 对应的 Lettuce 可以做到完全一样的事情。Locust 在自动化性能测试方面也开始受到越来越多的关注。
自动化配置管理工具,老牌的如 Chef 和 Puppet,是 Ruby 开发,目前仍保持着强劲的势头。不过,新生代 Ansible 和 SaltStack——均为 Python 开发——因为较前两者设计更为轻量化,受到越来越多开发这的欢迎,已经开始给前辈们制造了不少的压力。
在系统监控与度量方面,传统的 Nagios 逐渐没落,新贵如 Sensu 大受好评,云服务形式的 New Relic 已经成为创业公司的标配,这些都不是直接通过 Python 实现的,不过 Python 要接入这些工具,并不困难。
除了上述这些工具,基于 Python,提供完整 DevOps 功能的 PaaS 平台,如 Cloudify 和 Deis,虽未成气候,但已经得到大量关注。
网络爬虫
大数据的数据从哪里来?除了部分企业有能力自己产生大量的数据,大部分时候,是需要靠爬虫来抓取互联网数据来做分析。
网络爬虫是 Python 的传统强势领域,最流行的爬虫框架 Scrapy,HTTP 工具包 urlib2,HTML 解析工具 beautifulsoup,XML 解析器 lxml,等等,都是能够独当一面的类库。
不过,网络爬虫并不仅仅是打开网页,解析 HTML 这么简单。高效的爬虫要能够支持大量灵活的并发操作,常常要能够同时几千甚至上万个网页同时抓取,传统的线程池方式资源浪费比较大,线程数上千之后系统资 源基本上就全浪费在线程调度上了。Python 由于能够很好的支持协程(Coroutine)操作,基于此发展起来很多并发库,如 Gevent,Eventlet,还有 Celery 之类的分布式任务框架。被认为是比 AMQP 更高效的 ZeroMQ 也是最早就提供了 Python 版本。有了对高并发的支持,网络爬虫才真正可以达到大数据规模。
抓取下来的数据,需要做分词处理,Python 在这方面也不逊色,著名的自然语言处理程序包 NLTK,还有专门做中文分词的 Jieba,都是做分词的利器。
数据处理
万事俱备,只欠东风。这东风,就是数据处理算法。从统计理论,到数据挖掘,机器学习,再到最近几年提出来的深度学习理论,数据科学正处于百花齐放的时代。数据科学家们都用什么编程?
如果是在理论研究领域,R语言也许是最受数据科学家欢迎的,但是R语言的问题也很明显,因为是统计学家们创建了R语言,所以其语法略显怪异。而 且R语言要想实现大规模分布式系统,还需要很长一段时间的工程之路要走。所以很多公司使用R语言做原型试验,算法确定之后,再翻译成工程语言。
Python 也是数据科学家最喜欢的语言之一。和R语言不同,Python 本身就是一门工程性语言,数据科学家用 Python 实现的算法,可以直接用在产品中,这对于大数据初创公司节省成本是非常有帮助的。正式因为数据科学家对 Python 和R的热爱,Spark 为了讨好数据科学家,对这两种语言提供了非常好的支持。
Python 的数据处理相关类库非常多。高性能的科学计算类库 NumPy 和 SciPy,给其他高级算法打了非常好的基础,matploglib 让 Python 画图变得像 Matlab 一样简单。Scikit-learn 和 Milk 实现了很多机器学习算法,基于这两个库实现的 Pylearn2,是深度学习领域的重要成员。Theano 利用 GPU 加速,实现了高性能数学符号计算和多维矩阵计算。当然,还有 Pandas,一个在工程领域已经广泛使用的大数据处理类库,其 DataFrame 的设计借鉴自R语言,后来又启发了 Spark 项目实现了类似机制。
对了,还有 iPython,这个工具如此有用,以至于我差点把他当成标准库而忘了介绍。iPython 是一个交互式 Python 运行环境,能够实时看到每一段 Python 代码的结果。默认情况下,iPython 运行在命令行,可以执行ipython notebook
在网页中运行。用 matplotlib 绘制的图可以直接嵌入式的显示在 iPython Notebook 中。
iPython Notebook 的笔记本文件可以共享给其他人,这样其他人就可以在自己的环境中重现你的工作成果;如果对方没有运行环境,还可以直接转换成 HTML 或者 PDF。
为什么是 Python
正是因为应用开发工程师、运维工程师、数据科学家都喜欢 Python,才使得 Python 成为大数据系统的全栈式开发语言。
对于开发工程师而言,Python 的优雅和简洁无疑是最大的吸引力,在 Python 交互式环境中,执行import this
, 读一读 Python 之禅,你就明白 Python 为什么如此吸引人。Python 社区一直非常有活力,和 NodeJS 社区软件包爆炸式增长不同,Python 的软件包增长速度一直比较稳定,同时软件包的质量也相对较高。有很多人诟病 Python 对于空格的要求过于苛刻,但正是因为这个要求,才使得 Python 在做大型项目时比其他语言有优势。OpenStack 项目总共超过 200 万行代码,证明了这一点。
对于运维工程师而言,Python 的最大优势在于,几乎所有 Linux 发行版都内置了 Python 解释器。Shell 虽然功能强大,但毕竟语法不够优雅,写比较复杂的任务会很痛苦。用 Python 替代 Shell,做一些复杂的任务,对运维人员来说,是一次解放。
对于数据科学家而言,Python 简单又不失强大。和C/C++相比,不用做很多的底层工作,可以快速进行模型验证;和 Java 相比,Python 语法简洁,表达能力强,同样的工作只需要1/3 代码;和 Matlab,Octave 相比,Python 的工程成熟度更高。不止一个编程大牛表达过,Python 是最适合作为大学计算机科学编程课程使用的语言——MIT 的计算机入门课程就是使用的 Python——因为 Python 能够让人学到编程最重要的东西——如何解决问题。
顺便提一句,微软参加 2015 年 PyCon,高调宣布提高 Python 在 Windows 上的编程体验,包括 Visual Studio 支持 Python,优化 Python 的C扩展在 Windows 上的编译等等。脑补下未来 Python 作为 Windows 默认组件的场景。
来自: insights.thoughtworkers.org