標籤:而不是 處理 i++ view tle 多行 param word ram
在hadoop、zookeeper、hbase、spark叢集環境搭建 中已經把環境搭建好了,工欲善其事必先利其器,現在器已經有了,接下來就要開搞了,先從spark-shell開始揭開Spark的神器面紗。
spark-shell是Spark的命令列介面,我們可以在上面直接敲一些命令,就像windows的cmd一樣,進入Spark安裝目錄,執行以下命令開啟spark-shell:
bin/spark-shell --master spark://hxf:7077 --executor-memory 1024m --driver-memory 1024m --total-executor-cores 4
executor-memory是slave的記憶體,driver-memory是master的記憶體,total-executor-cores是所有的核心數
終端顯示如,可以看到spark-shell已經幫我們初始化了兩個變數sc、spark,sc是Spark context,spark是Spark session,沒吃過豬肉見過豬跑,像這些包含context啊session啊不用想就很重要,同樣Spark的執行就是靠這倆變數,目前先混個眼熟,日後再說
Spark管理頁面顯示如:
OK,現在我們開始動手敲第一個例子,統計Spark目錄下 README.md 這個檔案中各個單詞出現的次數:
首先給出完整的代碼,方便大家有一個整體的思路:
val textFile = sc.textFile("file:/data/install/spark-2.0.0-bin-hadoop2.7/README.md")val wordCounts = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)wordCounts.collect()
代碼很簡單,但是第一次見到可能不是很理解,下面進行講解
1. Spark讀取未經處理資料的方式
首先讀取 README.md:
val textFile = sc.textFile("README.md")
這條代碼是讀取未經處理資料轉化為Spark自己的資料格式RDD,一般讀取未經處理資料有兩種方式
1、測試用法:調用SparkContext的parallelize方法
val rdd = sc.parallelize(Array(1 to 10))
這樣就擷取到了1到10的數組,多用於測試程式,正式開發不用這種
2、正式用法:所有Hadoop可以使用的資料來源Spark都可以使用,當然我們最常用的還是SparkContext的textFile方法,如讀取Hdfs上的檔案:
val rdd = sc.parallelize("hadoop://hxf:9000/test/test.log")
2. Spark的基礎資料類型RDD
上面通過textFile得到的結果叫做RDD,是Spark的基礎資料類型。
RDD是Resillient Distributed Dataset的簡稱,意思是彈性分布式資料集,這個名字不是太好理解,但是我們可以從字面上瞭解到RDD是分布式的、並且是資料集合,假設分布式系統下有多個檔案,這些檔案有很多行,RDD指的是所有這些檔案所有行的集合,而不是單獨某一行。所以我們對RDD進行的一系列操作都是對整個集合進行的操作,並且Spark是將整個RDD放在記憶體中進行處理,而不是像MapReduce那樣放在磁碟中,所以Spark的運算速度才會比MapReduce快。
接下來繼續講解代碼:
val wordCounts = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)wordCounts.collect()
最後的結果顯示各個單詞出現的次數,代碼中的flatMap、map、reduceByKey是RDD的轉化操作,collect是RDD的行動操作,不理解沒關係,後文詳解。這一節先暫時講到這裡,欲聽後事如何,請聽下回分解。
Learning Spark——使用spark-shell運行Word Count