天天看點

那些年,追過的開源軟體和技術

那些年,追過的開源軟體和技術

前言

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

 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:各種集大成,面向對象,函數式程式設計,面向過程。我目前也在學習,東西實在太多。另外著名的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的一種模闆語言,很容易上手。

bootstrap:twitter提出的html,css和js架構,讓你的web app容易适配到各種平台,比如手機上。

jquery:javascript的最流行的庫,可以做一些ajax調用。

html5:就是下一代的html标準,增加了一些相容的便簽,使得在手機和浏覽器中閱讀效果一緻。對應的是native app,就是原生的從底層開始寫的app。當年facebook是走html5的路,發現不對勁,性能很差,體驗糟糕。趕緊轉變成native app才讓它重新赢得市場。

node.js:js寫的後端伺服器,處理高并發場景性能佳,使用 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來查詢搜尋伺服器得到結果。

sphinx:sphinx是一個基于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)

pig:yahoo開發的,并行地執行資料流處理的引擎,它包含了一種腳本語言,稱為pig latin,用來描述這些資料流。pig latin本身提供了許多傳統的資料操作,同時允許使用者自己開發一些自定義函數用來讀取、處理和寫資料。在linkedin也是大量使用。

hive:facebook上司的一個資料倉庫工具,可以将結構化的資料檔案映射為一張資料庫表,并提供完整的sql查詢功能,可以将sql語句轉換為mapreduce任務進行運作。其優點是學習成本低,可以通過類sql語句快速實作簡單的mapreduce統計。像一些data scientist 就可以直接查詢,不需要學習其他程式設計接口。

cascading/scalding:cascading是twitter收購的一個公司技術,主要是提供資料管道的一些抽象接口,然後又推出了基于cascading的scala版本就叫scalding。coursera是用scalding作為mapreduce的程式設計接口放在amazon的emr運作。

zookeeper:一個分布式的,開放源碼的分布式應用程式協調服務,是google的chubby一個開源的實作。

oozie:一個基于工作流引擎的開源架構。由cloudera公司貢獻給apache的,它能夠提供對hadoop mapreduce和pig jobs的任務排程與協調。

azkaban:跟上面很像,linkedin開源的面向hadoop的開源工作流系統,提供了類似于cron 的管理任務。

tez:hortonworks主推的優化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。

leveldb:google開發的,一個速度非常塊的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

voldemort:nosql 鍵/值存儲引擎,完全是分布式且去中心化的,支援分區與容錯。

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的架構,和一個進階的索引結構,來達成在秒級以内對十億行級别的表進行任意的探索分析。

impala:cloudera公司主導開發的新型查詢系統,它提供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語言的打包工具,比如解析依賴,生成二進制和可執行程式。

ant:java的傳統打包工具,需要寫個build.xml

gradle:新一代的編譯建構工具,結合ivy自動比對和下載下傳官方穩定版本。

maven:同上,有個比較java建構工具:ant vs maven vs gradle

homebrew:最近幾年都用mac平台,那麼包的管理可以用這個。

eclipse:使用最廣泛的ide,著名的日蝕辨別。它的出現就是吃掉sun(java誕生地),我大多時間用這個,後來也用過intellij 不過是商業版本的。跟eclipse相比,管理大型代碼庫時候速度快。

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

junit:java的單元測試,屬于測試驅動的利器。

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的解析。

v8:google 的一個開源項目,是一個高效的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、實時系統等

<b></b>

<b>本文來自雲栖社群合作夥伴"dbaplus",原文釋出時間:2016-04-07</b>