轉載_那些年,追過的開源軟件和技術





前言


筆者也是在互聯網軟件行業裏面摸爬滾打十年多了,回頭想想青蔥歲月,很多時間都花在各種技術熱潮的追逐上,有些是有價值的,也有些因爲沒人指導走過彎路,下面我就把我自己接觸到這麼多優秀的開源軟件給大家做個梳理。也許比較枯燥無聊,供大家以後查閱。 


LAMP


屬於創業公司的最經典組合。

 

Linux不用說,大多數公司都用這個,隨着虛擬機越來越成熟,大家喜歡創建虛擬的Image,來提供某個Linux版本,我接觸過一些常用的,Ubuntu,Redhat,Debian, Gentoo, CentOS, Federo,OpenSuse。

 

Apache最著名的web server,Apache也是開源最活躍的社區,非常成熟的web服務器,有段時間被性能卓越的Nginx趕超,但目前穩定性和模塊成熟度還是最高,廣受好評。有人比較這兩者的差異:Nginx vs Apache。

 

PHP當時很多網站用Java寫的,php提出就是爲了簡化網站開發,爲web而寫。Facebook早年也是PHP寫的,是很靈活的腳本語言,Coursera之前也是用Php搭建的,但卻是很難維護,主要問題是每個人都可以寫一個小框架,編程風格隨便,難統一。除了Facebook他們花了大量人力去完善,基本上重寫了Php,底層加速成C++,也發明了新語言Hack。

 

MySQL經典開源數據庫,被Oracle收購,Facebook, Baidu, Taobao都是大量基於MySQL做出非常穩定靠譜的系統。我記得Pinterest也總結過他們爲什麼用MySQL提高他們的規模。

 

編程語言:


有個笑話,讓程序員打架的一個最有效的方式是去討論區問大家那種編程語言最好,這就會沒完沒了的討論。大致分成C++派,Java派,Python等腳本派。

 

C/C++可能很多人入門都是啃着譚浩強的C程序設計,這種語言很強大,既高性能,又靈活(指針,地址,二維指針,指針數組),名詞特別多(多態,重載,重用,範型,模板類,元編程),坑也特別多,容易造成內存泄露,野指針,在大學裏面吃了不少苦頭,瘋狂看各種C++經典,祕籍,後來去了創業公司和百度都是大量使用,裏面也很多人玩的如火純青,面試時候經常出個寫個線程安全的C++單例模式,析構能否多態或者什麼寫個調用順序,讓面試者騷手撓腮,欲罷不能,想想自己也折磨過這些面試者,真是罪過啊。

 

這幾年視野廣了,不接觸C++了,回過頭來看還是覺得當年有些走火入魔,沒必要自己折磨自己。

 

Java:估計是目前用的最廣的項目語言,容易上手,概念簡單,無數的庫,大量的代碼。我就不多介紹了,我自己也是大半的項目用Java寫的。缺點時配置比較煩,很多什麼XML,Config,適合寫服務端。

 

LUA:大量應用在大型遊戲的腳本語言,主要是高性能,語言規範精簡、運行時庫小,與C/C++交互方便,我在百度做雲計算平臺時候也是用它作爲嵌入式腳本。

 

Python:跟Perl, PHP,合成3P語言,都是腳本:) 非常方便實用,初學編程就可以拿它練習,有很多方便的庫,比如urlib, beautifulsoap。有句話說:人生苦短 我用Python。做數據分析的有個超好的工具叫iPython,它是結合在線notebook,可以交互式編程,非常爽。據說Python的創始人在Dropbox,當年他簡歷就一句話,說I wrote Python. 在面試Google時候還被一些人誤會,想會python算個啥,但人家是作者。有一本書《集體智慧編程》用Python作爲實踐做機器學習,推薦給大家。

 

GO:Google開源的語言,比C++容易上手,卻有相似的性能,很多從Google出來的人喜歡,據說Square, Pinterest就在用。Go語言有哪些好處,誰用誰知道,爲什麼要使用 Go 語言,Go 語言的優勢在哪裏?

 

Scala:各種集大成,面向對象,函數式編程,面向過程。我目前也在學習,東西實在太多,Coursera上面有Scala作者的一門課(https://www.coursera.org/course/progfun)公司技術部也主推這種語言,這也是爲啥我們牆上員工證書中最多就是Scala這門課的。另外著名的Spark,Kafka也是Scala寫的,確實在高性能,高併發上面表現不錯,又保持了優雅精煉的寫法。值得玩味。

 

Javascript:本來這是個前端客戶端的動態語言,做一些頁面特效,主要特點是天然支持異步,又跨平臺,弱類型,比較安全 (有sandbox),有人把它拓展到後臺,隨着V8,Node.js, Angular出現也顯得越來越厲害了。


還有一些語言,Ruby,R,Object-C, Swift,Matlab, Perl, SQL, D, Lisp就是偶爾用了,有個TIOBE編程語言排名。

 

J2EE 三劍客:


Java出來之後,爲了提高大規模網站的開發效率,提出了很多框架,最經典就是分層J2EE, 在企業級,如銀行系統大量使用,什麼servlet,java bean,EJB,RMI,JMS, JSP,JNDI,JDBC,容器,管道,數據庫連接池,當時最火的就是什麼Java架構師,年薪百萬啊有木有。那當然一般人玩不會了,後來出現了輕量級的MVC解耦合分層結構,在本科時候經常做管理系統,就使用這種輕量級J2EE框架,搭系統。裏面重要3個組件:

 

  • Hibernate:數據持久框架,ORM,對數據庫的CRUD操作進行對象化映射。

  •  Spring MVC:中的控制層,但容易造成Config的泛濫,後來Linkedin中起了個項目就叫Kill Spring,改成下面提到的Rest.Li。

  •  Struts:View層,有很多tag庫可以選擇,有個JSTL 標籤可以搭配選擇。

 

Web 服務器


 Lighttpd:當時在百度我就是把它作爲雲平臺(Baidu App Engine)的服務器。爲了徹底搞懂它,我真的看了它所有的源代碼,代碼很精煉,大概5w行,又研讀了所有它的maillist,jira上面的進度,還給開源社區打了補丁。感覺就像武林高手修煉一樣。

 

Nginx:高性能web服務器,異步,C10K (意思是單機同時維持一萬的連接)傑出代表。俄國人寫的,代碼可讀性不如上面的,但確實功能更強大些。

 

Tomcat/Jetty:Java J2EE容器,經常用的,我記得當時最喜歡看到配置成功後,頁面顯示的小貓圖案。在Linkedin,這兩個都用。一個用來做前端服務器,一個用來做後端。 


框架


Rest.li:RESTful是Roy Fielding博士在2000年他的博士論文中提出來的一種軟件架構風格。使用HTTP協議中的請求方法來對應後端操作數據時候的增刪添改(CRUD)。LinkedIn提出Rest.Li編程框架,是一款REST+JSON框架,使用動態發現和簡單的異步API即可構建健壯可伸縮的服務架構體系。

 

Thrift:Apache Thrift 是Facebook 實現的一種高效的、支持多種編程語言的遠程服務調用的框架。

 

ProtoBuf:Google提出的跟上面很像,用來序列化結構化數據的技術,支持多種語言持久化數據或者序列化成網絡傳輸。

 

CloudStack:cloud computing框架。

 

Helix:通用的集羣管理框架,Linkedin出品。 


前端技術


其實前端我接觸的並不多,但現在不是提倡Full Stack全棧工程師嘛。如果你掌握下面的會讓你如魚得水,不需要被UI,UE人員優先級而影響。

 

Ruby on Rails:在web2.0時代,RoR一下子獲得很多創業公司的青睞,開發者將Rails作爲一個框架來創建數據庫支持的Web應用,它本身是一個完整的解決方案,通過默認的標準實踐(convention)可以很大的加快開發效率,無縫的整合所有子組件以提供給開發者一個統一的接口。當時Twitter早期也是用這個框架寫的,但這個也是雙刃劍,在性能和內部機制上很難調節。

 

Django:Python的前端管理框架,直接生成管理頁面。有人經常那上面的作爲PK,相比於 Django、Pylon 等 Python 框架,Ruby on Rails 是否有很大的技術優勢?

 

Smarty:PHP的一種模板語言,很容易上手。

 

BootstrapTwitter提出的HTML,CSS和JS框架,讓你的web app容易適配到各種平臺,比如手機上。

 

JQueryJavascript的最流行的庫,可以做一些Ajax調用。

 

HTML5就是下一代的HTML標準,增加了一些兼容的便籤,使得在手機和瀏覽器中閱讀效果一致。對應的是Native APP,就是原生的從底層開始寫的APP。當年Facebook是走HTML5的路,發現不對勁,性能很差,體驗糟糕。趕緊轉變成Native APP才讓它重新贏得市場。

 

Node.jsjs寫的後端服務器,處理高併發場景性能佳,使用 Node.js 的優勢和劣勢都有哪些? 特別適合移動的服務器端。 Socket.IO是其中一個組件,爲了在瀏覽器和移動設備上創建實時應用而產生的,它可以模糊不同傳輸機制之間的差異。

 

D3各種可視化的效果,確實非常酷。


Impress.js基於CSS3轉換和過渡、工作於現代瀏覽器、並受prezi.com的理念啓發的演示工具。

 

Backbone.js前端的MVC,爲複雜Javascript應用程序提供模型(models)、集合(collections)、視圖(views)的結構。 


搜索


Nutch是一個開源Java 實現的搜索引擎,當時Hadoop的前身就是爲了做這個項目。


Lucene基於Java的全文檢索引擎,很有名也非常強大,elasticsearch就是基於這個開源基礎二次開發。


Solr基於Lucene的XML接口的獨立運行的搜索服務器。通過HTTP協議以XML格式將文檔放入搜索服務器(索引),GET來查詢搜索服務器得到結果。

 

SphinxSphinx是一個基於SQL的全文檢索引擎,可以結合MySQL,PostgreSQL做全文搜索,它可以提供比數據庫本身更專業的搜索功能。反正比MySQL內置的全文檢索要快很多。 


Hadoop生態系統


這一塊關注過很久了,目前很多很成熟的組件。這是一張生態圖,我大多數都在本文中介紹過了,主要的組件都是爲了方便大家從底層的MapReduce模型中脫離出來,用高層語言來做分佈式計算。



 

HBase是一個高可靠性、高性能、面向列、可伸縮的分佈式存儲系統,利用HBase技術可在廉價PC Server上搭建起大規模結構化數據集羣。像Facebook,都拿它做大型實時應用。(可參考文章Facebook's New Realtime Analytics System: HBase to Process 20 Billion Events Per Day)

 

PigYahoo開發的,並行地執行數據流處理的引擎,它包含了一種腳本語言,稱爲Pig Latin,用來描述這些數據流。Pig Latin本身提供了許多傳統的數據操作,同時允許用戶自己開發一些自定義函數用來讀取、處理和寫數據。在LinkedIn也是大量使用。

 

HiveFacebook領導的一個數據倉庫工具,可以將結構化的數據文件映射爲一張數據庫表,並提供完整的sql查詢功能,可以將sql語句轉換爲MapReduce任務進行運行。其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計。像一些data scientist 就可以直接查詢,不需要學習其他編程接口。

 

Cascading/ScaldingCascading是Twitter收購的一個公司技術,主要是提供數據管道的一些抽象接口,然後又推出了基於Cascading的Scala版本就叫Scalding。Coursera是用Scalding作爲MapReduce的編程接口放在Amazon的EMR運行。

 

Zookeeper一個分佈式的,開放源碼的分佈式應用程序協調服務,是Google的Chubby一個開源的實現。

 

Oozie一個基於工作流引擎的開源框架。由Cloudera公司貢獻給Apache的,它能夠提供對Hadoop MapReduce和Pig Jobs的任務調度與協調。

 

Azkaban跟上面很像,Linkedin開源的面向Hadoop的開源工作流系統,提供了類似於cron 的管理任務。

 

TezHortonworks主推的優化MapReduce執行引擎,與MapReduce相比較,Tez在性能方面更加出色。


數據存儲(NoSQL)


 當時爲了解決Scale的問題,伴隨分佈式系統發展,形成各個NoSQL軟件,百花齊放。下面介紹常見的一些:


Memcached是高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。性能瓶頸第一個就要想到用這個。有點萬金油的感覺。

 

Redis一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多。

 

Cassandra名稱來源於希臘神話,是特洛伊的一位悲劇性的女先知的名字。最初由Facebook開發,用於儲存收件箱等簡單格式數據,集Google BigTable的數據模型與Amazon Dynamo的完全分佈式架構於一身,可擴展型和性能都不錯,Coursera也是大量使用作爲數據對象存儲。

 

Berkeley DB文件數據庫,介於關係數據庫與內存數據庫之間,使用方式與內存數據庫類似,它提供的是一系列直接訪問數據庫的函數。之後被Oracle收購了。

 

CouchBase文檔型數據庫,由CouchOne與Membase合併,之後的公司叫做Couchbase,功能還是挺強大的,自動備份,自動分片,在Linkedin廣告組和運維部門都大力推薦。

 

RocksDB比LevelDB更彪悍的引擎,代碼層面上是在LevelDB原有的代碼上進行開發的,但卻借鑑了Apache HBase的一些好的idea。

 

LevelDBGoogle開發的,一個速度非常塊的KV存儲庫(storage library),它支持字符串的key與value,並且這種映射關係按key排序(ordered mapping)

 

MongoDB一個基於分佈式文件存儲的數據庫。爲WEB應用提供可擴展的高性能數據存儲解決方案。 介於關係數據庫和非關係數據庫之間,是非關係數據庫當中功能最豐富,最像關係數據庫的。他支持的數據結構非常鬆散,是類似json的bson格式,因此可以存儲比較複雜的數據類型。

 

有一些基於各種NoSQL 特性和性能的比較,可參考文章:

Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase vs Couchbase vs Hypertable vs ElasticSearch vs Accumulo vs VoltDB vs Scalaris comparison;

Benchmarking LevelDB vs. RocksDB vs. HyperLevelDB vs. LMDB Performance for InfluxDB。

 

下面幾個都是Linkedin開源的數據技術 Projects | LinkedIn Data Team

 

VoldemortNoSQL 鍵/值存儲引擎,完全是分佈式且去中心化的,支持分區與容錯。

 

Espresso文檔型NoSQL數據存儲系統,MySQL作爲底層數據存儲,具有高性能、高擴展性、支持事務、容錯能力等重要特徵。

 

Databus實時低延遲數據抓取系統

 

AMP Lab三劍客


AMP Lab 是Berkeley的一個王牌實驗室,彙集系統,數據庫,機器學習,各個領域的教授和豐富工業經驗的學生,它們做出了很多有意思得到工業界認可的技術。




Mesos一個分佈式環境的資源管理平臺,它使得Hadoop、MPI、Spark作業在統一資源管理環境下執行。它對Hadoop2.0支持很好。Twitter,Coursera都在使用。


Spark已經成爲Apache的頂級項目了,2014年的當紅炸子雞,我在這個帖子裏面也介紹的比較全面了。Spark,它們也成立公司Databricks對cloud管理進行產品化。


Tachyon是一個高容錯的分佈式文件系統,允許文件以內存的速度在集羣框架中進行可靠的共享,就像Spark和MapReduce那樣。有幸跟項目發起人李浩源聊過幾次,這個項目目前發展非常快,甚至比Spark當時還要驚人。目前到0.6版本,參與開源的規模和版本迭代速度都很快。

 

先進大數據技術:流式,實時


由於Hadoop的火紅,整個業界都在喋喋不休地談論大數據。Hadoop的高吞吐,海量數據處理的能力使得人們可以方便地處理海量數據。但是,Hadoop的缺點也和它的優點同樣鮮明——延遲大,響應緩慢,運維複雜。

 

Storm所謂流處理框架,就是一種分佈式、高容錯的實時計算系統。Storm令持續不斷的流計算變得容易。經常用於在實時分析、在線機器學習、持續計算、分佈式遠程調用和ETL等領域。Twitter是他們的主推。

 

Kafka是Linkedin開源的一種分佈式發佈-訂閱消息系統,它主要用於處理活躍的流式數據。我面試過很多硅谷創業公司都在使用,比如最重要的用戶Tracking數據。LinkedIn的開發者也出來成立公司Confluent,最新發布platform

 

Samza一個分佈式流處理框架,專用於實時數據的處理,非常像Twitter的流處理系統Storm,LinkedIn開源了這項技術。跟上面的幾個技術就可以比較一下了,streaming big data storm, spark and samza

 

SummingBird將批處理和流處理無縫連接,通過整合批處理與流處理來減少它們之間的轉換開銷。把上面的Storm跟Scalding結合起來,所謂Lambda Architecture。跟這個相關組件是Algebird: 利用一些概率算法HyperLogLog來提高計算速度。

 

Drill先說Dremel,是Google 的“交互式”數據分析系統。可以組建成規模上千的集羣,處理PB級別的數據。MapReduce處理一個數據,需要分鐘級的時間。Dremel將處理時間縮短到秒級。Apache推出Dremel的開源實現Drill。

 

Druid在大數據集之上做實時統計分析而設計的開源數據存儲。這個系統集合了一個面向列存儲的層,一個分佈式、shared-nothing的架構,和一個高級的索引結構,來達成在秒級以內對十億行級別的表進行任意的探索分析。

 

ImpalaCloudera公司主導開發的新型查詢系統,它提供SQL語義,能夠查詢存儲在Hadoop的HDFS和HBase中的PB級大數據,號稱比Hive快5-10倍,但最近被Spark的風頭給罩住了,大家還是更傾向於後者。

 

Spark Streaming建立在Spark上的應用框架,利用Spark的底層框架作爲其執行基礎,並在其上構建了DStream的行爲抽象。利用DStream所提供的api,用戶可以在數據流上實時進行count,join,aggregate等操作。

 

Spark SQL之前Spark類似Hive的工具稱爲Shark,現在新替代就是Spark SQL, Big Data Benchmark裏面也跟Impala性能比較。 


工具類:


Make很多同學在學校時候,認爲編程就是在編輯器裏面運行,當離開了IDE,他們就不知道該怎麼辦。C語言的打包工具,比如解析依賴,生成二進制和可執行程序。

 

AntJava的傳統打包工具,需要寫個build.xml

 

Gradle新一代的編譯構建工具,結合ivy自動匹配和下載官方穩定版本。

 

Maven同上,有個比較Java構建工具:Ant vs Maven vs Gradle

 

Homebrew最近幾年都用Mac平臺,那麼包的管理可以用這個。

 

Eclipse使用最廣泛的IDE,著名的日蝕標識。它的出現就是吃掉SUN(Java誕生地),我大多時間用這個,後來也用過Intellij 不過是商業版本的。跟Eclipse相比,管理大型代碼庫時候速度快。

 

Docker作爲一種新興的虛擬化方式,Docker容器的啓動可以在秒級實現,這相比傳統的虛擬機方式要快得多,運行時所需的資源比虛擬機少,而效率又比虛擬機高提供隔離的執行環境。算是2014年上升最快的一個工具了。

 

JUnitjava的單元測試,屬於測試驅動的利器。

 

Git強大的分佈式代碼版本管理,Linux那麼多分支都沒亂正是它的功勞。但還是挺複雜,一大堆命令比SVN要多多了。目前GitHub 就是最大的源碼管理平臺,我們公司也用它的企業版。有個結合Git和代碼審查的工具由Facebook開發,Phabricator


SVN簡化的代碼管理,還有perforce Amazon和Google也用。最老的是CVS估計現在沒人用了呃。 


瀏覽器:

 

Firefox開源瀏覽器,當時靠豐富插件很強大,就靠Google的默認搜索來維持,但Google也開發了Chrome,給Firefox市場份額極大打擊。所謂成也Google,敗也Google。這個組織是Mozilla,就跟Coursera是鄰居。我當時用過很多插件,比如proxy,去除廣告,Firebug來調試,還有什麼換皮膚,監控網絡流量等。

 

Webkit自從蘋果開源了這麼好的內核引擎,Google就就直接用它開發了Chrome。當時做信息抽取,有一種辦法是基於視覺的信息提取,VIPS算法,如果通過webkit,就可以拿到正文的一些具體座標和字體顏色大小,然後再分塊確定重點內容做提取。

 

Spidermonkey就是Mozilla旗下的一個JS解析引擎,我用這個是因爲當時爲了抓取網頁,一些很變態的網站比如水木社區:( 把內容寫在javascript裏面,都是用字符串拼接起來,我爲了獲取完整的源碼就要涉及到JS的解析。

 

V8Google 的一個開源項目,是一個高效的JavaScript 引擎,像Node.js基於Google V8提供了基於事件的I/O處理。

 

參考資料:

這7個開源技術支撐起整個互聯網時代

The Architecture of Open Source Applications

The Top 11 Hottest GitHub Projects Right Now


作者介紹  董飛

  • 【DBA+社羣】原創專家

  • 現任職Linkedin資深工程師,先後就職於創業公司酷迅、百度基礎架構組、Amazon雲計算部門

  • 在大數據領域深入研究多年,涉及Hadoop調優、分佈式框架、Data Pipeline、實時系統等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章