當前位置:首頁 » 算力簡介 » cassandra去中心化

cassandra去中心化

發布時間: 2022-02-11 10:36:00

❶ cassandra創建列族要放在配置文件里嗎

Cassandra是一個混合型的非關系的資料庫,類似於Google的BigTable。其主要功能比Dynamo (分布式的Key-Value存儲系統)更豐富,但支持度卻不如文檔存儲MongoDB(介於關系資料庫和非關系資料庫之間的開源產品,是非關系資料庫當中功能最豐富,最像關系資料庫的。
支持的數據結構非常鬆散,是類似json的bjson格式,因此可以存儲比較復雜的數據類型)。Cassandra最初由Facebook開發,後轉變成了開源項目。它是一個網路社交雲計算方面理想的資料庫。以Amazon專有的完全分布式的Dynamo為基礎,結合了Google BigTable基於列族(Column Family)的數據模型。P2P去中心化的存儲。很多方面都可以稱之為Dynamo 2.0。

❷ 如何建立一個完整可用的安全大數據平台


要建立一個大數據系統,我們需要從數據流的源頭跟蹤到最後有價值的輸出,並在現有的Hadoop和大數據生態圈內根據實際需求挑選並整合各部分合適的組件來構建一個能夠支撐多種查詢和分析功能的系統平台。這其中既包括了對數據存儲的選擇,也涵蓋了數據線上和線下處理分離等方面的思考和權衡。此外,沒有任何一個引入大數據解決方案的商業應用在生產環境上承擔的起安全隱患。

1
計算框架篇
大數據的價值

只有在能指導人們做出有價值的決定時,數據才能體現其自身的價值。因此,大數據技術要服務於實際的用途,才是有意義的。一般來說,大數據可以從以下三個方面指導人們做出有價值的決定:

報表生成(比如根據用戶歷史點擊行為的跟蹤和綜合分析、 應用程序活躍程度和用戶粘性計算等);

診斷分析(例如分析為何用戶粘性下降、根據日誌分析系統為何性能下降、垃圾郵件以及病毒的特徵檢測等);

決策(例如個性化新聞閱讀或歌曲推薦、預測增加哪些功能能增加用戶粘性、幫助廣告主進行廣告精準投放、設定垃圾郵件和病毒攔截策略等)。

圖 1

進一步來看,大數據技術從以下三個方面解決了傳統技術難以達成的目標(如圖1):

在歷史數據上的低延遲(互動式)查詢,目標是加快決策過程和時間, 例如分析一個站點為何變緩慢並嘗試修復它;

在實時數據上的低延遲查詢,目的是幫助用戶和應用程序在實時數據上做出決策, 例如實時檢測並阻攔病毒蠕蟲(一個病毒蠕蟲可以在1.3秒內攻擊1百萬台主機);

更加精細高級的數據處理演算法,這可以幫助用戶做出「更好」的決策, 例如圖數據處理、異常點檢測、趨勢分析及其他機器學習演算法。

蛋糕模式

從將數據轉換成價值的角度來說,在Hadoop生態圈十年蓬勃成長的過程中,YARN和Spark這二者可以算得上是里程碑事件。Yarn的出現使得集群資源管理和數據處理流水線分離,大大革新並推動了大數據應用層面各種框架的發展(SQL on Hadoop框架, 流數據,圖數據,機器學習)。

它使得用戶不再受到MapRece開發模式的約束,而是可以創建種類更為豐富的分布式應用程序,並讓各類應用程序運行在統一的架構上,消除了為其他框架維護獨有資源的開銷。就好比一個多層蛋糕,下面兩層是HDFS和Yarn, 而MapRece就只是蛋糕上層的一根蠟燭而已,在蛋糕上還能插各式各樣的蠟燭。

在這一架構體系中,總體數據處理分析作業分三塊(圖2),在HBase上做互動式查詢(Apache Phoenix, Cloudera Impala等), 在歷史數據集上編寫MapRece程序抑或利用Hive等做批處理業務, 另外對於實時流數據分析Apache Storm則會是一種標准選擇方案。

雖然Yarn的出現極大地豐富了Hadoop生態圈的應用場景,但仍存有兩個顯而易見的挑戰:一是在一個平台上需要維護三個開發堆棧;二是在不同框架內很難共享數據,比如很難在一個框架內對流數據做互動式查詢。這也意味著我們需要一個更為統一和支持更好抽象的計算框架的出現。

圖 2

一統江湖

Spark的出現使得批處理任務,互動式查詢,實時流數據處理被整合到一個統一的框架內(圖3),同時Spark和現有的開源生態系統也能夠很好地兼容(Hadoop, HDFS, Yarn, Hive, Flume)。 通過啟用內存分布數據集,優化迭代工作負載, 用戶能夠更簡單地操作數據,並在此基礎上開發更為精細的演算法,如機器學習和圖演算法等。

有三個最主要的原因促使Spark目前成為了時下最火的大數據開源社區(擁有超過來自200多個公司的800多個contributors):

Spark可以擴展部署到超過8000節點並處理PB級別的數據,同時也提供了很多不錯的工具供應用開發者進行管理和部署;

Spark提供了一個互動式shell供開發者可以用Scala或者Python即時性試驗不同的功能;

Spark提供了很多內置函數使得開發者能夠比較容易地寫出低耦合的並且能夠並發執行的代碼,這樣開發人員就更能集中精力地為用戶提供更多的業務功能而不是花費時間在優化並行化代碼之上。

當然Spark也和當年的MapRece一樣不是萬靈葯,比如對實時性要求很高的流數據處理上Apache Storm還是被作為主流選擇, 因為Spark Streaming實際上是microbatch(將一個流數據按時間片切成batch,每個batch提交一個job)而不是事件觸發實時系統,所以雖然支持者們認為microbatch在系統延時性上貢獻並不多,但在生產環境中和Apache Storm相比還不是特別能滿足對低延時要求很高的應用場景。

比如在實踐過程中, 如果統計每條消息的平均處理時間,很容易達到毫秒級別,但一旦統計類似service assurance(確保某條消息在毫秒基本能被處理完成)的指標, 系統的瓶頸有時還是不能避免。

但同時我們不能不注意到,在許多用例當中,與流數據的交互以及和靜態數據集的結合是很有必要的, 例如我們需要在靜態數據集上進行分類器的模型計算,並在已有分類器模型的基礎上,對實時進入系統的流數據進行交互計算來判定類別。

由於Spark的系統設計對各類工作(批處理、流處理以及互動式工作)進行了一個共有抽象,並且生態圈內延伸出了許多豐富的庫(MLlib機器學習庫、SQL語言API、GraphX), 使得用戶可以在每一批流數據上進行靈活的Spark相關操作,在開發上提供了許多便利。

Spark的成熟使得Hadoop生態圈在短短一年之間發生了翻天覆地的變化, Cloudera和Hortonworks紛紛加入了Spark陣營,而Hadoop項目群中除了Yarn之外已經沒有項目是必須的了(雖然Mesos已在一些場合替代了Yarn), 因為就連HDFS,Spark都可以不依賴。但很多時候我們仍然需要像Impala這樣的依賴分布式文件系統的MPP解決方案並利用Hive管理文件到表的映射,因此Hadoop傳統生態圈依然有很強的生命力。

另外在這里簡要對比一下互動式分析任務中各類SQL on Hadoop框架,因為這也是我們在實際項目實施中經常遇到的問題。我們主要將注意力集中在Spark SQL, Impala和Hive on Tez上, 其中Spark SQL是三者之中歷史最短的,論文發表在15年的SIGMOD會議上, 原文對比了數據倉庫上不同類型的查詢在Shark(Spark最早對SQL介面提供的支持)、Spark SQL和Impala上的性能比較。

也就是說, 雖然Spark SQL在Shark的基礎上利用Catalyst optimizer在代碼生成上做了很多優化,但總體性能還是比不上Impala, 尤其是當做join操作的時候, Impala可以利用「predicate pushdown」更早對表進行選擇操作從而提高性能。

不過Spark SQL的Catalyst optimizer一直在持續優化中,相信未來會有更多更好的進展。Cloudera的Benchmark評測中Impala一直比其他SQL on Hadoop框架性能更加優越,但同時Hortonworks評測則指出雖然單個數據倉庫查詢Impala可以在很短的時間內完成,但是一旦並發多個查詢Hive on Tez的優勢就展示出來。另外Hive on Tez在SQL表達能力也要比Impala更強(主要是因為Impala的嵌套存儲模型導致的), 因此根據不同的場景選取不同的解決方案是很有必要的。

圖 3

各領風騷抑或代有才人出?

近一年比較吸引人眼球的Apache Flink(與Spark一樣已有5年歷史,前身已經是柏林理工大學一個研究性項目,被其擁躉推崇為繼MapRece, Yarn,Spark之後第四代大數據分析處理框架)。 與Spark相反,Flink是一個真正的實時流數據處理系統,它將批處理看作是流數據的特例,同Spark一樣它也在嘗試建立一個統一的平台運行批量,流數據,互動式作業以及機器學習,圖演算法等應用。

Flink有一些設計思路是明顯區別於Spark的,一個典型的例子是內存管理,Flink從一開始就堅持自己精確的控制內存使用並且直接操作二進制數據,而Spark一直到1.5版本都還是試用java的內存管理來做數據緩存,這也導致了Spark很容易遭受OOM以及JVM GC帶來的性能損失。

但是從另外一個角度來說, Spark中的RDD在運行時被存成java objects的設計模式也大大降低了用戶編程設計門檻, 同時隨著Tungsten項目的引入,Spark現在也逐漸轉向自身的內存管理, 具體表現為Spark生態圈內從傳統的圍繞RDD(分布式java對象集合)為核心的開發逐漸轉向以DataFrame(分布式行對象集合)為核心。

總的來說,這兩個生態圈目前都在互相學習,Flink的設計基因更為超前一些,但Spark社區活躍度大很多,發展到目前毫無疑問是更為成熟的選擇,比如對數據源的支持(HBase, Cassandra, Parquet, JSON, ORC)更為豐富以及更為統一簡潔的計算表示。另一方面,Apache Flink作為一個由歐洲大陸發起的項目,目前已經擁有來自北美、歐洲以及亞洲的許多貢獻者,這是否能夠一改歐洲在開源世界中一貫的被動角色,我們將在未來拭目以待。

2
NoSQL資料庫篇
NoSQL資料庫在主流選擇上依舊集中在MongoDB, HBase和Cassandra這三者之間。在所有的NoSQL選擇中,用C 編寫的MongoDB幾乎應該是開發者最快也最易部署的選擇。MongoDB是一個面向文檔的資料庫,每個文檔/記錄/數據(包括爬取的網頁數據及其他大型對象如視頻等)是以一種BSON(Binary JSON)的二進制數據格式存儲, 這使得MongoDB並不需要事先定義任何模式, 也就是模式自由(可以把完全不同結構的記錄放在同一個資料庫里)。

MongoDB對於完全索引的支持在應用上是很方便的,同時也具備一般NoSQL分布式資料庫中可擴展,支持復制和故障恢復等功能。 MongoDB一般應用於高度伸縮性的緩存及大尺寸的JSON數據存儲業務中,但不能執行「JOIN」操作,而且數據佔用空間也比較大,最被用戶詬病的就是由於MongoDB提供的是資料庫級鎖粒度導致在一些情況下建索引操作會引發整個資料庫阻塞。一般來說,MongoDB完全可以滿足一些快速迭代的中小型項目的需求。

下面來主要談談Cassandra和HBase之間的比較選擇。Cassandra和HBase有著截然不同的基因血統。HBase和其底層依賴的系統架構源自於著名的Google FileSystem(發表於2003年)和Google BigTable設計(發表於2006年), 其克服了HDFS注重吞吐量卻犧牲I/O的缺點,提供了一個存儲中間層使得用戶或者應用程序可以隨機讀寫數據。

具體來說,HBase的更新和刪除操作實際上是先發生在內存MemStore中, 當MemStore滿了以後會Flush到StoreFile, 之後當StoreFile文件數量增長到一定閾值後會觸發Compact合並操作,因此HBase的更新操作其實是不斷追加的操作,而最終所有更新和刪除數據的持久化操作都是在之後Compact過程中進行的。

這使得應用程序在向內存MemStore寫入數據後,所做的修改馬上就能得到反映,用戶讀到的數據絕不會是陳舊的數據,保證了I/O高性能和數據完全一致性; 另一方面來說, HBase基於Hadoop生態系統的基因就已經決定了他自身的高度可擴展性、容錯性。

在數據模型上,Cassandra和HBase類似實現了一個key-value提供面向列式存儲服務,其系統設計參考了 Amazon Dynamo (發表於2007年) 分布式哈希(DHT)的P2P結構(實際上大部分Cassandra的初始工作都是由兩位從Amazon的Dynamo組跳槽到Facebook的工程師完成),同樣具有很高的可擴展性和容錯性等特點。

除此之外, 相對HBase的主從結構,Cassandra去中心化的P2P結構能夠更簡單地部署和維護,比如增加一台機器只需告知Cassandra系統新節點在哪,剩下的交給系統完成就行了。同時,Cassandra對多數據中心的支持也更好,如果需要在多個數據中心進行數據遷移Cassandra會是一個更優的選擇。

Eric Brewer教授提出的經典CAP理論認為任何基於網路的數據共享系統,最多隻能滿足數據一致性、可用性、分區容忍性三要素中的兩個要素。實際分布式系統的設計過程往往都是在一致性與可用性上進行取捨,相比於HBase數據完全一致性的系統設計,Cassandra選擇了在優先考慮數據可用性的基礎上讓用戶自己根據應用程序需求決定系統一致性級別。

比如:用戶可以配置QUONUM參數來決定系統需要幾個節點返回數據才能向客戶端做出響應,ONE指只要有一個節點返回數據就可以對客戶端做出響應,ALL指等於數據復制份數的所有節點都返回結果才能向客戶端做出響應,對於數據一致性要求不是特別高的可以選擇ONE,它是最快的一種方式。

從基因和發展歷史上來說,HBase更適合用做數據倉庫和大規模數據處理與分析(比如對網頁數據建立索引), 而Cassandra則更適合用作實時事務和互動式查詢服務。Cassandra在國外市場佔有比例和發展要遠比國內紅火, 在不少權威測評網站上排名都已經超過了HBase。目前Apache Cassandra的商業化版本主要由軟體公司DataStax進行開發和銷售推廣。另外還有一些NoSQL分布式資料庫如Riak, CouchDB也都在各自支持的廠商推動下取得了不錯的發展。

雖然我們也考慮到了HBase在實際應用中的不便之處比如對二級索引的支持程度不夠(只支持通過單個行鍵訪問,通過行鍵的范圍查詢,全表掃描),不過在明略的大數據基礎平台上,目前整合的是依然是HBase。

理由也很簡單,HBase出身就與Hadoop的生態系統緊密集成,其能夠很容易與其他SQL on Hadoop框架(Cloudera Impala, Apache Phoenix, or Hive on Tez)進行整合,而不需要重新部署一套分布式資料庫系統,而且可以很方便地將同樣的數據內容在同一個生態系統中根據不同框架需要來變換存儲格式(比如存儲成Hive表或者Parquet格式)。

我們在很多項目中都有需要用到多種SQL on Hadoop框架,來應對不同應用場景的情況,也體會到了在同一生態系統下部署多種框架的簡便性。 但同時我們也遇到了一些問題, 因為HBase項目本身與HDFS和Zookeeper系統分別是由不同開源團隊進行維護的,所以在系統整合時我們需要先對HBase所依賴的其他模塊進行設置再對HBase進行配置,在一定程度上降低了系統維護的友好性。

目前我們也已經在考慮將Cassandra應用到一些新的客戶項目中,因為很多企業級的應用都需要將線上線下資料庫進行分離,HBase更適合存儲離線處理的結果和數據倉庫,而更適合用作實時事務和並發交互性能更好的Cassandra作為線上服務資料庫會是一種很好的選擇。

3
大數據安全篇
隨著越來越多各式各樣的數據被存儲在大數據系統中,任何對企業級數據的破壞都是災難性的,從侵犯隱私到監管違規,甚至會造成公司品牌的破壞並最終影響到股東收益。給大數據系統提供全面且有效的安全解決方案的需求已經十分迫切:

大數據系統存儲著許多重要且敏感的數據,這些數據是企業長久以來的財富

與大數據系統互動的外部系統是動態變化的,這會給系統引入新的安全隱患

在一個企業的內部,不同Business Units會用不同的方式與大數據系統進行交互,比如線上的系統會實時給集群推送數據、數據科學家團隊則需要分析存儲在數據倉庫內的歷史數據、運維團隊則會需要對大數據系統擁有管理許可權。

因此為了保護公司業務、客戶、財務和名譽免於被侵害,大數據系統運維團隊必須將系統安全高度提高到和其他遺留系統一樣的級別。同時大數據系統並不意味著引入大的安全隱患,通過精細完整的設計,仍然能夠把一些傳統的系統安全解決方案對接到最新的大數據集群系統中。

一般來說,一個完整的企業級安全框架包括五個部分:

Administration: 大數據集群系統的集中式管理,設定全局一致的安全策略

Authentication: 對用戶和系統的認證

Authorization:授權個人用戶和組對數據的訪問許可權

Audit:維護數據訪問的日誌記錄

Data Protection:數據脫敏和加密以達到保護數據的目的

系統管理員要能夠提供覆蓋以上五個部分的企業級安全基礎設施,否則任何一環的缺失都可能給整個系統引入安全性風險。

在大數據系統安全集中式管理平台這塊,由Hortonworks推出的開源項目Apache Ranger就可以十分全面地為用戶提供Hadoop生態圈的集中安全策略的管理,並解決授權(Authorization)和審計(Audit)。例如,運維管理員可以輕松地為個人用戶和組對文件、數據等的訪問策略,然後審計對數據源的訪問。

與Ranger提供相似功能的還有Cloudera推出的Apache Sentry項目,相比較而言Ranger的功能會更全面一些。

而在認證(Authentication)方面, 一種普遍採用的解決方案是將基於Kerberos的認證方案對接到企業內部的LDAP環境中, Kerberos也是唯一為Hadoop全面實施的驗證技術。

另外值得一提的是Apache Knox Gateway項目,與Ranger提高集群內部組件以及用戶互相訪問的安全不同,Knox提供的是Hadoop集群與外界的唯一交互介面,也就是說所有與集群交互的REST API都通過Knox處理。這樣,Knox就給大數據系統提供了一個很好的基於邊緣的安全(perimeter-based security)。

基於以上提到的五個安全指標和Hadoop生態圈安全相關的開源項目, 已經足已證明基於Hadoop的大數據平台我們是能夠構建一個集中、一致、全面且有效的安全解決方案。
我市再ITjob管網上面找的

❸ 如何設置cassandra集群

1、基本配置

首先需要准備3台或以上的計算機。下面假定有3台運行 Linux 操作系統的計算機,IP地址分別為 192.168.0.100, 192.168.0.101 和 192.168.0.102。 系統需要安裝好 Java 運行時環境,然後到這里下載 0.7 版本的 Cassandra 二進制發行包。

挑選其中的一台機開始配置,先展開 cassandra 發行包:$ tar -zxvf apache-cassandra-$VERSION.tar.gz
$ cd apache-cassandra-$VERSION

其中的 conf/cassandra.yaml 文件為主要配置文件,0.7 版以後不再採用XML格式配置文件了,如果對 YAML 格式不熟悉的話最好先到這里了解一下。

Cassandra 在配置文件里默認設定了幾個目錄:data_file_directories: /var/lib/cassandra/data
commitlog_directory: /var/lib/cassandra/commitlog
saved_caches_directory: /var/lib/cassandra/saved_caches

data_file_directories 可以一次同時設置幾個不同目錄,cassandra 會自動同步所有目錄的數據。另外在日誌配置文件 log4j-server.properties 也有一個默認設定日誌文件的目錄:log4j.appender.R.File=/var/log/cassandra/system.log

一般情況下採用默認的配置即可,除非你有特殊的儲存要求,所以現在有兩種方案:一是按照默認配置創建相關的目錄,二是修改配置文件採用自己指定的目錄。

下面為了簡單起見採用第一種方案:$ sudo mkdir -p /var/log/cassandra
$ sudo chown -R `whoami` /var/log/cassandra
$ sudo mkdir -p /var/lib/cassandra
$ sudo chown -R `whoami` /var/lib/cassandra

上面的 `whoami` 是 Linux 指令用於獲取當前登錄的用戶名,如果你不準備用當前登錄用戶運行 Cassandra,那麼需要把 `whoami` 替換成具體的用戶名。
2、有關集群的配置

由於 Cassandra 採用去中心化結構,所以當集群里的一台機器(節點)啟動之後需要一個途徑通知當前集群(有新節點加入啦),Cassandra 的配置文件里有一個 seeds 的設置項,所謂的 seeds 就是能夠聯系集群中所有節點的一台計算機,假如集群中所有的節點位於同一個機房同一個子網,那麼只要隨意挑選幾台比較穩定的計算機即可。在當前的例子中因為只有3台機器,所以我挑選第一台作為種子節點,配置如下: seeds:
- 192.168.0.100

然後配置節點之前通信的IP地址:listen_address: 192.168.0.100

需要注意的是這里必須使用具體的IP地址,而不能使用 0.0.0.0 這樣的地址。

配置 Cassandra Thrift 客戶端(應用程序)訪問的IP地址:rpc_address: 192.168.0.100

這項可以使用 0.0.0.0 監聽一台機器所有的網路介面。

Cassandra 的 Keyspaces 和 ColumnFamilies 不再需要配置了,他們將在運行時創建和維護。

把配置好的 Cassandra 復制到第2和第3台機器,同時創建相關的目錄,還需要修改 listen_address 和 rpc_address 為實際機器的IP地址。至此所有的配置完成了。
3、啟動 Cassandra 各個節點以及集群管理

啟動順序沒什麼所謂,只要保證種子節點啟動就可以了:$ bin/cassandra -f

參數 -f 的作用是讓 Cassandra 以前端程序方式運行,這樣有利於調試和觀察日誌信息,而在實際生產環境中這個參數是不需要的(即 Cassandra 會以 daemon 方式運行)。

所有節點啟動後可以通過 bin/nodetool 工具管理集群,比如查看所有節點運行情況:

$ bin/nodetool -host 192.168.0.101 ring

運行結果類似如下:
Address Status State Load Owns Token
159559...
192.168.0.100 Up Normal 49.27 KB 39.32% 563215...
192.168.0.101 Up Normal 54.42 KB 16.81% 849292...
192.168.0.102 Up Normal 73.14 KB 43.86% 159559...

命令中 -host 參數用於指定 nodetool 跟哪一個節點通信,對於 nodetool ring 命令來說,跟哪個節點通信都沒有區別,所以可以隨意指定其中一個節點。

從上面結果列表可以看到運行中的節點是否在線、State、數據負載量以及節點Token(可以理解為節點名稱,這個是節點第一次啟動時自動產生的)。我們可以使用 nodetool 組合 token 對具體節點進行管理,比如查看指定節點的詳細信息:$ bin/nodetool -host 192.168.0.101 info

運行的結果大致如下:

Load : 54.42 KB
Generation No : 1302057702
Uptime (seconds) : 591
Heap Memory (MB) : 212.14 / 1877.63

查看指定節點的數據結構信息: $ bin/nodetool -host 192.168.0.101 cfstats

運行結果:
Keyspace: Keyspace1
Read Count: 0
Write Count: 0
Pending Tasks: 0
Column Family: CF1
SSTable count: 1

使用下面命令可以移除一個已經下線的節點(比如第2台機器關機了或者壞掉了) $ bin/nodetool -host 192.168.0.101 removetoken

下了線的節點如何重新上線呢?什麼都不用做,只需啟動 Cassandra 程序它就會自動加入集群了。

在實際運作中我們可能會需要隔一段時間備份一次數據(創建一個快照),這個操作在 Cassandra 里非常簡單:$ bin/nodetool -host 192.168.0.101 snapshot

4、測試數據的讀寫

使用客戶端組件加單元測試是首選的,如果僅想知道集群是否正常讀寫數據,可以用cassandra-cli 作一個簡單測試:$ bin/cassandra-cli -host 192.168.0.101

接著輸入如下語句:
create keyspace Keyspace1;
use Keyspace1;
create column family Users with comparator=UTF8Type and default_validation_class=UTF8Type;
set Users[jsmith][first] = 'John';
set Users[jsmith][last] = 'Smith';
get Users[jsmith];

上面語句創建了一個名為「Keyspace1」的 keyspace,還創建了一個名為「Users」的 Column Family,最後向 Users 添加了一個 item。正常的話應該看到類似下面的結果:
=> (column=first, value=John, timestamp=1302059332540000)
=> (column=last, value=Smith, timestamp=1300874233834000)
Returned 2 results.

❹ nosql解決方案為什麼需要固態硬碟

Membase
Membase 是 NoSQL 家族的一個新的重量級的成員。Membase是開源項目,源代碼採用了Apache2.0的使用許可。該項目託管在GitHub.Source tarballs上,可以下載beta版本的Linux二進制包。該產品主要是由North Scale的memcached核心團隊成員開發完成,其中還包括Zynga和NHN這兩個主要貢獻者的工程師,這兩個組織都是很大的在線游戲和社區網路空間的供應商。
Membase容易安裝、操作,可以從單節點方便的擴展到集群,而且為memcached(有線協議的兼容性)實現了即插即用功能,在應用方面為開發者和經營者提供了一個比較低的門檻。做為緩存解決方案,Memcached已經在不同類型的領域(特別是大容量的Web應用)有了廣泛的使用,其中 Memcached的部分基礎代碼被直接應用到了Membase伺服器的前端。
通過兼容多種編程語言和框架,Membase具備了很好的復用性。在安裝和配置方面,Membase提供了有效的圖形化界面和編程介面,包括可配置 的告警信息。
Membase的目標是提供對外的線性擴展能力,包括為了增加集群容量,可以針對統一的節點進行復制。 另外,對存儲的數據進行再分配仍然是必要的。
這方面的一個有趣的特性是NoSQL解決方案所承諾的可預測的性能,類准確性的延遲和吞吐量。通過如下方式可以獲得上面提到的特性:
◆ 自動將在線數據遷移到低延遲的存儲介質的技術(內存,固態硬碟,磁碟)
◆ 可選的寫操作一一非同步,同步(基於復制,持久化)
◆ 反向通道再平衡[未來考慮支持]
◆ 多線程低鎖爭用
◆ 盡可能使用非同步處理
◆ 自動實現重復數據刪除
◆ 動態再平衡現有集群
◆ 通過把數據復制到多個集群單元和支持快速失敗轉移來提供系統的高可用性。
MongoDB
MongoDB是一個介於關系資料庫和非關系資料庫之間的產品,是非關系資料庫當中功能最豐富,最像關系資料庫的。他支持的數據結構非常鬆散,是類似json的bjson格式,因此可以存儲比較復雜的數據類型。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似於面向對象的查詢語言,幾乎可以實現類似關系資料庫單表查詢的絕大部分功能,而且還支持對數據建立索引。它的特點是高性能、易部署、易使用,存儲數據非常方便。
主要功能特性:
◆ 面向集合存儲,易存儲對象類型的數據
「面向集合」(Collenction-Oriented),意思是數據被分組存儲在數據集中,被稱為一個集合(Collenction)。每個 集合在資料庫中都有一個唯一的標識名,並且可以包含無限數目的文檔。集合的概念類似關系型資料庫(RDBMS)里的表(table),不同的是它不需要定 義任何模式(schema)。
◆ 模式自由
模式自由(schema-free),意味著對於存儲在mongodb資料庫中的文件,我們不需要知道它的任何結構定義。如果需要的話,你完全可以把不同結構的文件存儲在同一個資料庫里。
◆支持動態查詢
◆支持完全索引,包含內部對象
◆支持查詢
◆支持復制和故障恢復
◆使用高效的二進制數據存儲,包括大型對象(如視頻等)
◆自動處理碎片,以支持雲計算層次的擴展性
◆支持RUBY,PYTHON,JAVA,C++,PHP等多種語言
◆文件存儲格式為BSON(一種JSON的擴展)
BSON(Binary Serialized document Format)存儲形式是指:存儲在集合中的文檔,被存儲為鍵-值對的形式。鍵用於唯一標識一個文檔,為字元串類型,而值則可以是各種復雜的文件類型。
◆可通過網路訪問
MongoDB服務端可運行在Linux、Windows或OS X平台,支持32位和64位應用,默認埠為27017。推薦運行在64位平台,因為MongoDB在32位模式運行時支持的最大文件尺寸為2GB。
MongoDB把數據存儲在文件中(默認路徑為:/data/db),為提高效率使用內存映射文件進行管理。
Hypertable
Hypertable是一個開源、高性能、可伸縮的資料庫,它採用與Google的Bigtable相似的模型。在過去數年中,Google為在PC集群 上運行的可伸縮計算基礎設施設計建造了三個關鍵部分。第一個關鍵的基礎設施是Google File System(GFS),這是一個高可用的文件系統,提供了一個全局的命名空間。它通過跨機器(和跨機架)的文件數據復制來達到高可用性,並因此免受傳統 文件存儲系統無法避免的許多失敗的影響,比如電源、內存和網路埠等失敗。第二個基礎設施是名為Map-Rece的計算框架,它與GFS緊密協作,幫 助處理收集到的海量數據。第三個基礎設施是Bigtable,它是傳統資料庫的替代。Bigtable讓你可以通過一些主鍵來組織海量數據,並實現高效的 查詢。Hypertable是Bigtable的一個開源實現,並且根據我們的想法進行了一些改進。
Apache Cassandra
Apache Cassandra是一套開源分布式Key-Value存儲系統。它最初由Facebook開發,用於儲存特別大的數據。Facebook在使用此系統。
主要特性:
◆ 分布式
◆ 基於column的結構化
◆ 高伸展性
Cassandra的主要特點就是它不是一個資料庫,而是由一堆資料庫節點共同構成的一個分布式網路服務,對Cassandra 的一個寫操作,會被復制到其他節點上去,對Cassandra的讀操作,也會被路由到某個節點上面去讀取。對於一個Cassandra群集來說,擴展性能 是比較簡單的事情,只管在群集裡面添加節點就可以了。
Cassandra是一個混合型的非關系的資料庫,類似於Google的BigTable。其主要功能比 Dynomite(分布式的Key-Value存 儲系統)更豐富,但支持度卻不如文檔存儲MongoDB(介於關系資料庫和非關系資料庫之間的開源產品,是非關系資料庫當中功能最豐富,最像關系資料庫 的。Cassandra最初由Facebook開發,後轉變成了開源項目。它是一個網路社交雲計算方面理想的資料庫。以Amazon專有的完全分布式的Dynamo為基礎,結合了Google BigTable基於列族(Column Family)的數據模型。P2P去中心化的存儲。很多方面都可以稱之為Dynamo 2.0。
CouchDB
所用語言: Erlang
特點:DB一致性,易於使用
使用許可: Apache
協議: HTTP/REST
雙向數據復制,持續進行或臨時處理,處理時帶沖突檢查,因此,採用的是master-master復制
MVCC – 寫操作不阻塞讀操作
可保存文件之前的版本
Crash-only(可靠的)設計
需要不時地進行數據壓縮
視圖:嵌入式 映射/減少
格式化視圖:列表顯示
支持進行伺服器端文檔驗證
支持認證
根據變化實時更新
支持附件處理
因此, CouchApps(獨立的 js應用程序)
需要 jQuery程序庫
最佳應用場景:適用於數據變化較少,執行預定義查詢,進行數據統計的應用程序。適用於需要提供數據版本支持的應用程序。
例如:CRM、CMS系統。 master-master復制對於多站點部署是非常有用的。
和其他資料庫比較,其突出特點是:
◆ 模式靈活 :使用Cassandra,像文檔存儲,你不必提前解決記錄中的欄位。你可以在系統運行時隨意的添加或移除欄位。這是一個驚人的效率提升,特別是在大型部 署上。
◆ 真正的可擴展性 :Cassandra是純粹意義上的水平擴展。為給集群添加更多容量,可以指向另一台電腦。你不必重啟任何進程,改變應用查詢,或手動遷移任何數據。
◆ 多數據中心識別 :你可以調整你的節點布局來避免某一個數據中心起火,一個備用的數據中心將至少有每條記錄的完全復制。
◆ 范圍查詢 :如果你不喜歡全部的鍵值查詢,則可以設置鍵的范圍來查詢。
◆ 列表數據結構 :在混合模式可以將超級列添加到5維。對於每個用戶的索引,這是非常方便的。
◆ 分布式寫操作 :有可以在任何地方任何時間集中讀或寫任何數據。並且不會有任何單點失敗。
問度娘,啥都有。

❺ Dynamo的高級分析

有了上面一章里的兩個基礎介紹之後,我們開始進入Dynamo的世界。
Dynamo的數據分區與作用
在Dynamo的實現中提到一個關鍵的東西,就是數據分區。 假設我們的數據的key的范圍是0到2的64次方(不用懷疑你的數據量會超過它,正常甚至變態情況下你都是超不過的,甚至像伏地魔等其他類Dynamo系統是使用的 2的32次方),然後設置一個常數,比如說1000,將我們的key的范圍分成1000份。然後再將這1000份key的范圍均勻分配到所有的節點(s個節點),這樣每個節點負責的分區數就是1000/s份分區。
如圖二,假設我們有A、B、C三台機器,然後將我們的分區定義了12個。
圖二:三個節點分12個區的數據的情況
因為數據是均勻離散到這個環上的(有人開始會認為數據的key是從1、2、3、4……這樣子一直下去的,其實不是的,哈希計算出來的值,都是一個離散的結果),所以我們每個分區的數據量是大致相等的。從圖上我們可以得出,每台機器都分到了三個分區里的數據,並且因為分區是均勻的,在分區數量是相當大的時候,數據的分布會更加的均勻,與此同時,負載也被均勻地分開了(當然了,如果硬要說你的負載還是只集中在一個分區里,那就不是在這里要討論的問題了,有可能是你的哈希函數是不是有什麼樣的問題了)。
為什麼要進行這樣的分布呢,分布的好處在於,在有新機器加入的時候,只需要替換原有分區即可,如圖三所示:
圖三:加入一個新的節點D的情況
同樣是圖二里的情況,12個分區分到ABC三個節點,圖三中就是再進入了一個新的節點D,從圖上的重新分布情況可以得出,所有節點里只需要轉移四分之一的數據到新來的節點即可,同時,新節點的負載也伴隨分區的轉移而轉移了(這里的12個分區太少了,如果是1200個分區甚至是12000個分區的話,這個結論就是正確的了,12個分區只為演示用)。
從Dynamo的NRW看CAP法則
在Dynamo系統中,第一次提出來了NRW的方法。
N:復制的次數;
R:讀數據的最小節點數;
W:寫成功的最小分區數。
這三個數的具體作用是用來靈活地調整Dynamo系統的可用性與一致性。
舉個例子來說,如果R=1的話,表示最少只需要去一個節點讀數據即可,讀到即返回,這時是可用性是很高的,但並不能保證數據的一致性,如果說W同時為1的 話,那可用性更新是最高的一種情況,但這時完全不能保障數據的一致性,因為在可供復制的N個節點里,只需要寫成功一次就返回了,也就意味著,有可能在讀的這一次並沒有真正讀到需要的數據(一致性相當的不好)。如果W=R=N=3的話,也就是說,每次寫的時候,都保證所有要復制的點都寫成功,讀的時候也是都讀到,這樣子讀出來的數據一定是正確的,但是其性能大打折扣,也就是說,數據的一致性非常的高,但系統的可用性卻非常低了。如果R + W > N能夠保證我們「讀我們所寫」,Dynamo推薦使用322的組合。
Dynamo系統的數據分區讓整個網路的可擴展性其實是一個固定值(你分了多少區,實際上網路里擴展節點的上限就是這個數),通過NRW來達到另外兩個方 向上的調整。
Dynamo的一些增加可用性的補救
針對一些經常可能出現的問題,Dynamo還提供了一些解決的方法。
第一個是hinted handoff數據的加入:在一個節點出現臨時性故障時,數據會自動進入列表中的下一個節點進行寫操作,並標記為handoff數據,在收到通知需要原節點恢復時重新把數據推回去。這能使系統的寫入成功大大提升。
第二個是向量時鍾來做版本控制:用一個向量(比如說[a,1]表示這個數據在a節點第一次寫入)來標記數據的版本,這樣在有版本沖突的時候,可以追溯到出現問題的地方。這可以使數據的最終一致成為可能。(Cassandra未用vector clock,而只用client timestamps也達到了同樣效果。)
第三個是Merkle tree來提速數據變動時的查找:使用Merkle tree為數據建立索引,只要任意數據有變動,都將快速反饋出來。
第四個是Gossip協議:一種通訊協議,目標是讓節點與節點之間通信,省略中心節點的存在,使網路達到去中心化。提高系統的可用性。

❻ elasticsearch的自動發現節點機制是怎麼實現的,原理是怎樣

著作權歸作者所有。 商業轉載請聯系作者獲得授權,非商業轉載請註明出處。 作者:ben well 鏈接:http://www.hu.com/question/29360024/answer/55368070 來源:知乎 早期 es 版本有 split brain 問題,俗稱腦裂。ES 採用的是一種 P2P 的 gossip 選舉方式,Gossip 演算法因為 Cassandra 而名聲大噪。 背景: Gossip 演算法, 靈感來自辦公室八卦, 只要一個人八卦一下, 在有限的時間內所有人都會知道該八卦的信息, 這種方式也與病毒傳播類似, 因為 Gossip 有眾多的別名"閑話演算法"、"疫情傳播演算法"、"病毒感染演算法"、"謠言傳播(Rumor-Mongering)演算法". 但 Gossip 並不是一個新東西, 之前的泛洪查找、路由演算法都歸屬於這個范疇, 不同的是 Gossip 給這類演算法提供了明確的語義、具體實施方法及收斂性證明. 特點: Gossip 演算法又被稱為反熵(Anti-Entropy), 熵是物理學上的一個概念, 代表雜亂無章, 而反熵就是在雜亂無章中尋求一致, 這充分說明了 Gossip 的特點:在一個有界網路中, 每個節點都隨機地與其他節點通信, 經過一番雜亂無章的通信, 最終所有節點的狀態都會達成一致. 每個節點可能知道所有其他節點, 也可能僅知道幾個鄰居節點, 只要這些節可以通過網路連通, 最終他們的狀態都是一致的, 當然這也是疫情傳播的特點. 要注意到的一點是, 即使有的節點因宕機而重啟, 有新節點加入, 但經過一段時間後, 這些節點的狀態也會與其他節點達成一致, 也就是說, Gossip 天然具有分布式容錯的優點. 本質: Gossip 是一個帶冗餘的容錯演算法, 更進一步, Gossip 是一個最終一致性演算法。 雖然無法保證在某個時刻所有節點狀態一致, 但可以保證在」最終「所有節點一致, 」最終「是一個現實中存在, 但理論上無法證明的時間點。 因為 Gossip 不要求節點知道所有其他節點, 因此又具有去中心化的特點, 節點之間完全對等, 不需要任何的中心節點。 實際上 Gossip 可以用於眾多能接受「最終一致性」的領域:失敗檢測、路由同步、Pub/Sub、動態負載均衡。 但 Gossip 的缺點也很明顯, 冗餘通信會對網路帶寬、CPU 資源造成很大的負載, 而這些負載又受限於通信頻率, 該頻率又影響著演算法收斂的速度。 總結: Gossip 是一種去中心化、容錯而又最終一致性的絕妙演算法, 其收斂性不但得到證明還具有指數級的收斂速度。 使用 Gossip 的系統可以很容易的把 Server 擴展到更多的節點, 滿足彈性擴展輕而易舉。 唯一的缺點是收斂是最終一致性, 不適應那些強一致性的場景, 比如 2PC。

❼ cassandradaemon什麼進程

1、基本配置

首先需要准備3台或以上的計算機。下面假定有3台運行 Linux 操作系統的計算機,IP地址分別為 192.168.0.100, 192.168.0.101 和 192.168.0.102。 系統需要安裝好 Java 運行時環境,然後到這里下載 0.7 版本的 Cassandra 二進制發行包。

挑選其中的一台機開始配置,先展開 cassandra 發行包:$ tar -zxvf apache-cassandra-$VERSION.tar.gz
$ cd apache-cassandra-$VERSION

其中的 conf/cassandra.yaml 文件為主要配置文件,0.7 版以後不再採用XML格式配置文件了,如果對 YAML 格式不熟悉的話最好先到這里了解一下。

Cassandra 在配置文件里默認設定了幾個目錄:data_file_directories: /var/lib/cassandra/data
commitlog_directory: /var/lib/cassandra/commitlog
saved_caches_directory: /var/lib/cassandra/saved_caches

data_file_directories 可以一次同時設置幾個不同目錄,cassandra 會自動同步所有目錄的數據。另外在日誌配置文件 log4j-server.properties 也有一個默認設定日誌文件的目錄:log4j.appender.R.File=/var/log/cassandra/system.log

一般情況下採用默認的配置即可,除非你有特殊的儲存要求,所以現在有兩種方案:一是按照默認配置創建相關的目錄,二是修改配置文件採用自己指定的目錄。

下面為了簡單起見採用第一種方案:$ sudo mkdir -p /var/log/cassandra
$ sudo chown -R `whoami` /var/log/cassandra
$ sudo mkdir -p /var/lib/cassandra
$ sudo chown -R `whoami` /var/lib/cassandra

上面的 `whoami` 是 Linux 指令用於獲取當前登錄的用戶名,如果你不準備用當前登錄用戶運行 Cassandra,那麼需要把 `whoami` 替換成具體的用戶名。
2、有關集群的配置

由於 Cassandra 採用去中心化結構,所以當集群里的一台機器(節點)啟動之後需要一個途徑通知當前集群(有新節點加入啦),Cassandra 的配置文件里有一個 seeds 的設置項,所謂的 seeds 就是能夠聯系集群中所有節點的一台計算機,假如集群中所有的節點位於同一個機房同一個子網,那麼只要隨意挑選幾台比較穩定的計算機即可。在當前的例子中因為只有3台機器,所以我挑選第一台作為種子節點,配置如下: seeds:
- 192.168.0.100

然後配置節點之前通信的IP地址:listen_address: 192.168.0.100

需要注意的是這里必須使用具體的IP地址,而不能使用 0.0.0.0 這樣的地址。

配置 Cassandra Thrift 客戶端(應用程序)訪問的IP地址:rpc_address: 192.168.0.100

這項可以使用 0.0.0.0 監聽一台機器所有的網路介面。

Cassandra 的 Keyspaces 和 ColumnFamilies 不再需要配置了,他們將在運行時創建和維護。

把配置好的 Cassandra 復制到第2和第3台機器,同時創建相關的目錄,還需要修改 listen_address 和 rpc_address 為實際機器的IP地址。至此所有的配置完成了。
3、啟動 Cassandra 各個節點以及集群管理

啟動順序沒什麼所謂,只要保證種子節點啟動就可以了:$ bin/cassandra -f

參數 -f 的作用是讓 Cassandra 以前端程序方式運行,這樣有利於調試和觀察日誌信息,而在實際生產環境中這個參數是不需要的(即 Cassandra 會以 daemon 方式運行)。

所有節點啟動後可以通過 bin/nodetool 工具管理集群,比如查看所有節點運行情況:

$ bin/nodetool -host 192.168.0.101 ring

運行結果類似如下:
Address Status State Load Owns Token
159559...
192.168.0.100 Up Normal 49.27 KB 39.32% 563215...
192.168.0.101 Up Normal 54.42 KB 16.81% 849292...
192.168.0.102 Up Normal 73.14 KB 43.86% 159559...

命令中 -host 參數用於指定 nodetool 跟哪一個節點通信,對於 nodetool ring 命令來說,跟哪個節點通信都沒有區別,所以可以隨意指定其中一個節點。

從上面結果列表可以看到運行中的節點是否在線、State、數據負載量以及節點Token(可以理解為節點名稱,這個是節點第一次啟動時自動產生的)。我們可以使用 nodetool 組合 token 對具體節點進行管理,比如查看指定節點的詳細信息:$ bin/nodetool -host 192.168.0.101 info

運行的結果大致如下:

Load : 54.42 KB
Generation No : 1302057702
Uptime (seconds) : 591
Heap Memory (MB) : 212.14 / 1877.63

查看指定節點的數據結構信息: $ bin/nodetool -host 192.168.0.101 cfstats

運行結果:
Keyspace: Keyspace1
Read Count: 0
Write Count: 0
Pending Tasks: 0
Column Family: CF1
SSTable count: 1

使用下面命令可以移除一個已經下線的節點(比如第2台機器關機了或者壞掉了) $ bin/nodetool -host 192.168.0.101 removetoken

下了線的節點如何重新上線呢看什麼都不用做,只需啟動 Cassandra 程序它就會自動加入集群了。

在實際運作中我們可能會需要隔一段時間備份一次數據(創建一個快照),這個操作在 Cassandra 里非常簡單:$ bin/nodetool -host 192.168.0.101 snapshot

4、測試數據的讀寫

使用客戶端組件加單元測試是首選的,如果僅想知道集群是否正常讀寫數據,可以用cassandra-cli 作一個簡單測試:$ bin/cassandra-cli -host 192.168.0.101

接著輸入如下語句:
create keyspace Keyspace1;
use Keyspace1;
create column family Users with comparator=UTF8Type and default_validation_class=UTF8Type;
set Users[jsmith][first] = 'John';
set Users[jsmith][last] = 'Smith';
get Users[jsmith];

上面語句創建了一個名為逗Keyspace1地的 keyspace,還創建了一個名為逗Users地的 Column Family,最後向 Users 添加了一個 item。正常的話應該看到類似下面的結果:
=> (column=first, value=John, timestamp=1302059332540000)
=> (column=last, value=Smith, timestamp=1300874233834000)
Returned 2 results.

❽ 為什麼 elasticsearch 獲取節點信息失敗

為什麼 elasticsearch 獲取節點信息失敗
早期 es 版本有 split brain 問題,俗稱腦裂。ES 採用的是一種 P2P 的 gossip 選舉方式,Gossip 演算法因為 Cassandra 而名聲大噪。
背景:
Gossip 演算法, 靈感來自辦公室八卦, 只要一個人八卦一下, 在有限的時間內所有人都會知道該八卦的信息,
這種方式也與病毒傳播類似, 因為 Gossip 有眾多的別名"閑話演算法"、"疫情傳播演算法"、"病毒感染演算法"、"謠言傳播(Rumor-Mongering)演算法".
但 Gossip 並不是一個新東西, 之前的泛洪查找、路由演算法都歸屬於這個范疇, 不同的是 Gossip 給這類演算法提供了明確的語義、具體實施方法及收斂性證明.

特點:
Gossip 演算法又被稱為反熵(Anti-Entropy), 熵是物理學上的一個概念, 代表雜亂無章, 而反熵就是在雜亂無章中尋求一致,
這充分說明了 Gossip 的特點:在一個有界網路中, 每個節點都隨機地與其他節點通信, 經過一番雜亂無章的通信,
最終所有節點的狀態都會達成一致. 每個節點可能知道所有其他節點, 也可能僅知道幾個鄰居節點,
只要這些節可以通過網路連通, 最終他們的狀態都是一致的, 當然這也是疫情傳播的特點.
要注意到的一點是, 即使有的節點因宕機而重啟, 有新節點加入, 但經過一段時間後,
這些節點的狀態也會與其他節點達成一致, 也就是說, Gossip 天然具有分布式容錯的優點.

本質:
Gossip 是一個帶冗餘的容錯演算法, 更進一步, Gossip 是一個最終一致性演算法。
雖然無法保證在某個時刻所有節點狀態一致, 但可以保證在」最終「所有節點一致, 」最終「是一個現實中存在, 但理論上無法證明的時間點。
因為 Gossip 不要求節點知道所有其他節點, 因此又具有去中心化的特點, 節點之間完全對等, 不需要任何的中心節點。
實際上 Gossip 可以用於眾多能接受「最終一致性」的領域:失敗檢測、路由同步、Pub/Sub、動態負載均衡。
但 Gossip 的缺點也很明顯, 冗餘通信會對網路帶寬、CPU 資源造成很大的負載, 而這些負載又受限於通信頻率, 該頻率又影響著演算法收斂的速度。

❾ cassandra在pom.xml裡面怎麼設置library

1.執行代碼//CassandraTest.scalaimportorg.apache.spark.{Logging,SparkContext,SparkConf}importcom.datastax.spark.connector.cql.{defmain(args:Array[String]){#配置spark,cassandra的ip,這里都是本機valSparkMasterHost="127.0.0.1"valCassandraHost="127.0.0.1"//:valconf=newSparkConf(true).set("spark.cassandra.connection.host",CassandraHost).set("spark.cleaner.ttl","3600").setMaster("local[12]").setAppName("CassandraTestApp")//ConnecttotheSparkcluster:lazyvalsc=newSparkContext(conf)//預處理腳本,連接的時候就執行這些CassandraConnector(conf).withSessionDo{session=>session.execute("={'class':'SimpleStrategy','replication_factor':1}")session.execute("CREATETABLEIFNOTEXISTStest.key_value(keyINTPRIMARYKEY,valueVARCHAR)")session.execute("TRUNCATEtest.key_value")session.execute("INSERTINTOtest.key_value(key,value)VALUES(1,'firstrow')")session.execute("INSERTINTOtest.key_value(key,value)VALUES(2,'secondrow')")session.execute("INSERTINTOtest.key_value(key,value)VALUES(3,'thirdrow')")}//載入connectorimportcom.datastax.spark.connector._//Readtabletest.kvandprintitscontents:valrdd=sc.cassandraTable("test","key_value").select("key","value")rdd.collect().foreach(row=>println(s"ExistingData:$row"))//Writetwonewrowstothetest.kvtable:valcol=sc.parallelize(Seq((4,"fourthrow"),(5,"fifthrow")))col.saveToCassandra("test","key_value",SomeColumns("key","value"))//.kvtable:assert(col.collect().length==2)col.collect().foreach(row=>println(s"NewData:$row"))println(s"Workcompleted,stoppingtheSparkcontext.")sc.stop()}}2.目錄結構由於構建工具是用sbt,所以目錄結構也必須遵循sbt規范,主要是build.sbt和src目錄,其它目錄會自動生成。qpzhang@qpzhangdeMac-mini:~/scala_code/CassandraTest$lltotal8drwxr-xr-x6qpzhangstaff204112612:14./drwxr-xr-x10qpzhangstaff340112517:30../-rw-r--r--1qpzhangstaff460112610:11build.sbtdrwxr-xr-x3qpzhangstaff102112517:42project/drwxr-xr-x3qpzhangstaff102112517:32src/drwxr-xr-x6qpzhangstaff204112517:55target/qpzhang@qpzhangdeMac-mini:~/scala_code/CassandraTest$treesrc/src/└──main└──scala└──CassandraTest.scalaqpzhang@qpzhangdeMac-mini:~/scala_code/CassandraTest$catbuild.sbtname:="CassandraTest"version:="1.0"scalaVersion:="2.10.4"libraryDependencies+="org.apache.spark"%%"spark-core"%"1.5.2"%"provided"libraryDependencies+="com.datastax.spark"%%"spark-cassandra-connector"%"1.5.0-M2":={casePathList(ps@_*)ifps.lastendsWith".properties"=>MergeStrategy.firstcasex=>valoldStrategy=().valueoldStrategy(x)}這里需要注意的是,sbt安裝的是當時最新版本0.13,並且安裝了assembly插件(這里要吐槽一下sbt,下載一坨坨的jar包,最好有FQ代理,否則下載等待時間很長)。qpzhang@qpzhangdeMac-mini:~/scala_code/CassandraTest$cat~/.sbt/0.13/plugins/plugins.sbtaddSbtPlugin("com.typesafe.sbteclipse"%"sbteclipse-plugin"%"2.5.0")addSbtPlugin("com.eed3si9n"%"sbt-assembly"%"0.14.1")3.sbt編譯打包在build.sbt目錄下,使用sbt命令啟動。然後使用compile命令進行編譯,使用assembly進行打包。在次期間,遇到了sbt-assembly-deplicate-error的問題,參考這里。>compile[success]Totaltime:0s,completed2015-11-2610:11:50>>assembly[info]Includingfromcache:slf4j-api-1.7.5.jar[info]Includingfromcache:metrics-core-3.0.2.jar[info]Includingfromcache:netty-codec-4.0.27.Final.jar[info]Includingfromcache:netty-handler-4.0.27.Final.jar[info]Includingfromcache:netty-common-4.0.27.Final.jar[info]Includingfromcache:joda-time-2.3.jar[info]Includingfromcache:netty-buffer-4.0.27.Final.jar[info]Includingfromcache:commons-lang3-3.3.2.jar[info]Includingfromcache:jsr166e-1.1.0.jar[info]Includingfromcache:cassandra-clientutil-2.1.5.jar[info]Includingfromcache:joda-convert-1.2.jar[info]Includingfromcache:netty-transport-4.0.27.Final.jar[info]Includingfromcache:guava-16.0.1.jar[info]Includingfromcache:spark-cassandra-connector_2.10-1.5.0-M2.jar[info]Includingfromcache:cassandra-driver-core-2.2.0-rc3.jar[info]Includingfromcache:scala-reflect-2.10.5.jar[info]Includingfromcache:scala-library-2.10.5.jar[info]Checkingevery*.class/*.jarfile'sSHA-1.[info]Mergingfiles[warn]Merging'META-INF/INDEX.LIST'withstrategy'discard'[warn]Merging'META-INF/MANIFEST.MF'withstrategy'discard'[warn]Merging'META-INF/io.netty.versions.properties'withstrategy'first'[warn]Merging'META-INF/maven/com.codahale.metrics/metrics-core/pom.xml'withstrategy'discard'[warn]Merging'META-INF/maven/com.datastax.cassandra/cassandra-driver-core/pom.xml'withstrategy'discard'[warn]Merging'META-INF/maven/com.google.guava/guava/pom.xml'withstrategy'discard'[warn]Merging'META-INF/maven/com.twitter/jsr166e/pom.xml'withstrategy'discard'[warn]Merging'META-INF/maven/io.netty/netty-buffer/pom.xml'withstrategy'discard'[warn]Merging'META-INF/maven/io.netty/netty-codec/pom.xml'withstrategy'discard'[warn]Merging'META-INF/maven/io.netty/netty-common/pom.xml'withstrategy'discard'[warn]Merging'META-INF/maven/io.netty/netty-handler/pom.xml'withstrategy'discard'[warn]Merging'META-INF/maven/io.netty/netty-transport/pom.xml'withstrategy'discard'[warn]Merging'META-INF/maven/joda-time/joda-time/pom.xml'withstrategy'discard'[warn]Merging'META-INF/maven/org.apache.commons/commons-lang3/pom.xml'withstrategy'discard'[warn]Merging'META-INF/maven/org.joda/joda-convert/pom.xml'withstrategy'discard'[warn]Merging'META-INF/maven/org.slf4j/slf4j-api/pom.xml'withstrategy'discard'[warn]Strategy'discard'wasappliedto15files[warn]Strategy'first'wasappliedtoafile[info]SHA-1:[info]Packaging/Users/qpzhang/scala_code/CassandraTest/target/scala-2.10/CassandraTest-assembly-1.0.jar[info]Donepackaging.[success]Totaltime:19s,completed2015-11-2610:12:224.提交到spark,執行結果qpzhang@qpzhangdeMac-mini:~/project/spark-1.5.2-bin-hadoop2.6$./bin/spark-submit--class"CassandraTestApp"--masterlocal[4]~/scala_code/CassandraTest/target/scala-2.10/CassandraTest-assembly-1.0.jar//5/11/2611:40:23INFOTaskSetManager:Startingtask0.0instage0.0(TID0,localhost,NODE_LOCAL,26660bytes)15/11/2611:40:23INFOExecutor:Runningtask0.0instage0.0(TID0)15/11/2611:40:23INFOExecutor:Fetchinghttp://10.60.215.42:57683/jars/CassandraTest-assembly-1.0./11/2611:40:23INFOCassandraConnector::TestCluster15/11/2611:40:23INFOUtils:Fetchinghttp://10.60.215.42:57683/jars/CassandraTest-assembly-1.0.jarto/private/var/folders/2l//T/spark-4030cadf-8489-4540-976e-e98eedf50412/userFiles-63085bda-aa04-4906-9621-c1cedd98c163/.tmp15/11/2611:40:23INFOExecutor:Addingfile:/private/var/folders/2l//T/spark-4030cadf-8489-4540-976e-e98eedf50412/userFiles-63085bda-aa04-4906-9621-c1cedd98c163/CassandraTest-assembly-1.0.jartoclassloader15/11/2611:40:24INFOCluster:NewCassandrahostlocalhost/127.0.0.1:9042added15/11/2611:40:24INFOCassandraConnector:ConnectedtoCassandracluster:TestCluster15/11/2611:40:25INFOExecutor:Finishedtask0.0instage0.0(TID0).2676bytesresultsenttodriver15/11/2611:40:25INFOTaskSetManager:Finishedtask0.0instage0.0(TID0)in2462msonlocalhost(1/1)15/11/2611:40:25INFOTaskSchelerImpl:RemovedTaskSet0.0,whosetaskshaveallcompleted,frompool15/11/2611:40:25INFODAGScheler:ResultStage0(collectatCassandraTest.scala:32)finishedin2.481s15/11/2611:40:25INFODAGScheler:Job0finished:collectatCassandraTest.scala:32,took2.940601sExistingData:CassandraRow{key:1,value:firstrow}ExistingData:CassandraRow{key:2,value:secondrow}ExistingData:CassandraRow{key:3,value:thirdrow}//..5/11/2611:40:27INFOTaskSchelerImpl:RemovedTaskSet3.0,whosetaskshaveallcompleted,frompool15/11/2611:40:27INFODAGScheler:ResultStage3(collectatCassandraTest.scala:41)finishedin0.032s15/11/2611:40:27INFODAGScheler:Job3finished:collectatCassandraTest.scala:41,took0.046502sNewData:(4,fourthrow)NewData:(5,fifthrow)Workcompleted,stoppingtheSparkcontext.cassandra中的數據cqlsh:test>select*fromkey_value;key|value-----+------------5|fifthrow1|firstrow2|secondrow4|fourthrow3|thirdrow(5rows)到此位置,還算順利,除了assembly重復文件的問題,都還算ok。

熱點內容
收到假eth幣 發布:2025-10-20 08:58:16 瀏覽:973
暗黑破壞神2eth打孔 發布:2025-10-20 08:42:58 瀏覽:105
BTC和CBT是一樣的嗎 發布:2025-10-20 08:42:57 瀏覽:233
華碩trx40Pro供電 發布:2025-10-20 08:33:26 瀏覽:432
曬人民幣編號的朋友圈 發布:2025-10-20 08:25:32 瀏覽:687
doge格式 發布:2025-10-20 08:02:00 瀏覽:382
以太坊會爆發嗎 發布:2025-10-20 08:01:59 瀏覽:772
一台比特幣礦機的功率 發布:2025-10-20 07:39:24 瀏覽:925
trx輔助帶 發布:2025-10-20 07:35:29 瀏覽:48
比特幣哈希值有多少位 發布:2025-10-20 07:31:20 瀏覽:633