前段時間,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推崇的自動化建置/測試/部署,以及系統度量等技術實踐,是網路時代必不可少的。
自動化建置是因為應用而易的,如果是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互動式環境中,執行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預設元件的場景。
以上是大數據全端開發語言 – Python的詳細內容。更多資訊請關注PHP中文網其他相關文章!