使用Spark和Cassandra進行資料處理(一)
最近在研究將Spark架設到Cassandra之上。發現這方面的資訊比較少,在學習的過程中也遇到了不少問題,因此在此記錄下,也和大家分享。此例為最經典的WordCount示例。
首先我先說下我所使用的各種環境和版本。由於Spark和Cassandra更新較快,如果之後版本有異可能執行不能成功需要一些微調。
暫時使用的是Windows 7, 之後會轉到Linux平臺,但是這個影響不大。使用的是Scala2.9.3,Spark 0.8, Cassandra 1.2.10,sbt 0.13.0,Java 7。
首先需要我們自己生成下Spark的jar包。這個需要我們執行sbt命令來得到。轉到Spark所在的目錄然後執行
sbtsbt assembly(如果是Linux的話,應該是sbt/sbt assembly)。執行結束後,可以在sparkassembly argetscala-2.9.3下面發現一個名字類似於spark-assembly-0.8.0-*.jar的包。我們需要將這個包加入到編譯路徑中。
其次我們需要在Cassandra中插入一些資料。首先需要在命令列中執行cassandra/bin下面的cassandra命令來開啟服務。然後執行cassandra-cli,這樣我們就能夠輸入我們需要的資料。本文結尾可以找到此例使用的資料示例。
然後我們就可以開始了。
-
val
sc = new SparkContext("local[3]", "casDemo") <wbr><wbr><wbr><wbr><wbr><wbr><wbr>
-
val
job = new Job() <wbr><wbr><wbr><wbr><wbr><wbr>
-
job.setInputFormatClass(classOf[ColumnFamilyInputFormat])
<wbr><wbr>
-
ConfigHelper.setInputInitialAddress(job.getConfiguration(),
"localhost") <wbr><wbr><wbr> -
ConfigHelper.setInputRpcPort(job.getConfiguration(),
"9160") <wbr><wbr><wbr> -
ConfigHelper.setInputColumnFamily(job.getConfiguration(),
"casDemo", "Words") <wbr><wbr><wbr><wbr> -
ConfigHelper.setInputPartitioner(job.getConfiguration(),
"Murmur3Partitioner") <wbr><wbr><wbr>
通過Cassandra提供的靜態類ConfigHelper來設定相對應的一些引數。“casDemo"是這個例子使用的keyspace,words是column family。9160是Cassandra預設使用的埠。最後一個是設定多臺機器執行時使用的Partitioner hash演算法。有三個值可以選擇,分別是org.apache.cassandra.dht.Murmur3Partitioner,org.apache.cassandra.dht.RandomPartitioner和ByteOrderedPartitioner。第三個已經不推薦使用了。在這裡我們使用第一個。
此外需要說明的是,還有其他引數可以設定比如slice predicate之類的,這裡略過了,僅僅介紹了最簡單的設定。
然後我們就能夠去建立Spark獨有的RDD物件了,並使用它來完成我們要的工作。
-
val
casRdd = sc.newAPIHadoopRDD(job.getConfiguration(), <wbr><wbr><wbr><wbr><wbr> -
classOf[ColumnFamilyInputFormat], <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> -
classOf[ByteBuffer],//key <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> -
classOf[SortedMap[ByteBuffer, IColumn]]) //value <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>
-
val
paraRdd = casRdd flatMap { <wbr><wbr><wbr><wbr><wbr><wbr><wbr> -
case (key, value) => { <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> -
value.filter(v => { <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> -
ByteBufferUtil.string(v._1).compareTo("paragraph") == 0 <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> -
}).map(v => ByteBufferUtil.string(v._2.value())) <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> -
} <wbr><wbr><wbr><wbr><wbr><wbr> -
}
<wbr><wbr>
這裡就是執行mapper方法了,就和hadoop中的mapper一個概念。需要說明的是,這裡的key就是一個ByteBuffer物件,value就是一個SortedMap[ByteBuffer, IColumn],有沒有覺得很熟悉,是的,這兩個就是之前建立RDD設定的最後兩個引數。這裡我做的就是過濾掉colomn name不等於paragraph的,然後將colomn是paragraph的值由Icolumn變成ByteBuffer型別。
-
val
counts = paraRdd.flatMap(p => p.split(" "<wbr> )).map(word=> (word, 1)).reduceByKey(_ + _) <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>
最後就是reduce方法了。 先用空格將段落打散成單詞,然後將單個單詞word轉化成元組(word, 1)。最後統計每個word出現次數。
這樣我們就完成了簡單的WordCount方法。
我們可以通過以下程式碼列印出結果來觀看。
-
counts.collect()
foreach { <wbr><wbr><wbr><wbr> -
case (word, count) => println(word + ":" + count) <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> -
}
<wbr><wbr>
這裡介紹了通過Spark讀取Cassandra資料並進行處理。下一節,會介紹寫入資料。
此文與http://cjcrobin.iteye.com/blog/1955984同步.可以在上面下載到此例原始碼。
相關文章
- spark處理json資料DemoSparkJSON
- 如何對大資料進行分析和處理?_光點科技大資料
- 使用Cassandra進行.Net程式設計NY程式設計
- 關於使用sklearn進行資料預處理 —— 歸一化/標準化/正則化
- 資料清洗和資料處理
- Calcite 使用原生的RDD 處理SparkSpark
- .NET使用MailKit進行郵件處理AI
- Spark大資料處理框架入門(單機版)Spark大資料框架
- 系統中資料顯示進行脫敏處理
- (一)如何使用 Parsel 和 XPath 進行網頁資料提取網頁
- 資料演算法 Hadoop/Spark大資料處理---第十六章演算法HadoopSpark大資料
- 使用openpyxl處理表格資料
- 使用Excel高效處理資料Excel
- 對pandas進行資料預處理的例項講解
- 商業智慧如何幫助企業進行資料處理?
- Spark在處理資料的時候,會將資料都載入到記憶體再做處理嗎?Spark記憶體
- 使用Storm、Kafka和ElasticSearch處理實時資料 -javacodegeeksORMKafkaElasticsearchJava
- Spark Streaming 流式處理Spark
- 資料演算法 Hadoop/Spark大資料處理---第十二章演算法HadoopSpark大資料
- Python資料處理(一):處理 JSON、XML、CSV 三種格式資料PythonJSONXML
- Python資料預處理:Dask和Numba並行化加速!Python並行
- 使用matlab對影像進行二值化處理Matlab
- 使用python進行簡單的媒體處理Python
- Cassandra 資料模型模型
- Python使用xlrd處理excel資料PythonExcel
- 資料預處理和特徵工程特徵工程
- Python資料處理(二):處理 Excel 資料PythonExcel
- 企業如何遵守資料安全法規進行SAP資料脫敏處理?
- Python 資料處理庫 pandas 進階教程Python
- Apache SeaTunnel資料處理引擎適配的演進和規劃Apache
- 使用spark-sql處理Doris大表關聯SparkSQL
- 使用Python進行Web爬取和資料提取PythonWeb
- 使用Redis和Java進行資料庫快取RedisJava資料庫快取
- 使用Java和Flyway進行資料庫版本控制Java資料庫
- 多對一處理 和一對多處理的處理
- C#使用執行緒安全佇列ConcurrentQueue處理資料C#執行緒佇列
- 使用Spring Boot + Redis 進行實時流處理 - vinsguruSpring BootRedis
- 使用aop來監控方法進行增強處理
- 使用 Vyper 和 Python 進行自動化登入並處理驗證碼Python