天天看點

我為什麼說 Python 是大資料全棧式開發語言

我為什麼說 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的優雅和簡潔無疑是最大的吸引力,在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-08-24

本文來自雲栖社群合作夥伴“大資料文摘”,了解相關資訊可以關注“bigdatadigest”微信公衆号