開源大數據處理系統/工具大全
本文一共分為上下兩部分。我們將針對大數據開源工具不同的用處來進行分類,并且附上了官網和部分下載鏈接,希望能給做大數據的朋友做個參考。下面是第一部分。
查詢引擎
一、Phoenix
貢獻者::Salesforce
簡介:這是一個Java中間層,可以讓開發者在Apache HBase上執行SQL查詢。Phoenix完全使用Java編寫,代碼位于GitHub上,并且提供了一個客戶端可嵌入的JDBC驅動。
Phoenix查詢引擎會將SQL查詢轉換為一個或多個HBase scan,并編排執行以生成標準的JDBC結果集。直接使用HBase API、協同處理器與自定義過濾器,對于簡單查詢來說,其性能量級是毫秒,對于百萬級別的行數來說,其性能量級是秒。
Phoenix最值得關注的一些特性有:
?嵌入式的JDBC驅動,實現了大部分的java.sql接口,包括元數據API
?可以通過多部行鍵或是鍵/值單元對列進行建模
?完善的查詢支持,可以使用多個謂詞以及優化的掃描鍵
?DDL支持:通過CREATE TABLE、DROP TABLE及ALTER TABLE來添加/刪除列
?版本化的模式倉庫:當寫入數據時,快照查詢會使用恰當的模式
?DML支持:用于逐行插入的UPSERT VALUES、用于相同或不同表之間大量數據傳輸的UPSERT ?SELECT、用于刪除行的DELETE
?通過客戶端的批處理實現的有限的事務支持
?單表——還沒有連接,同時二級索引也在開發當中
?緊跟ANSI SQL標準
二、Stinger
貢獻者::Hortonworks
簡介:原叫Tez,下一代Hive,Hortonworks主導開發,運行在YARN上的DAG計算框架。
某些測試下,Stinger能提升10倍左右的性能,同時會讓Hive支持更多的SQL,其主要優點包括:
?讓用戶在Hadoop獲得更多的查詢匹配。其中包括類似OVER的字句分析功能,支持WHERE查詢,讓Hive的樣式系統更符合SQL模型。
?優化了Hive請求執行計劃,優化后請求時間減少90%。改動了Hive執行引擎,增加單Hive任務的被秒處理記錄數。
?在Hive社區中引入了新的列式文件格式(如ORC文件),提供一種更現代、高效和高性能的方式來儲存Hive數據。
?引入了新的運行時框架——Tez,旨在消除Hive的延時和吞吐量限制。Tez通過消除不必要的task、障礙同步和對HDFS的讀寫作業來優化Hive job。這將優化Hadoop內部的執行鏈,徹底加速Hive負載處理。
三、Presto
貢獻者::非死book
簡介:非死book開源的數據查詢引擎Presto ,可對250PB以上的數據進行快速地交互式分析。該項目始于 2012 年秋季開始開發,目前該項目已經在超過 1000 名 非死book 雇員中使用,運行超過 30000 個查詢,每日數據在 1PB 級別。非死book 稱 Presto 的性能比諸如 Hive 和 Map*Reduce 要好上 10 倍有多。
Presto 當前支持 ANSI SQL 的大多數特效,包括聯合查詢、左右聯接、子查詢以及一些聚合和計算函數;支持近似截然不同的計數(DISTINCT COUNT)等。
四、Shark
簡介:Shark即Hive on Spark,本質上是通過Hive的HQL解析,把HQL翻譯成Spark上的RDD操作,然后通過Hive的metadata獲取數據庫里的表信息,實 際HDFS上的數據和文件,會由Shark獲取并放到Spark上運算。Shark的特點就是快,完全兼容Hive,且可以在shell模式下使用 rdd2sql()這樣的API,把HQL得到的結果集,繼續在scala環境下運算,支持自己編寫簡單的機器學習或簡單分析處理函數,對HQL結果進一 步分析計算。
?Shark速度快的原因除了Spark平臺提供的基于內存迭代計算外,在設計上還存在對Spark上進行了一定的改造,主要有
?partial DAG execution:對join優化,調節并行粒度,因為Spark本身的寬依賴和窄依賴會影響并行計算和速度
基于列的壓縮和存儲:把HQL表數據按列存,每列是一個array,存在JVM上,避免了JVM GC低效,而壓縮和解壓相關的技術是Yahoo!提供的。
結來說,Shark是一個插件式的東西,在我現有的Spark和Hive及hadoop-client之間,在這兩套都可用的情況下,Shark只 要獲取Hive的配置(還有metastore和exec等關鍵包),Spark的路徑,Shark就能利用Hive和Spark,把HQL解析成RDD 的轉換,把數據取到Spark上運算和分析。在SQL on Hadoop這塊,Shark有別于Impala,Stringer,而這些系統各有自己的設計思路,相對于對MR進行優化和改進的思路,Shark的思 路更加簡單明了些。
五、Pig
簡介:Pig是一種編程語言,它簡化了Hadoop常見的工作任務。Pig可加載數據、表達轉換數據以及存儲最終結果。Pig內置的操作使得半結構化數據變得有意義(如日志文件)。同時Pig可擴展使用Java中添加的自定義數據類型并支持數據轉換。
Pig最大的作用就是對mapreduce算法(框架)實現了一套shell腳本 ,類似我們通常熟悉的SQL語句,在Pig中稱之為Pig Latin,在這套腳本中我們可以對加載出來的數據進行排序、過濾、求和、分組(group by)、關聯(Joining),Pig也可以由用戶自定義一些函數對數據集進行操作,也就是傳說中的UDF(user-defined functions)。
六、Cloudera Impala
貢獻者::Cloudera
簡介:Cloudera Impala 可以直接為存儲在HDFS或HBase中的Hadoop數據提供快速,交互式的SQL查詢。除了使用相同的存儲平臺外, Impala和Apache Hive一樣也使用了相同的元數據,SQL語法(Hive SQL),ODBC驅動和用戶接口(Hue Beeswax),這就很方便的為用戶提供了一個相似并且統一的平臺來進行批量或實時查詢。
Cloudera Impala 是用來進行大數據查詢的補充工具。 Impala 并沒有取代像Hive這樣基于MapReduce的分布式處理框架。Hive和其它基于MapReduce的計算框架非常適合長時間運行的批處理作業,例 如那些涉及到批量 Extract、Transform、Load ,即需要進行ETL作業。
Impala 提供了:
?數據科學家或數據分析師已經熟知的SQL接口
?能夠在Apache Hadoop 的大數據中進行交互式數據查詢
? Single system for big data processing and analytics so customers can avoid costly modeling and ETL just for analytics
七、Apache Drill
貢獻者::MapR
簡介:Apache Drill是是一個能夠對大數據進行交互分析、開源的分布式系統,且基于Google Dremel實現,它能夠運行在上千個節點的服務器集群上,且能在幾秒內處理PB級或者萬億條的數據記錄。Drill能夠幫助企業用戶快速、高效地進行 Hadoop數據查詢和企業級大數據分析。Drill于2012年8月份由Apache推出。
從Drill官方對其架構的介紹中得知,其具有適于實時的分析和快速的應用開發、適于半結構化/嵌套數據的分析、兼容現有的SQL環境和 Apache Hive等特征。另外,Drill的核心模塊是Drillbit服務,該服務模塊包括遠程訪問子模塊、SQL解析器、查詢優化器、任務計劃執行引擎、存儲 插件接口(DFS、HBase、Hive等的接口)、分布式緩存模塊等幾部分,如下圖所示:
八、Apache Tajo
簡介:Apache Tajo項目的目的是在HDFS之上構建一個先進的數據倉庫系統。Tajo將自己標榜為一個“大數據倉庫”,但是它好像和之前介紹的那些低延遲查詢引擎類 似。雖然它支持外部表和Hive數據集(通過HCatalog),但是它的重點是數據管理,提供低延遲的數據訪問,以及為更傳統的ETL提供工具。它也需 要在數據節點上部署Tajo特定的工作進程。
Tajo的功能包括:
?ANSI SQL兼容
?JDBC 驅動
?集成Hive metastore能夠訪問Hive數據集
?一個命令行客戶端
?一個自定義函數API
九、Hive
簡介:hive是基于Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,并提供簡單 的sql查詢功能,可以將sql語句轉換為MapReduce任務進行運行。 其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析。
流式計算
一、非死book Puma
貢獻者:非死book
簡介:實時數據流分析
二、推ter Rainbird
貢獻者:推ter
簡介:Rainbird一款基于Zookeeper, Cassandra, Scribe, Thrift的分布式實時統計系統,這些基礎組件的基本功能如下:
? Zookeeper,Hadoop子項目中的一款分布式協調系統,用于控制分布式系統中各個組件中的一致性。
?Cassandra,NoSQL中一款非常出色的產品,集合了Dynamo和Bigtable特性的分布式存儲系統,用于存儲需要進行統計的數據,統計數據,并且提供客戶端進行統計數據的查詢。(需要使用分布式Counter補丁CASSANDRA-1072)
? Scribe,非死book開源的一款分布式日志收集系統,用于在系統中將各個需要統計的數據源收集到Cassandra中。
? Thrift,非死book開源的一款跨語言C/S網絡通信框架,開發人員基于這個框架可以輕易地開發C/S應用。
用處
Rainbird可以用于實時數據的統計:
?統計網站中每一個頁面,域名的點擊次數
?內部系統的運行監控(統計被監控服務器的運行狀態)
?記錄最大值和最小值
三、Yahoo S4
貢獻者:Yahoo
簡介:S4(Simple Scalable Streaming System)最初是Yahoo!為提高搜索廣告有效點擊率的問題而開發的一個平臺,通過統計分析用戶對廣告的點擊率,排除相關度低的廣告,提升點擊率。 目前該項目剛啟動不久,所以也可以理解為是他們提出的一個分布式流計算(Distributed Stream Computing)的模型。
S4的設計目標是:
·提供一種簡單的編程接口來處理數據流
·設計一個可以在普通硬件之上可擴展的高可用集群。
·通過在每個處理節點使用本地內存,避免磁盤I/O瓶頸達到最小化延遲
·使用一個去中心的,對等架構;所有節點提供相同的功能和職責。沒有擔負特殊責任的中心節點。這大大簡化了部署和維護。
·使用可插拔的架構,使設計盡可能的即通用又可定制化。
·友好的設計理念,易于編程,具有靈活的彈性
四、推ter Storm
貢獻者:推ter
簡介:Storm是推ter開源的一個類似于Hadoop的實時數據處理框架,它原來是由BackType開發,后BackType被推ter收購,將Storm作為推ter的實時數據分析系統。
實時數據處理的應用場景很廣泛,例如商品推薦,廣告投放,它能根據當前情景上下文(用戶偏好,地理位置,已發生的查詢和點擊等)來估計用戶點擊的可能性并實時做出調整。
storm的三大作用領域:
1.信息流處理(Stream Processing)
Storm可以用來實時處理新數據和更新數據庫,兼具容錯性和可擴展性,它 可以用來處理源源不斷的消息,并將處理之后的結果保存到持久化介質中。
2.連續計算(Continuous Computation)
Storm可以進行連續查詢并把結果即時反饋給客戶,比如將推ter上的熱門話題發送到客戶端。
3.分布式遠程過程調用(Distributed RPC)
除此之外,Storm也被廣泛用于以下方面:
- 精確的廣告推送
- 實時日志的處理
迭代計算
一、Apache Hama
簡介:Apache Hama是一個純BSP(Bulk Synchronous Parallel)計算框架,模仿了Google的Pregel。用來處理大規模的科學計算,特別是矩陣和圖計算。
?建立在Hadoop上的分布式并行計算模型。
?基于 Map/Reduce 和 Bulk Synchronous 的實現框架。
?運行環境需要關聯 Zookeeper、HBase、HDFS 組件。
Hama中有2個主要的模型:
– 矩陣計算(Matrix package)
– 面向圖計算(Graph package)
二、Apache Giraph
代碼托管地址: GitHub
簡介:Apache Giraph是一個可伸縮的分布式迭代圖處理系統,靈感來自BSP(bulk synchronous parallel)和Google的Pregel,與它們 區別于則是是開源、基于 Hadoop 的架構等。
Giraph處理平臺適用于運行大規模的邏輯計算,比如頁面排行、共享鏈接、基于個性化排行等。Giraph專注于社交圖計算,被非死book作為其Open Graph工具的核心,幾分鐘內處理數萬億次用戶及其行為之間的連接。
三、HaLoop
簡介:迭代的MapReduce,HaLoop——適用于迭代計算的Hadoop 。

Hadoop與HaLoop的不同
與Hadoop比較的四點改變:
1.提供了一套新的編程接口,更加適用于迭代計算;
HaLoop給迭代計算一個抽象的遞歸公式:
2.HaLoop的master進行job內的循環控制,直到迭代計算結束;
3.Task Scheduler也進行了修改,使得任務能夠盡量滿足data locality
4.slave nodes對數據進行cache并index索引,索引也以文件的形式保存在本地磁盤。
四、Twister
簡介:Twister, 迭代式MapReduce框架,Twister是由一個印度人開發的,其架構如下:
在Twister中,大文件不會自動被切割成一個一個block,因而用戶需提前把文件分成一個一個小文件,以供每個task處理。在map階段, 經過map()處理完的結果被放在分布式內存中,然后通過一個broker network(NaradaBroking系統)將數據push給各個reduce task(Twister假設內存足夠大,中間數據可以全部放在內存中);在reduce階段,所有reduce task產生的結果通過一個combine操作進行歸并,此時,用戶可以進行條件判定, 確定迭代是否結束。combine后的數據直接被送給map task,開始新一輪的迭代。為了提高容錯性,Twister每隔一段時間會將map task和reduce task產生的結果寫到磁盤上,這樣,一旦某個task失敗,它可以從最近的備份中獲取輸入,重新計算。
為了避免每次迭代重新創建task,Twister維護了一個task pool,每次需要task時直接從pool中取。在Twister中,所有消息和數據都是通過broker network傳遞的,該broker network是一個獨立的模塊,目前支持NaradaBroking和ActiveMQ。
離線計算
一、Hadoop MapReduce
簡介:MapReduce是一種編程模型,用于大規模數據集(大于1TB)的并行運算。概念”Map(映射)” 和”Reduce(歸約)”,和它們的主要思想,都是從函數式編程語言里借來的,還有從矢量編程語言里借來的特性。它極大地方便了編程人員在不會分布式并 行編程的情況下,將自己的程序運行在分布式系統上。 當前的軟件實現是指定一個Map(映射)函數,用來把一組鍵值對映射成一組新的鍵值對,指定并發的Reduce(歸約)函數,用來保證所有映射的鍵值對中 的每一個共享相同的鍵組。
二、Berkeley Spark
簡介:Spark是UC Berkeley AMP lab所開源的類Hadoop MapReduce的通用的并行,Spark,擁有Hadoop MapReduce所具有的優點;但不同于MapReduce的是Job中間輸出結果可以保存在內存中,從而不再需要讀寫HDFS,因此Spark能更好 地適用于數據挖掘與機器學習等需要迭代的map reduce的算法。
三、DataTorrent
簡介:DataTorrent基于Hadoop 2.x構建,是一個實時的、有容錯能力的數據流式處理和分析平臺,它使用本地Hadoop應用程序,而這些應用程序可以與執行其它任務,如批處理,的應用程序共存。該平臺的架構如下圖所示:
相關文章:DataTorrent 1.0每秒處理超過10億個實時事件
DataTorrent 將數據分析速度從“實時”提升至“現在時”
鍵值存儲
一、LevelDB
貢獻者:Google
簡介:Leveldb是一個google實現的非常高效的kv數據庫,目前的版本1.2能夠支持billion級別的數據量了。 在這個數量級別下還有著非常高的性能,主要歸功于它的良好的設計。特別是LMS算法。
LevelDB 是單進程的服務,性能非常之高,在一臺4核Q6600的CPU機器上,每秒鐘寫數據超過40w,而隨機讀的性能每秒鐘超過10w。
此處隨機讀是完全命中內存的速度,如果是不命中 速度大大下降。
二、RocksDB
貢獻者:非死book
簡介:RocksDB雖然在代碼層面上是在LevelDB原有的代碼上進行開發的,但卻借鑒了Apache HBase的一些好的idea。在云計算橫行的年代,開口不離Hadoop,RocksDB也開始支持HDFS,允許從HDFS讀取數據。RocksDB 支持一次獲取多個K-V,還支持Key范圍查找。LevelDB只能獲取單個Key。
RocksDB除了簡單的Put、Delete操作,還提供了一個Merge操作,說是為了對多個Put操作進行合并。
RocksDB提供一些方便的工具,這些工具包含解析sst文件中的K-V記錄、解析MANIFEST文件的內容等。RocksDB支持多線程合并,而LevelDB是單線程合并的。
三、HyperDex
貢獻者:非死book
HyperDex是一個分布式、可搜索的鍵值存儲系統,特性如下:
- 分布式KV存儲,系統性能能夠隨節點數目線性擴展
- 吞吐和延時都能秒殺現在風頭正勁的MonogDB,吞吐甚至強于Redis
- 使用了hyperspace hashing技術,使得對存儲的K-V的任意屬性進行查詢成為可能
四、TokyoCabinet

- 支持自動復制數據到多個服務器上。
- 支持數據自動分割所以每個服務器只包含總數據的一個子集。
- 提供服務器故障透明處理功能。
- 支持可撥插的序化支持,以實現復雜的鍵-值存儲,它能夠很好的5.集成常用的序化框架如:Protocol Buffers、Thrift、Avro和Java Serialization。
- 數據項都被標識版本能夠在發生故障時盡量保持數據的完整性而不會影響系統的可用性。
- 每個節點相互獨立,互不影響。
- 支持可插拔的數據放置策略
官網:http://project-voldemort.com/


九、Redis
Redis是一個高性能的key-value存儲系統,和Memcached類似,它支持存儲的value類型相對更多,包括string(字符 串)、list(鏈表)、set(集合)和zset(有序集合)。與memcached一樣,為了保證效率,數據都是緩存在內存中,區別的是Redis會 周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了主從同步。
Redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部分場合可以對關系數據庫起到很好的補充作用。它提供了Python、Ruby、Erlang、PHP客戶端,使用很方便。
表格存儲
一、OceanBase
貢獻者:阿里巴巴
相關文章:26頁PPT解密支撐支付寶交易的分布式數據庫系統——OceanBase
簡介:OceanBase是一個支持海量數據的高性能分布式數據庫系統,實現了數千億條記錄、數百TB數據上的 跨行跨表事務,由淘寶核心系統研發部、運維、DBA、廣告、應用研發等部門共同完成。在設計和實現OceanBase的時候暫時摒棄了不緊急的DBMS的 功能,例如臨時表,視圖(view),研發團隊把有限的資源集中到關鍵點上,當前 OceanBase主要解決數據更新一致性、高性能的跨表讀事務、范圍查詢、join、數據全量及增量dump、批量數據導入。
目前OceanBase已經應用于淘寶收藏夾,用于存儲淘寶用戶收藏條目和具體的商品、店鋪信息,每天支持4~5千萬的更新操作。等待上線的應用還包括CTU、SNS等,每天更新超過20億,更新數據量超過2.5TB,并會逐步在淘寶內部推廣。
OceanBase 0.3.1在Github開源,開源版本為Revision:12336。
官網:http://alibaba.github.io/oceanbase/
二、Amazon SimpleDB
貢獻者:亞馬遜
Amazon SimpleDB是一個分散式數據庫,以Erlang撰寫。同與Amazon EC2和亞馬遜的S3一樣作為一項Web 服務,屬于亞馬遜網絡服務的一部分。
正如EC2和S3,SimpleDB的按照存儲量,在互聯網上的傳輸量和吞吐量收取費用。 在2008年12月1日,亞馬遜推出了新的定價策略,提供了免費1 GB的數據和25機器小時的自由層(Free Tire)。 將其中的數據轉移到其他亞馬遜網絡服務是免費的。
它是一個可大規模伸縮、用 Erlang 編寫的高可用數據存儲。
官網:http://aws.amazon.com/cn/simpledb/
三、Vertica
貢獻者:惠普
簡介:惠普2011年2月份起始3月21號完成收購Vertica。Vertica基于列存儲。基于列存儲的設 計相比傳統面向行存儲的數據庫具有巨大的優勢。同時Vertica支持MPP(massively parallel processing)等技術,查詢數據時Vertica只需取得需要的列,而不是被選擇行的所有數據,其平均性能可提高50x-1000x倍。(查詢性 能高速度快)
Vertica的設計者多次表示他們的產品圍繞著高性能和高可用性設計。由于對MPP技術的支持,可提供對粒度,可伸縮性和可用性的優勢。每個節點完全獨立運作,完全無共享架構,降低對共享資源的系統競爭。
Vertica的數據庫使用標準的SQL查詢,同時Vertica的架構非常適合云計算,包括虛擬化,分布式多節點運行等,并且可以和Hadoop/MapReduce進行集成。
Vertica官網:http://www.vertica.com/
四、Cassandra
貢獻者:非死book
相關文章:開源分布式NoSQL數據庫系統——Cassandra Cassandra與HBase的大數據對決 誰是勝者?
簡介:Cassandra是一套開源分布式NoSQL數據庫系統。它最初由非死book開發,用于儲存收件 箱等簡單格式數據,集GoogleBigTable的數據模型與Amazon Dynamo的完全分布式的架構于一身非死book于2008將 Cassandra 開源,此后,由于Cassandra良好的可擴放性,被Digg、推ter等知名Web 2.0網站所采納,成為了一種流行的分布式結構化數據存儲方案。
Cassandra是一個混合型的非關系的數據庫,類似于Google的BigTable。其主要功能比Dynamo (分布式的Key-Value存儲系統)更豐富,但支持度卻不如文檔存儲MongoDB(介于關系數據庫和非關系數據庫之間的開源產品,是非關系數據庫當 中功能最豐富,最像關系數據庫的。支持的數據結構非常松散,是類似json的bjson格式,因此可以存儲比較復雜的數據類型)。Cassandra最初 由非死book開發,后轉變成了開源項目。它是一個網絡社交云計算方面理想的數據庫。以Amazon專有的完全分布式的Dynamo為基礎,結合了 Google BigTable基于列族(Column Family)的數據模型。P2P去中心化的存儲。很多方面都可以稱之為Dynamo 2.0。
Cassandra官網:http://cassandra.apache.org/
五、HyperTable
簡介:Hypertable是一個開源、高性能、可伸縮的數據庫,它采用與Google的Bigtable相似的模型。在過去數年中,Google為在PC集群 上運行的可伸縮計算基礎設施設計建造了三個關鍵部分。
第一個關鍵的基礎設施是Google File System(GFS),這是一個高可用的文件系統,提供了一個全局的命名空間。它通過跨機器(和跨機架)的文件數據復制來達到高可用性,并因此免受傳統 文件存儲系統無法避免的許多失敗的影響,比如電源、內存和網絡端口等失敗。第二個基礎設施是名為Map-Reduce的計算框架,它與GFS緊密協作,幫 助處理收集到的海量數據。第三個基礎設施是Bigtable,它是傳統數據庫的替代。Bigtable讓你可以通過一些主鍵來組織海量數據,并實現高效的 查詢。Hypertable是Bigtable的一個開源實現,并且根據我們的想法進行了一些改進。
HyperTable官網:http://hypertable.org/
六、FoundationDB
簡介:支持ACID事務處理的NoSQL數據庫,提供非常好的性能、數據一致性和操作彈性。
2015年1月2日,FoundationDB已經發布了其key-value數據庫的3.0版本,主要專注于可伸縮性和性能上的改善。 FoundationDB的CEO David Rosenthal在一篇博客上宣布了新的版本,其中展示了FoundationDB 3.0在可伸縮性方面的數據,它可以在一個32位的c3.8xlarge EC2實例上每秒寫入1440萬次;這在性能上是之前版本的36倍。
除了性能和可伸縮性的改善之外,FoundationDB 3.0還包含了對監控支持的改善。這種監控機制不僅僅是簡單的機器檢查,它添加了對多種潛在的硬件瓶頸的診斷,并且把那些高層級的信息整合到現有監控基礎架構中。
七:HBase
貢獻者: Fay Chang 所撰寫的“Bigtable
簡介:HBase是一個分布式的、面向列的開源數據庫,該技術來源于 Fay Chang 所撰寫的Google論文“Bigtable:一個結構化數據的分布式存儲系統”。就像Bigtable利用了Google文件系統(File System)所提供的分布式數據存儲一樣,HBase在Hadoop之上提供了類似于Bigtable的能力。HBase是Apache的Hadoop 項目的子項目。HBase不同于一般的關系數據庫,它是一個適合于非結構化數據存儲的數據庫。另一個不同的是HBase基于列的而不是基于行的模式。
文件存儲
一、CouchDB
簡介:CouchDB是用Erlang開發的面向文檔的數據庫系統,最近剛剛發布了1.0版本(2010年7月14日)。CouchDB不是一個傳 統的關系數據庫,而是面向文檔的數據庫,其數據存儲方式有點類似lucene的index文件格式,CouchDB最大的意義在于它是一個面向web應用 的新一代存儲系統,事實上,CouchDB的口號就是:下一代的Web應用存儲系統。
特點:
一、CouchDB是分布式的數據庫,他可以把存儲系統分布到n臺物理的節點上面,并且很好的協調和同步節點之間的數據讀寫一致性。這當然也得靠 Erlang無與倫比的并發特性才能做到。對于基于web的大規模應用文檔應用,分布式可以讓它不必像傳統的關系數據庫那樣分庫拆表,在應用代碼層進行大 量的改動。
二、CouchDB是面向文檔的數據庫,存儲半結構化的數據,比較類似lucene的index結構,特別適合存儲文檔,因此很適合CMS,電話本,地址本等應用,在這些應用場合,文檔數據庫要比關系數據庫更加方便,性能更好。
三、CouchDB支持REST API,可以讓用戶使用JavaScript來操作CouchDB數據庫,也可以用JavaScript編寫查詢語句,我們可以想像一下,用AJAX技術結合CouchDB開發出來的CMS系統會是多么的簡單和方便。
其實CouchDB只是Erlang應用的冰山一角,在最近幾年,基于Erlang的應用也得到的蓬勃的發展,特別是在基于web的大規模,分布式應用領域,幾乎都是Erlang的優勢項目。
二、MongoDB
簡介:MongoDB 是一個基于分布式文件存儲的數據庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。
MongoDB是一個介于關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。他支持的數據結構非常松散,是類 似json的bson格式,因此可以存儲比較復雜的數據類型。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似于面向對象的查詢語言,幾 乎可以實現類似關系數據庫單表查詢的絕大部分功能,而且還支持對數據建立索引。
相關文章:MongoDB的基本特性與內部構造 大數據吃香 創業公司MongoDB估值達16億美元
特點
它的特點是高性能、易部署、易使用,存儲數據非常方便。主要功能特性有:
*面向集合存儲,易存儲對象類型的數據。
mongodb集群參考
mongodb集群參考
*模式自由。
*支持動態查詢。
*支持完全索引,包含內部對象。
*支持查詢。
*支持復制和故障恢復。
*使用高效的二進制數據存儲,包括大型對象(如視頻等)。
*自動處理碎片,以支持云計算層次的擴展性。
*支持RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
*文件存儲格式為BSON(一種JSON的擴展)。
*可通過網絡訪問。
三、Tachyon
貢獻者:Haoyuan Li(李浩源)
簡介:Tachyon是一個分布式內存文件系統,可以在集群里以訪問內存的速度來訪問存在tachyon里的文 件。把Tachyon是架構在最底層的分布式文件存儲和上層的各種計算框架之間的一種中間件。主要職責是將那些不需要落地到DFS里的文件,落地到分布式 內存文件系統中,來達到共享內存,從而提高效率。同時可以減少內存冗余,GC時間等。
Tachyon架構
Tachyon的架構是傳統的Master—slave架構,這里和Hadoop類似,TachyonMaster里 WorkflowManager是 Master進程,因為是為了防止單點問題,通過Zookeeper做了HA,可以部署多臺Standby Master。Slave是由Worker Daemon和Ramdisk構成。這里個人理解只有Worker Daemon是基于JVM的,Ramdisk是一個off heap memory。Master和Worker直接的通訊協議是Thrift。
下圖來自Tachyon的作者Haoyuan Li:
下載地址:https://github.com/amplab/tachyon
四、KFS
簡介:GFS的C++開源版本,Kosmos distributed file system (KFS)是一個專門為數據密集型應用(搜索引擎,數據挖掘等)而設計的存儲系統,類似于Google的GFS和Hadoop的HDFS分布式文件系統。 KFS使用C++實現,支持的客戶端包括C++,Java和Python。KFS系統由三部分組成,分別是metaserver、chunkserver 和client library。
官網:http://code.google.com/p/kosmosfs/
五、HDFS
簡介:Hadoop分布式文件系統(HDFS)被設計成適合運行在通用硬件(commodity hardware)上的分布式文件系統。它和現有的分布式文件系統有很多共同點。但同時,它和其他的分布式文件系統的區別也是很明顯的。HDFS是一個高 度容錯性的系統,適合部署在廉價的機器上。HDFS能提供高吞吐量的數據訪問,非常適合大規模數據集上的應用。HDFS放寬了一部分POSIX約束,來實 現流式讀取文件系統數據的目的。HDFS在最開始是作為Apache Nutch搜索引擎項目的基礎架構而開發的。HDFS是Apache Hadoop Core項目的一部分。
資源管理
一、推ter Mesos
開發者:推ter研發人員John Oskasson
簡介:Apache Mesos是由加州大學伯克利分校的AMPLab首先開發的一款開源群集管理軟件,支持Hadoop、ElasticSearch、Spark、 Storm 和Kafka等架構,由于其開源性質越來越受到一些大型云計算公司的青睞,例如推ter、非死book等。
參考文章:Mesos漸入主流,推ter模式有望“無限復制”-CSDN.NET
二、Hadoop Yarn
Hadoop 新 MapReduce 框架 Yarn。為從根本上解決舊 MapReduce 框架的性能瓶頸,促進 Hadoop 框架的更長遠發展,從 0.23.0 版本開始,Hadoop 的 MapReduce 框架完全重構,發生了根本的變化。新的 Hadoop MapReduce 框架命名為 MapReduceV2 或者叫 Yarn,其架構圖如下圖所示:
Yarn 框架相對于老的 MapReduce 框架什么優勢呢?我們可以看到:
1、這個設計大大減小了 JobTracker(也就是現在的 ResourceManager)的資源消耗,并且讓監測每一個 Job 子任務 (tasks) 狀態的程序分布式化了,更安全、更優美。
2、在新的 Yarn 中,ApplicationMaster 是一個可變更的部分,用戶可以對不同的編程模型寫自己的 AppMst,讓更多類型的編程模型能夠跑在 Hadoop 集群中,可以參考 hadoop Yarn 官方配置模板中的 mapred-site.xml 配置。
3、對于資源的表示以內存為單位 ( 在目前版本的 Yarn 中,沒有考慮 cpu 的占用 ),比之前以剩余 slot 數目更合理。
4、老的框架中,JobTracker 一個很大的負擔就是監控 job 下的 tasks 的運行狀況,現在,這個部分就扔給 ApplicationMaster 做了,而 ResourceManager 中有一個模塊叫做 ApplicationsMasters( 注意不是 ApplicationMaster),它是監測 ApplicationMaster 的行狀況,如果出問題,會將其在其他機器上重啟。
5、Container 是 Yarn 為了將來作資源隔離而提出的一個框架。這一點應該借鑒了 Mesos 的工作,目前是一個框架,僅僅提供 java 虛擬機內存的隔離 ,hadoop 團隊的設計思路應該后續能支持更多的資源調度和控制 , 既然資源表示成內存量,那就沒有了之前的 map slot/reduce slot 分開造成集群資源閑置的尷尬情況。
第二部分主要收集整理的內容主要有日志收集系統、消息系統、分布式服務、集群管理、RPC、基礎設施、搜索引擎、Iaas和監控管理等大數據開源工具。日志收集系統
一、非死book Scribe
貢獻者:非死book
簡介:Scribe是非死book開源的日志收集系統,在非死book內部已經得到大量的應用。它能夠 從各種日志源上收集日志,存儲到一個中央存儲系統(可以是NFS,分布式文件系統等)上,以便于進行集中統計分析處理。它為日志的“分布式收集,統一處 理”提供了一個可擴展的,高容錯的方案。當中央存儲系統的網絡或者機器出現故障時,scribe會將日志轉存到本地或者另一個位置,當中央存儲系統恢復 后,scribe會將轉存的日志重新傳輸給中央存儲系統。其通常與Hadoop結合使用,scribe用于向HDFS中push日志,而Hadoop通過 MapReduce作業進行定期處理。
Scribe的系統架構
代碼托管:https://github.com/非死book/scribe
二、Cloudera Flume
貢獻者:Cloudera
簡介:Flume是Cloudera提供的一個高可用的,高可靠的,分布式的海量日志采集、聚合和傳輸的系統,Flume支持在日志系統中定制各類數據發送方,用于收集數據;同時,Flume提供對數據進行簡單處理,并寫到各種數據接受方(可定制)的能力。
Flume提供了從console(控制臺)、RPC(Thrift-RPC)、text(文件)、tail(UNIX tail)、syslog(syslog日志系統,支持TCP和UDP等2種模式),exec(命令執行)等數據源上收集數據的能力。
當前Flume有兩個版本Flume 0.9X版本的統稱Flume-og,Flume1.X版本的統稱Flume-ng。由于Flume-ng經過重大重構,與Flume-og有很大不同,使用時請注意區分。
Cloudera Flume構架:
三、logstash
簡介:logstash 是一個應用程序日志、事件的傳輸、處理、管理和搜索的平臺。你可以用它來統一對應用程序日志進行收集管理,提供 Web 接口用于查詢和統計。他可以對你的日志進行收集、分析,并將其存儲供以后使用(如,搜索),您可以使用它。說到搜索,logstash帶有一個web界 面,搜索和展示所有日志。
四、kibana
簡介:Kibana 是一個為 Logstash 和 ElasticSearch 提供的日志分析的 Web 接口。可使用它對日志進行高效的搜索、可視化、分析等各種操作。kibana 也是一個開源和免費的工具,他可以幫助您匯總、分析和搜索重要數據日志并提供友好的web界面。他可以為 Logstash 和 ElasticSearch 提供的日志分析的 Web 界面。
代碼托管: https://github.com/rashidkpc/Kibana/downloads
消息系統
一、StormMQ
簡介:MQMessageQueue消息隊列產品 StormMQ,是一種服務程序。
二、ZeroMQ
簡介:這是個類似于Socket的一系列接口,他跟Socket的區別是:普通的socket是端到端的 (1:1的關系),而ZMQ卻是可以N:M 的關系,人們對BSD套接字的了解較多的是點對點的連接,點對點連接需要顯式地建立連接、銷毀連接、選擇協議(TCP/UDP)和處理錯誤等,而ZMQ屏 蔽了這些細節,讓你的網絡編程更為簡單。ZMQ用于node與node間的通信,node可以是主機或者是進程。
引用官方的說法: “ZMQ(以下ZeroMQ簡稱ZMQ)是一個簡單好用的傳輸層,像框架一樣的一個socket library,他使得Socket編程更加簡單、簡潔和性能更高。是一個消息處理隊列庫,可在多個線程、內核和主機盒之間彈性伸縮。ZMQ的明確目標是 “成為標準網絡協議棧的一部分,之后進入Linux內核”。現在還未看到它們的成功。但是,它無疑是極具前景的、并且是人們更加需要的“傳統”BSD套接 字之上的一 層封裝。ZMQ讓編寫高性能網絡應用程序極為簡單和有趣。”
三、RabbitMQ
簡介:RabbitMQ是一個受歡迎的消息代理,通常用于應用程序之間或者程序的不同組件之間通過消息來進行集成。本文簡單介紹了如何使用 RabbitMQ,假定你已經配置好了rabbitmq服務器。
RabbitMQ是用Erlang,對于主要的編程語言都有驅動或者客戶端。我們這里要用的是Java,所以先要獲得Java客戶端。
像RabbitMQ這樣的消息代理可用來模擬不同的場景,例如點對點的消息分發或者訂閱/推送。我們的程序足夠簡單,有兩個基本的組件,一個生產者用于產生消息,還有一個消費者用來使用產生的消息。
四、Apache ActiveMQ
簡介:ActiveMQ 是Apache出品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規范的 JMS Provider實現,盡管JMS規范出臺已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演著特殊的地位。
特性:
⒈ 多種語言和協議編寫客戶端。語言: Java,C,C++,C#,Ruby,Perl,Python,PHP。應用協議: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
⒉ 完全支持JMS1.1和J2EE 1.4規范 (持久化,XA消息,事務)
⒊ 對Spring的支持,ActiveMQ可以很容易內嵌到使用Spring的系統里面去,而且也支持Spring2.0的特性
⒋ 通過了常見J2EE服務器(如 Geronimo,JBoss 4,GlassFish,WebLogic)的測試,其中通過JCA 1.5 resource adaptors的配置,可以讓ActiveMQ可以自動的部署到任何兼容J2EE 1.4 商業服務器上
⒌ 支持多種傳送協議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
⒍ 支持通過JDBC和journal提供高速的消息持久化
⒎ 從設計上保證了高性能的集群,客戶端-服務器,點對點
⒏ 支持Ajax
⒐ 支持與Axis的整合
⒑ 可以很容易得調用內嵌JMS provider,進行測試
官網:http://activemq.apache.org/
五、Jafka
貢獻者:LinkedIn
簡介:Jafka 是一個開源的、高性能的、跨語言分布式消息系統,使用GitHub托管。Jafka 最早是由Apache孵化的Kafka(由LinkedIn捐助給Apache)克隆而來。由于是一個開放式的數據傳輸協議,因此除了Java開發語言受 到支持,Python、Ruby、C、C++等其他語言也能夠很好的得到支持。
特性:
1、消息持久化非常快,服務端存儲消息的開銷為O(1),并且基于文件系統,能夠持久化TB級的消息而不損失性能。
2、吞吐量取決于網絡帶寬。
3、完全的分布式系統,broker、producer、consumer都原生自動支持分布式。自動實現復雜均衡。
4、內核非常小,整個系統(包括服務端和客戶端)只有一個272KB的jar包,內部機制也不復雜,適合進行內嵌或者二次開發 。整個服務端加上依賴組件共3.5MB。
5、消息格式以及通信機制非常簡單,適合進行跨語言開發。目前自帶的Python3.x的客戶端支持發送消息和接收消息。
六、Apache Kafka
貢獻者:LinkedIn
簡介:Apache Kafka是由Apache軟件基金會開發的一個開源消息系統項目,由Scala寫成。Kafka最初是由LinkedIn開發,并于2011年初開源。 2012年10月從Apache Incubator畢業。該項目的目標是為處理實時數據提供一個統一、高通量、低等待的平臺。
Kafka是一個分布式的、分區的、多復本的日志提交服務。它通過一種獨一無二的設計提供了一個消息系統的功能。
Kafka集群可以在一個指定的時間內保持所有發布上來的消息,不管這些消息有沒有被消費。打個比方,如果這個時間設置為兩天,那么在消息發布的兩 天以內,這條消息都是可以被消費的,但是在兩天后,這條消息就會被系統丟棄以釋放空間。Kafka的性能不會受數據量的大小影響,因此保持大量的數據不是 一個問題。
分布式服務
一、ZooKeeper
貢獻者:Google
簡介:ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個為分布式應用提供一致性服務的軟件,提供的功能包括:配置維護、名字服務、分布式同步、組服務等。
ZooKeeper是以Fast Paxos算法為基礎的,paxos算法存在活鎖的問題,即當有多個proposer交錯提交時,有可能互相排斥導致沒有一個proposer能提交成 功,而Fast Paxos作了一些優化,通過選舉產生一個leader,只有leader才能提交propose,具體算法可見Fast Paxos。因此,要想弄懂ZooKeeper首先得對Fast Paxos有所了解。
架構:
官網:http://zookeeper.apache.org/
RPC
(Remote Procedure Call Protocol)——遠程過程調用協議
一、Apache Avro
簡介:Apache Avro是Hadoop下的一個子項目。它本身既是一個序列化框架,同時也實現了RPC的功能。Avro官網描述Avro的特性和功能如下:
- 豐富的數據結構類型;
- 快速可壓縮的二進制數據形式;
- 存儲持久數據的文件容器;
- 提供遠程過程調用RPC;
- 簡單的動態語言結合功能。
相比于Apache Thrift 和Google的Protocol Buffers,Apache Avro具有以下特點:
- 支持動態模式。Avro不需要生成代碼,這有利于搭建通用的數據處理系統,同時避免了代碼入侵。
- 數據無須加標簽。讀取數據前,Avro能夠獲取模式定義,這使得Avro在數據編碼時只需要保留更少的類型信息,有利于減少序列化后的數據大小。
二、非死book Thrift
貢獻者:非死book
簡介:Thrift源于大名鼎鼎的非死book之手,在2007年非死book提交Apache基金會將Thrift作為一個開源項目,對 于當時的非死book來說創造thrift是為了解決非死book系統中各系統間大數據量的傳輸通信以及系統之間語言環境不同需要跨平臺的特性。
thrift可以支持多種程序語言,例如: C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk. 在多種不同的語言之間通信thrift可以作為二進制的高性能的通訊中間件,支持數據(對象)序列化和多種類型的RPC服務。
Thrift適用于程序對程 序靜態的數據交換,需要先確定好他的數據結構,他是完全靜態化的,當數據結構發生變化時,必須重新編輯IDL文件,代碼生成,再編譯載入的流程,跟其他 IDL工具相比較可以視為是Thrift的弱項,Thrift適用于搭建大型數據交換及存儲的通用工具,對于大型系統中的內部數據傳輸相對于JSON和 xml無論在性能、傳輸大小上有明顯的優勢。
Thrift 主要由5個部分組成:
· 類型系統以及 IDL 編譯器:負責由用戶給定的 IDL 文件生成相應語言的接口代碼
· TProtocol:實現 RPC 的協議層,可以選擇多種不同的對象串行化方式,如 JSON, Binary。
· TTransport:實現 RPC 的傳輸層,同樣可以選擇不同的傳輸層實現,如socket, 非阻塞的 socket, MemoryBuffer 等。
· TProcessor:作為協議層和用戶提供的服務實現之間的紐帶,負責調用服務實現的接口。
· TServer:聚合 TProtocol, TTransport 和 TProcessor 幾個對象。
上述的這5個部件都是在 Thrift 的源代碼中通過為不同語言提供庫來實現的,這些庫的代碼在 Thrift 源碼目錄的 lib 目錄下面,在使用 Thrift 之前需要先熟悉與自己的語言對應的庫提供的接口。
非死book Thrift構架:
集群管理
一、Nagios
簡介:Nagios是一款開源的免費網絡監視工具,能有效監控Windows、Linux和Unix的主機狀態,交換機路由器等網絡設置,打印機等。在系統或服務狀態異常時發出郵件或短信報警第一時間通知網站運維人員,在狀態恢復后發出正常的郵件或短信通知。
Nagios可運行在Linux/Unix平臺之上,同時提供一個可選的基于瀏覽器的WEB界面以方便系統管理人員查看網絡狀態,各種系統問題,以及日志等等。
二、Ganglia
簡介:Ganglia是UC Berkeley發起的一個開源集群監視項目,設計用于測量數以千計的節點。Ganglia的核心包含gmond、gmetad以及一個Web前端。主要 是用來監控系統性能,如:cpu 、mem、硬盤利用率, I/O負載、網絡流量情況等,通過曲線很容易見到每個節點的工作狀態,對合理調整、分配系統資源,提高系統整體性能起到重要作用。
官網:http://ganglia.sourceforge.net/
三、Apache Ambari
簡介:Apache Ambari是一種基于Web的工具,支持Apache Hadoop集群的供應、管理和監控。Ambari目前已支持大多數Hadoop組件,包括HDFS、MapReduce、Hive、Pig、 Hbase、Zookeper、Sqoop和Hcatalog等。
Apache Ambari 支持HDFS、MapReduce、Hive、Pig、Hbase、Zookeper、Sqoop和Hcatalog等的集中管理。也是5個頂級hadoop管理工具之一。
Ambari主要取得了以下成績:
- 通過一步一步的安裝向導簡化了集群供應。
- 預先配置好關鍵的運維指標(metrics),可以直接查看Hadoop Core(HDFS和MapReduce)及相關項目(如HBase、Hive和HCatalog)是否健康。
- 支持作業與任務執行的可視化與分析,能夠更好地查看依賴和性能。
- 通過一個完整的RESTful API把監控信息暴露出來,集成了現有的運維工具。
- 用戶界面非常直觀,用戶可以輕松有效地查看信息并控制集群。
Ambari使用Ganglia收集度量指標,用Nagios支持系統報警,當需要引起管理員的關注時(比如,節點停機或磁盤剩余空間不足等問題),系統將向其發送郵件。
此外,Ambari能夠安裝安全的(基于Kerberos)Hadoop集群,以此實現了對Hadoop 安全的支持,提供了基于角色的用戶認證、授權和審計功能,并為用戶管理集成了LDAP和Active Directory。
基礎設施
一、LevelDB
貢獻者:Jeff Dean和Sanjay Ghemawat
簡介:Leveldb是一個google實現的非常高效的kv數據庫,目前的版本1.2能夠支持billion 級別的數據量了。 在這個數量級別下還有著非常高的性能,主要歸功于它的良好的設計。特別是LMS算法。LevelDB 是單進程的服務,性能非常之高,在一臺4核Q6600的CPU機器上,每秒鐘寫數據超過40w,而隨機讀的性能每秒鐘超過10w。
Leveldb框架:
官網:http://code.google.com/p/leveldb/
二、SSTable
簡介:如果說Protocol Buffer是谷歌獨立數據記錄的通用語言 ,那么有序字符串表(SSTable,Sorted String Table)則是用于存儲,處理和數據集交換的最流行的數據輸出格式。正如它的名字本身,SSTable是有效存儲大量鍵-值對的簡單抽象,對高吞吐 量順序讀/寫進行了優化。
SSTable是Bigtable中至關重要的一塊,對于LevelDB來說也是如此。
三、RecordIO
貢獻者:Google
簡介:我們大家都在用文件來存儲數據。文件是存儲在磁盤上的。如果在一些不穩定的介質上,文件很容損壞。即時文件某個位置出現一點小小的問題,整個文件就廢了。
下面我來介紹Google的一個做法,可以比較好的解決這個問題。那就是recordio文件格式。recoidio的存儲單元是一個一個record。這個record可以根據業務的需要自行定義。但Google有一種建議的處理方式就是使用protobuf。
reocordio底層的格式其實很簡單。一個record由四部分組成:
- MagicNumber (32 bits)
- Uncompressed data payload size (64 bits)
- Compressed data payload size (64 bits), or 0 if the data is not compressed
- Payload, possibly compressed.
詳細格式如下圖所示:
到這里,大家可能已經知道,recordio之所以能對付壞數據,其實就是在這個MagicNumber(校驗值)。
四、Flat Buffers
貢獻者:Google
簡介:谷歌開源高效、跨平臺的序列化庫FlatBuffers。
該庫的構建是專門為游戲開發人員的性能需求提供支持,它將序列化數據存儲在緩存中,這些數據既可以存儲在文件中,又可以通過網絡原樣傳輸,而不需要任何解析開銷。
FlatBuffers有如下一些關鍵特性——
- 訪問序列化數據不需要打包/拆包
- 節省內存而且訪問速度快——緩存只占用訪問數據所需要的內存;不需要任何額外的內存。
- 靈活性——通過可選字段向前向后兼容
- 代碼規模小
- 強類型——錯誤在編譯時捕獲,而不是在運行時
- 便利性——生成的C++頭文件代碼簡潔。如果需要,有一項可選功能可以用來在運行時高效解析Schema和JSON-like格式的文本。
- 跨平臺——使用C++編寫,不依賴STL之外的庫,因此可以用于任何有C++編輯器的平臺。當前,該項目包含構建方法和在Android、Linux、Windows和OSX等操作系統上使用該庫的示例。
與Protocol Buffers或JSON Parsing這樣的可選方案相比,FlatBuffers的優勢在于開銷更小,這主要是由于它沒有解析過程。
代碼托管:https://github.com/google/flatbuffers
五、Protocol Buffers
貢獻者:Google
簡介:Protocol Buffers是Google公司開發的一種數據描述語言,類似于XML能夠將結構化數據序列化,可用于數據存儲、通信協議等方面。它不依賴于語言和平臺 并且可擴展性極強。現階段官方支持C++、JAVA、Python等三種編程語言,但可以找到大量的幾乎涵蓋所有語言的第三方拓展包。
通過它,你可以定義你的數據的結構,并生成基于各種語言的代碼。這些你定義的數據流可以輕松地在傳遞并不破壞你已有的程序。并且你也可以更新這些數據而現有的程序也不會受到任何的影響。
Protocol Buffers經常被簡稱為protobuf。
官網:http://code.google.com/p/protobuf/
六、Consistent Hashing(哈希算法)
簡介:一致性哈希算法在1997年由麻省理工學院提出的一種分布式哈希(DHT)實現算法,設計目標是為了解決 因特網中的熱點(Hot spot)問題,初衷和CARP十分類似。一致性哈希修正了CARP使用的簡 單哈希算法帶來的問題,使得分布式哈希(DHT)可以在P2P環境中真正得到應用。
一致性hash算法提出了在動態變化的Cache環境中,判定哈希算法好壞的四個定義:
1、平衡性(Balance):平衡性是指哈希的結果能夠盡可能分布到所有的緩沖中去,這樣可以使得所有的緩沖空間都得到利用。很多哈希算法都能夠滿足這一條件。
2、單調性(Monotonicity):單調性是指如果已經有一些內容通過哈希分派到了相應的緩沖中,又有新的緩沖加入到系統中。哈希的結果應能夠保證原有已分配的內容可以被映射到原有的或者新的緩沖中去,而不會被映射到舊的緩沖集合中的其他緩沖區。
3、分散性(Spread):在分布式環境中,終端有可能看不到所有的緩沖,而是只能看到其中的一部分。當終端希望通過哈希過程將內容映射到緩沖上 時,由于不同終端所見的緩沖范圍有可能不同,從而導致哈希的結果不一致,最終的結果是相同的內容被不同的終端映射到不同的緩沖區中。這種情況顯然是應該避 免的,因為它導致相同內容被存儲到不同緩沖中去,降低了系統存儲的效率。分散性的定義就是上述情況發生的嚴重程度。好的哈希算法應能夠盡量避免不一致的情 況發生,也就是盡量降低分散性。
4、負載(Load):負載問題實際上是從另一個角度看待分散性問題。既然不同的終端可能將相同的內容映射到不同的緩沖區中,那么對于一個特定的緩 沖區而言,也可能被不同的用戶映射為不同 的內容。與分散性一樣,這種情況也是應當避免的,因此好的哈希算法應能夠盡量降低緩沖的負荷。
在分布式集群中,對機器的添加刪除,或者機器故障后自動脫離集群這些操作是分布式集群管理最基本的功能。如果采用常用的hash(object)%N算法,那么在有機器添加或者刪除后,很多原有的數據就無法找到了,這樣嚴重的違反了單調性原則。
七、Netty
貢獻者:JBOSS
簡介:Netty是由JBOSS提供的一個java開源框架。Netty提供異步的、事件驅動的網絡應用程序框架和工具,用以快速開發高性能、高可靠性的網絡服務器和客戶端程序。
也就是說,Netty 是一個基于NIO的客戶,服務器端編程框架,使用Netty 可以確保你快速和簡單的開發出一個網絡應用,例如實現了某種協議的客戶,服務端應用。Netty相當簡化和流線化了網絡應用的編程開發過程,例如,TCP和UDP的socket服務開發。
“快速”和“簡單”并不意味著會讓你的最終應用產生維護性或性能上的問題。Netty 是一個吸收了多種協議的實現經驗,這些協議包括FTP,SMTP,HTTP,各種二進制,文本協議,并經過相當精心設計的項目,最終,Netty 成功的找到了一種方式,在保證易于開發的同時還保證了其應用的性能,穩定性和伸縮性。
八、BloomFilter
簡介:Bloom filter 是由 Howard Bloom 在 1970 年提出的二進制向量數據結構,它具有很好的空間和時間效率,被用來檢測一個元素是不是集合中的一個成員。如果檢測結果為是,該元素不一定在集合中;但如果 檢測結果為否,該元素一定不在集合中。因此Bloom filter具有100%的召回率。這樣每個檢測請求返回有“在集合內(可能錯誤)”和“不在集合內(絕對不在集合內)”兩種情況,可見 Bloom filter 是犧牲了正確率和時間以節省空間。
Bloom filter 優點就是它的插入和查詢時間都是常數,另外它查詢元素卻不保存元素本身,具有良好的安全性。
搜索引擎
一、Nutch
簡介:Nutch 是一個開源Java 實現的搜索引擎。它提供了我們運行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬蟲。
盡管Web搜索是漫游Internet的基本要求, 但是現有web搜索引擎的數目卻在下降. 并且這很有可能進一步演變成為一個公司壟斷了幾乎所有的web搜索為其謀取商業利益.這顯然 不利于廣大Internet用戶.
Nutch為我們提供了這樣一個不同的選擇. 相對于那些商用的搜索引擎, Nutch作為開放源代碼 搜索引擎將會更加透明, 從而更值得大家信賴. 現在所有主要的搜索引擎都采用私有的排序算法, 而不會解釋為什么一個網頁會排在一個特定的位置. 除此之外, 有的搜索引擎依照網站所付的 費用, 而不是根據它們本身的價值進行排序. 與它們不同, Nucth沒有什么需要隱瞞, 也沒有 動機去扭曲搜索的結果. Nutch將盡自己最大的努力為用戶提供最好的搜索結果.
Nutch目前最新的版本為version v2.2.1。
二、Lucene
開發者:Doug Cutting(Hadoop之父,你懂的)
簡介:Lucene是apache軟件基金會4 jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,即它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的 查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語言)。Lucene的目的是為軟件開發人員提供一個簡單易用的工具包,以方便的在目標系統中 實現全文檢索的功能,或者是以此為基礎建立起完整的全文檢索引擎。
三、SolrCloud
簡介:SolrCloud是Solr4.0版本以后基于Solr和Zookeeper的分布式搜索方案。SolrCloud是Solr的基于Zookeeper一種部署方式。Solr可以以多種方式部署,例如單機方式,多機Master-Slaver方式。
原理圖:
SolrCloud有幾個特色功能:
集中式的配置信息使用ZK進行集中配置。啟動時可以指定把Solr的相關配置文件上傳
Zookeeper,多機器共用。這些ZK中的配置不會再拿到本地緩存,Solr直接讀取ZK中的配置信息。配置文件的變動,所有機器都可以感知 到。另外,Solr的一些任務也是通過ZK作為媒介發布的。目的是為了容錯。接收到任務,但在執行任務時崩潰的機器,在重啟后,或者集群選出候選者時,可 以再次執行這個未完成的任務。
自動容錯SolrCloud對索引分片,并對每個分片創建多個Replication。每個Replication都可以對外提供服務。一個 Replication掛掉不會影響索引服務。更強大的是,它還能自動的在其它機器上幫你把失敗機器上的索引Replication重建并投入使用。
近實時搜索立即推送式的replication(也支持慢推送)。可以在秒內檢索到新加入索引。
查詢時自動負載均衡SolrCloud索引的多個Replication可以分布在多臺機器上,均衡查詢壓力。如果查詢壓力大,可以通過擴展機器,增加Replication來減緩。
自動分發的索引和索引分片發送文檔到任何節點,它都會轉發到正確節點。
事務日志事務日志確保更新無丟失,即使文檔沒有索引到磁盤。
四、Solr
簡介:Solr是一個獨立的企業級搜索應用服務器,它對外提供類似于Web-service的API接口。用戶可以通過http請求,向搜索引擎服務器提交一定格式的XML文件,生成索引;也可以通過Http Get操作提出查找請求,并得到XML格式的返回結果。
Solr是一個高性能,采用Java5開發,基于Lucene的全文搜索服務器。同時對其進行了擴展,提供了比Lucene更為豐富的查詢語言,同時實現了可配置、可擴展并對查詢性能進行了優化,并且提供了一個完善的功能管理界面,是一款非常優秀的全文搜索引擎。
官網:https://lucene.apache.org/solr/
五、ElasticSearch
簡介:ElasticSearch是一個基于Lucene的搜索服務器。它提供了一個分布式多用戶能力的全文搜 索引擎,基于RESTful web接口。Elasticsearch是用Java開發的,并作為Apache許可條款下的開放源碼發布,是第二最流行的企業搜索引擎。設計用于云計算 中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。
官網:http://www.elasticsearch.org/
六、Sphinx
簡介:Sphinx是一個基于SQL的全文檢索引擎,可以結合MySQL,PostgreSQL做全文搜索,它 可以提供比數據庫本身更專業的搜索功能,使得應用程序更容易實現專業化的全文檢索。Sphinx特別為一些腳本語言設計搜索API接口,如 PHP,Python,Perl,Ruby等,同時為MySQL也設計了一個存儲引擎插件。
Sphinx單一索引最大可包含1億條記錄,在1千萬條記錄情況下的查詢速度為0.x秒(毫秒級)。Sphinx創建索引的速度為:創建100萬條 記錄的索引只需 3~4分鐘,創建1000萬條記錄的索引可以在50分鐘內完成,而只包含最新10萬條記錄的增量索引,重建一次只需幾十秒。
七、SenseiDB
貢獻者:linkedin
簡介:SenseiDB是一個NoSQL數據庫,它專注于高更新率以及復雜半結構化搜索查詢。熟悉Lucene 和Solor的用戶會發現,SenseiDB背后有許多似曾相識的概念。SenseiDB部署在多節點集群中,其中每個節點可以包括N塊數據片。 Apache Zookeeper用于管理節點,它能夠保持現有配置,并可以將任意改動(如拓撲修改)傳輸到整個節點群中。SenseiDB集群還需要一種模式用于定義 將要使用的數據模型。
從SenseiDB集群中獲取數據的唯一方法是通過Gateways(它 沒有“INSERT”方法)。每個集群都連接到一個單一gateway。你需要了解很重要的一點是,由于SenseiDB本身沒法處理原子性 (Atomicity)和隔離性(Isolation),因此只能通過外部在gateway層進行限制。另外,gateway必須確保數據流按照預期的方 式運作。內置的gateway有以下幾種形式:
- 來自文件
- 來自JMS隊列
- 通過JDBC
- 來自Apache Kafka
數據挖掘
一、Mahout
簡介:Apache Mahout 是 Apache Software Foundation (ASF) 開發的一個全新的開源項目,其主要目標是創建一些可伸縮的機器學習算法,供開發人員在 Apache 在許可下免費使用。該項目已經發展到了它的最二個年頭,目前只有一個公共發行版。Mahout 包含許多實現,包括集群、分類、CP 和進化程序。此外,通過使用 Apache Hadoop 庫,Mahout 可以有效地擴展到云中。
雖然在開源領域中相對較為年輕,但 Mahout 已經提供了大量功能,特別是在集群和 CF 方面。Mahout 的主要特性包括:
- Taste CF。Taste 是 Sean Owen 在 SourceForge 上發起的一個針對 CF 的開源項目,并在 2008 年被贈予 Mahout。
- 一些支持 Map-Reduce 的集群實現包括 k-Means、模糊 k-Means、Canopy、Dirichlet 和 Mean-Shift。
- Distributed Naive Bayes 和 Complementary Naive Bayes 分類實現。
- 針對進化編程的分布式適用性功能。
- Matrix 和矢量庫。
- 上述算法的示例。
Iaas
IaaS(Infrastructure as a Service),即基礎設施即服務。
一、OpenStack
簡介:OpenStack是一個由NASA(美國國家航空航天局)和Rackspace合作研發并發起的,以Apache許可證授權的自由軟件和開放源代碼項目。
OpenStack是一個開源的云計算管理平臺項目,由幾個主要的組件組合起來完成具體工作。OpenStack支持幾乎所有類型的云環境,項目目 標是提供實施簡單、可大規模擴展、豐富、標準統一的云計算管理平臺。OpenStack通過各種互補的服務提供了基礎設施即服務(IaaS)的解決方案, 每個服務提供API以進行集成。
6個核心項目:Nova(計算,Compute),Swift(對象存儲,Object),Glance(鏡 像,Image),Keystone(身份,Identity),Horizon(自助門戶,Dashboard),Quantum & Melange(網絡&地址管理),另外還有若干社區項目,如Rackspace(負載均衡)、Rackspace(關系型數據庫)。
相關閱讀:
二、Docker
貢獻者:dotCloud
簡介:Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app)。幾乎沒有性能開銷,可以很容易地在機器和數據中心中運行。最重要的是,他們不依賴于任何語言、框架或包括系統。
三、Kubernetes
貢獻者:Google
簡介:Kubernetes是Google開源的容器集群管理系統。它構建Ddocker技術之上,為容器化的應用提供資源調度、部署運行、服務發現、擴容縮容等整一套功能,本質上可看作是基于容器技術的mini-PaaS平臺。
Kubernetes從另一個角度對資源進行抽象,它讓開發人員和管理人員共同著眼于服務的行為和性能的提升,而不是僅僅關注對單一的組件或者是基礎資源。
那么Kubernetes集群到底提供了哪些單一容器所沒有功能?它主要關注的是對服務級別的控制而并非僅僅是對容器級別的控 制,Kubernetes提供了一種“機智”的管理方式,它將服務看成一個整體。在Kubernete的解決方案中,一個服務甚至可以自我擴展,自我診 斷,并且容易升級。例如,在Google中,我們使用機器學習技術來保證每個運行的服務的當前狀態都是最高效的。
代碼托管:https://github.com/GoogleCloudPlatform/kubernetes/
四、Imctfy
貢獻者:Google
簡介:Google開源了自己所用Linux容器系統的開源版本lmctfy,讀音為lem-kut-fee。包括一個C++庫(使用了C++11,文檔可以參考頭文件)和命令行界面。目前的版本是0.1,只提供了CPU與內存隔離。項目還在密集開發中。
mctfy本身是針對某些特定使用場景設計和實現的,目前擁有一臺機器上所有容器時運行情況最好,不推薦與LXC和其他容器系統一起使用(雖然也可行)。已在Ubuntu 12.04+和Ubuntu 3.3與3.8內核上測試。
代碼托管:https://github.com/google/Imctfy/
監控管理
一、Dapper
貢獻者:Google
簡介:Dapper是一個輕量的ORM(對象關系映射(英語:Object Relational Mapping,簡稱ORM,或O/RM,或O/R mapping)。并不單純的是一個DBHelper.因為在Dapper中數據其實就是一個對象。Dapper擴展與IDbConnection上,所 以事實上它的傾入性很低。我用了StructureMap。如果不喜歡可以自己更換,或者自己實現下。
代碼就一個SqlMapper.cs文件,主要是IDbConnection的擴展方法,編譯后就40K的一個很小的dll。
特性:
- Dapper很快。Dapper的速度接近與IDataReader。
- Dapper支持主流數據庫 Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的數據庫
- 支持多表并聯的對象。支持一對多 多對多的關系,并且沒侵入性。
- 原理通過Emit反射IDataReader的序列隊列,來快速的得到和產生對象
- Dapper語法十分簡單。并且無須遷就數據庫的設計
官方站點 http://code.google.com/p/dapper-dot-net/
代碼托管:http://bigbully.github.io/Dapper-translation/
二、Zipkin
貢獻者:推ter
簡介:Zipkin (分布式跟蹤系統)是 推ter 的一個開源項目,允許開發者收集 推ter 各個服務上的監控數據,并提供查詢接口。該系統讓開發者可通過一個 Web 前端輕松的收集和分析數據,例如用戶每次請求服務的處理時間等,可方便的監測系統中存在的瓶頸。
官方網站:http://推ter.github.io/zipkin/
代碼托管:https://github.com/推ter/zipkin/
End.
來自36大數據(36dsj.com):36大數據 ? 一共81個,開源大數據處理工具匯總(下),包括日志收集系統/集群管理/RPC等