本文主要介紹快速使用Spark的方法。首先通過Spark的交互式shell介紹相關的API,然後介紹如何使用Java、Scala和Python編寫應用程序。
開始介紹之前需要從Spark website下載一個發行包。雖然我們不使用HDFS,但是可以下載任何版本的Hadoop包。
基於Spark Shell的交互式分析
Spark's shell 除了是一個強大的交互式分析數據的工具,也提供了相關API的簡單學習方式。Scala和Python都支持它。在Spark安裝路徑下運行./bin/pyspark
Spark主要概念是一個叫做彈性的分佈式數據集合-RDDs。RDDS能夠通過Hadoop InputFormats或者其它RDDs來創建。下面代碼是通過在Spark安裝路徑下的README文件創建一個新的RDD:
>>> textFile = sc.textFile("README.md")
RDDs有actions和transformations兩種操作,actions返回值,transformations返回一個指向新RDDs的指針,下面的代碼是用來統計textFile的單詞數和顯示第一個元素:
>>> textFile.count()
126
>>> textFile.first()
u"#Apache Spark"
filter是transformation的一種,它可以返回一個新的由文件元素子集合組成的RDD
>>> linesWithSpark = textFile.filter(lambda line: "Spark" in line)
我們可以將以上的動作合併到一行代碼中
>>> textFile.filter(lambda line: "Spark" in line).count()
15
更多的RDD操作
RDD actions和transformations能夠用於更復雜的計算中,下面的代碼用來找出最多單詞的函數
>>> textFile.map(lambda line: len(line.split())).reduce(lambda a, b: a if (a > b) else b)
15
第一個map創建一個元素爲整數的RDD,然後該RDD調用reduce找出最大的數。
MapReduce是一個一般的數據流模式,就像流行的Hadoop那樣,Spark能夠獨立的簡單的完成MapReduce流
>>> wordCounts = textFile.flatMap(lambda line: line.split()).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a+b)
Caching
Spark支持將數據集合放入內存中緩存. 該功能有利於頻繁的訪問數據。
>>> linesWithSpark.cache()
>>> linesWithSpark.count()
19
獨立的應用程序
通過Spark的API我們能編寫獨立的應用程序,並且運行在Scala、Java和Python的環境中。
下面是Python的一個簡單的應用程序:
"""SimpleApp.py"""
from pyspark import SparkContext
logFile = "YOUR_SPARK_HOME/README.md" # Should be some file on your system
sc = SparkContext("local", "Simple App")
logData = sc.textFile(logFile).cache()
numAs = logData.filter(lambda s: 'a' in s).count()
numBs = logData.filter(lambda s: 'b' in s).count()
print("Lines with a: %i, lines with b: %i" % (numAs, numBs))
# Use spark-submit to run your application
$ YOUR_SPARK_HOME/bin/spark-submit \
--master local[4] \
SimpleApp.py
...
Lines with a: 46, Lines with b: 23