共計(jì) 2761 個(gè)字符,預(yù)計(jì)需要花費(fèi) 7 分鐘才能閱讀完成。
本篇內(nèi)容介紹了“Spark2.1.0 怎么用”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓丸趣 TV 小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
運(yùn)行 spark-shell
在《Spark2.1.0 之運(yùn)行環(huán)境準(zhǔn)備》一文曾經(jīng)簡(jiǎn)單運(yùn)行了 spark-shell,并用下圖進(jìn)行了展示(此處再次展示此圖)。
圖 1 執(zhí)行 spark-shell 進(jìn)入 Scala 命令行
圖 1 中顯示了很多信息,這里進(jìn)行一些說明:
在安裝完 Spark 2.1.0 后,如果沒有明確指定 log4j 的配置,那么 Spark 會(huì)使用 core 模塊的 org/apache/spark/ 目錄下的 log4j-defaults.properties 作為 log4j 的默認(rèn)配置。log4j-defaults.properties 指定的 Spark 日志級(jí)別為 WARN。用戶可以到 Spark 安裝目錄的 conf 文件夾下從 log4j.properties.template 復(fù)制一份 log4j.properties 文件,并在其中增加自己想要的配置。
除了指定 log4j.properties 文件外,還可以在 spark-shell 命令行中通過 sc.setLogLevel(newLevel) 語句指定日志級(jí)別。
SparkContext 的 Web UI 的地址是:http://192.168.0.106:4040。192.168.0.106 是筆者安裝 Spark 的機(jī)器的 ip 地址,4040 是 SparkContext 的 Web UI 的默認(rèn)監(jiān)聽端口。
指定的部署模式(即 master)為 local[*]。當(dāng)前應(yīng)用(Application)的 ID 為 local-1497084620457。
可以在 spark-shell 命令行通過 sc 使用 SparkContext,通過 spark 使用 SparkSession。sc 和 spark 實(shí)際分別是 SparkContext 和 SparkSession 在 Spark REPL 中的變量名,具體細(xì)節(jié)已在《Spark2.1.0 之剖析 spark-shell》一文有過分析。
由于 Spark core 的默認(rèn)日志級(jí)別是 WARN,所以看到的信息不是很多。現(xiàn)在我們將 Spark 安裝目錄的 conf 文件夾下的 log4j.properties.template 以如下命令復(fù)制出一份:
cp log4j.properties.template log4j.properties
cp log4j.properties.template log4j.properties
并將 log4j.properties 中的 log4j.logger.org.apache.spark.repl.Main=WARN 修改為 log4j.logger.org.apache.spark.repl.Main=INFO,然后我們?cè)俅芜\(yùn)行 spark-shell,將打印出更豐富的信息,如圖 2 所示。
圖 2 Spark 啟動(dòng)過程打印的部分信息
從圖 2 展示的啟動(dòng)日志中我們可以看到 SecurityManager、SparkEnv、BlockManagerMasterEndpoint、DiskBlockManager、MemoryStore、SparkUI、Executor、NettyBlockTransferService、BlockManager、BlockManagerMaster 等信息。它們是做什么的?剛剛接觸 Spark 的讀者只需要知道這些信息即可,具體內(nèi)容將在后邊的博文給出。
執(zhí)行 word count
這一節(jié),我們通過 word count 這個(gè)耳熟能詳?shù)睦觼砀惺芟?Spark 任務(wù)的執(zhí)行過程。啟動(dòng) spark-shell 后,會(huì)打開 Scala 命令行,然后按照以下步驟輸入腳本:
步驟 1
輸入 val lines =sc.textFile(../README.md , 2),以 Spark 安裝目錄下的 README.md 文件的內(nèi)容作為 word count 例子的數(shù)據(jù)源,執(zhí)行結(jié)果如圖 3 所示。
圖 3 步驟 1 執(zhí)行結(jié)果
圖 3 告訴我們 lines 的實(shí)際類型是 MapPartitionsRDD。
步驟 2
textFile 方法對(duì)文本文件是逐行讀取的,我們需要輸入 val words =lines.flatMap(line = line.split()),將每行文本按照空格分隔以得到每個(gè)單詞,執(zhí)行結(jié)果如圖 4 所示。
圖 4 步驟 2 執(zhí)行結(jié)果
圖 4 告訴我們 lines 在經(jīng)過 flatMap 方法的轉(zhuǎn)換后得到的 words 的實(shí)際類型也是 MapPartitionsRDD。
步驟 3
對(duì)于得到的每個(gè)單詞,通過輸入 val ones = words.map(w = (w,1)),將每個(gè)單詞的計(jì)數(shù)初始化為 1,執(zhí)行結(jié)果如圖 5 所示。
圖 5 步驟 3 執(zhí)行結(jié)果
圖 5 告訴我們 words 在經(jīng)過 map 方法的轉(zhuǎn)換后得到的 ones 的實(shí)際類型也是 MapPartitionsRDD。
步驟 4
輸入 val counts = ones.reduceByKey(_ + _),對(duì)單詞進(jìn)行計(jì)數(shù)值的聚合,執(zhí)行結(jié)果如圖 6 所示。
圖 6 步驟 4 執(zhí)行結(jié)果
圖 6 告訴我們 ones 在經(jīng)過 reduceByKey 方法的轉(zhuǎn)換后得到的 counts 的實(shí)際類型是 ShuffledRDD。
步驟 5
輸入 counts.foreach(println),將每個(gè)單詞的計(jì)數(shù)值打印出來,作業(yè)的執(zhí)行過程如圖 7 和圖 8 所示。作業(yè)的輸出結(jié)果如圖 9 所示。
圖 7 步驟 5 執(zhí)行過程第一部分
圖 8 步驟 5 執(zhí)行過程第二部分
圖 7 和圖 8 展示了很多作業(yè)提交、執(zhí)行的信息,這里挑選關(guān)鍵的內(nèi)容進(jìn)行介紹:
SparkContext 為提交的 Job 生成的 ID 是 0。
一共有四個(gè) RDD,被劃分為 ResultStage 和 ShuffleMapStage。ShuffleMapStage 的 ID 為 0,嘗試號(hào)為 0。ResultStage 的 ID 為 1,嘗試號(hào)也為 0。在 Spark 中,如果 Stage 沒有執(zhí)行完成,就會(huì)進(jìn)行多次重試。Stage 無論是首次執(zhí)行還是重試都被視為是一次 Stage 嘗試(Stage Attempt),每次 Attempt 都有一個(gè)唯一的嘗試號(hào)(AttemptNumber)。
由于 Job 有兩個(gè)分區(qū),所以 ShuffleMapStage 和 ResultStage 都有兩個(gè) Task 被提交。每個(gè) Task 也會(huì)有多次嘗試,因而也有屬于 Task 的嘗試號(hào)。從圖中看出 ShuffleMapStage 中的兩個(gè) Task 和 ResultStage 中的兩個(gè) Task 的嘗試號(hào)也都是 0。
HadoopRDD 則用于讀取文件內(nèi)容。
圖 9 步驟 5 輸出結(jié)果
圖 9 展示了單詞計(jì)數(shù)的輸出結(jié)果和最后打印的任務(wù)結(jié)束的日志信息。
“Spark2.1.0 怎么用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編將為大家輸出更多高質(zhì)量的實(shí)用文章!