《Spark快速大數據分析》——讀書筆記(1,2)

推薦序

帶來革命性改變的並非海量數據本身,而是我們如何利用這些數據。大數據解決方案的強大在於他們可以快速處理大規模、複雜的數據集,可以比傳統方法更快,更好的生成洞見。
大數據解決方案通常包含多個組件,但數據處理引擎之於大數據就像CPU之於計算機。
Spark允許用戶程序將數據加載到集羣內存中用於反覆查詢,非常適用於大數據和機器學習。

譯者序

如今,硬件產業的不斷髮展使得內存計算成爲了可能,Spark由此出現,迅速贏得青睞。
本書爲Spark初學者準備,沒有過多深入實現細節,而是更多關注上層用戶的具體用法。

前言

作爲MapReduce的繼承者,Spark主要由三個優點。
首先,Spark非常好用——高級的API。
其次,Spark很快,支持交互式使用和複雜算法。
最後,Spark是一個通用引擎,可用它來完成各種各樣的運算,如SQL查詢、文本處理、機器學習。

使用代碼示例

本書中所有的示例代碼都可以在GitHub 上找到。你可以從 https://github.com/databricks/learning-spark 中查看和檢出這些代碼。示例代碼包含Java、Scala 和Python 的版本。

第1章 Spark數據分析導論

本章從宏觀角度介紹Spark到底是什麼。

1.1 Spark是什麼

Spark是一個用來實現快速而通用的集羣計算的平臺。
在速度方面,Spark擴展了廣泛使用的MapReduce計算模型,而且高效地支持更多計算模式,包括交互式查詢和流處理。
總的來說,Spark適用於各種各樣原先需要多種不同分佈式平臺的場景,包括批處理、迭代算法、交互式查詢、流處理。通過在一個統一的框架下支持這些不同的計算,Spark使我們可以簡單而低耗地吧各種處理流程整合在一起。

1.2 一個大一統的軟件棧

Spark的核心是一個對由很多計算任務組成的、運行在多個工作及其或者是一個計算集羣上的應用進行調度、分發以及監控的計算引擎。由於Spark核心引擎速度快並且通用,所以還支持各種高級組件。

各組件間密切結合的設計原理的優點:
首先,軟件棧中所有的程序庫和高級組件都可以從下層的改進中獲益。
其次,運行整個軟件棧的代價變小了。
最後,我們能夠構建出無縫整合不同處理模型的應用。
這裏寫圖片描述

1.2.1 Spark Core

實現了Spark的基本功能,包含任務調度、內存管理、錯誤恢復、與存儲系統交互等模塊。
還包含了對彈性分佈式數據集(resilient distributed dataset, RDD)的API定義。RDD表示分佈在多個計算節點上可以並行操作的元素集合,是Spark主要的編程抽象。

1.2.2 Spark SQL

Spark SQL是Spark用來操作結構化數據的程序包。它爲Spark提供了一個SQL接口,還支持開發者將SQL和傳統的RDD編程的數據操作方式相結合,不論是使用Python,Java還是Scala,開發者都可以在單個的應用中同時使用SQL和複雜的數據分析。
(Spark SQL 取代了 Shark)

1.2.3 Spark Streaming

對實時數據進行流式計算的組件。擴展了Spark的RDD API。

1.2.4 MLlib

一個提供常見的機器學習功能的程序庫,包括分類、迴歸、聚類、協同過濾等,還提供了模型評估、數據導入等額外的支持功能。

1.2.5 GraphX

用來操作圖的程序庫,可進行並行的圖計算。擴展了Spark的RDD API。支持針對圖的各種操作,以及一些常用圖算法。

1.2.6 集羣管理器

Spark設計爲可以高效地在一個計算節點到數千個計算節點之間伸縮計算。Spark支持在各種集羣管理器上運行,包括HadoopYARN、Apache Mesos,以及Spark自帶的一個簡易調度器,叫做獨立調度器。

1.3 Spark的用戶和用途

數據科學家和工程師。
數據科學應用和數據處理應用。

1.3.1 數據科學任務

數據科學家是主要負責分析數據並建模的人。

1.3.2 數據處理應用

工程師是使用Spark開發生成環境中數據處理應用的軟件開發者。

1.4 Spark 簡史

Spark是於2009年作爲一個研究項目在加州大學伯克利分校RAD實驗室(AMPLab的前身)誕生。
2011年,AMPL啊暴露出基於Spark開發更高層的組件,比如Shark和Spark Streaming。這些組件和其他一些組件一起被稱爲伯克利數據分析工具棧。

1.5 Spark的版本和發佈

1.6 Spark的存儲層次

Spark不僅可以將任何Hadoop分佈式文件系統上的文件讀取爲分佈式數據集,也可以支持其他支持Hadoop接口的系統,比如本地文件,Hbase等。

第2章 Spark下載與入門

需要java 6以上或者Python 2.6以上(不支持Python 3)。

2.1 下載Spark

http://spark.apache.org/downloads.html
下載解壓。

2.2 Spark中Python和Scala的shell

和其他的shell不同(如Python、R、Scala提供的shell,操作系統的shell)不同,他們只能使用單機的硬盤和內存來操作數據,而Spark shell可用來與分佈式存儲在許多機器的內存或者硬盤上的數據進行交互,並且處理過程的分發有Spark自動控制完成。

bin\pyspark 進入PySpark。

此處出現了問題,原因在於spark雖然不需要安裝Hadoop,但是需要winutils.exe等文件,所以仍要安裝Hadoop。

例2-1:Python 行數統計

lines=sc.textFile("README.md")
lines.count()
lines.first()

這裏使用shell從本地文本文件創建一個RDD作一些即時統計。
退出任一shell,Ctrl-D。爲什麼我這裏不行?

2.3 Spark核心概念簡介

從上層來看,每個Spark應用都由一個驅動器程序(driver rogram)來發起集羣上的各種並行操作。驅動器程序包含應用的main函數,並且定義了集羣上的分佈式數據集,還對這些分佈式數據集應用了相關操作。
驅動器程序通過一個SparkContext對象來訪問Spark。這個對象代表對計算集羣的一個連接。shell啓動時已經自動創建了一個SparkContext對象,是一個叫做sc的變量。sparkcontext對象可以創建RDD,並進行各種操作,而執行這些操作,驅動器程序一般要管理多個執行器節點。這裏寫圖片描述
最後,我們有很多用來傳遞函數的API,可以將對應操作運行在集羣上。

例2-4:Python版本篩選的例子

lines=sc.textFile("README.md")
pythonLines=lines.filter(lambda line: "Python" in line)
pythonLines.first()

lambda可以理解爲Python中定義內聯函數的簡寫方法。

2.4 獨立應用

在獨立程序中使用Spark,與shell中的區別在於需要自行初始化SparkContext。
連接Spark:
Java和Scala中,只需給應用添加一個對於spark-core工件的Maven依賴。
Python中,可以把應用寫成Python腳本,但是需要使用Spark自帶的bin\spark-submit腳本來 運行。

2.4.1 初始化SparkContext

連接Spark後,需要在程序中導入Spark包並創建SparkContext。可以先創建一個SparkConf對象來配置應用,然後基於這個SparkConf創建一個SparkContext對象。

例2-7:在Python中初始化Spark

from pyspark import SparkConf,SparkContext
conf=SparkConf().setMaster("local").setAppName("My App")
sc=SparkContext(conf=conf)

創建SparkContext只需要傳遞兩個參數:
集羣URL:告訴Spark如何連接到集羣上,例中使用的是local。
應用名:當連接到一個集羣時,這個值可以幫助你在集羣管理器的用戶界面找到應用。

2.4.2 構建獨立應用

用sbt以及Maven來構建並打包一個簡單的單詞數統計的例程。
書上的例程中編譯不通過(可能是因爲spark版本問題),問題出在call的返回類型與FlatMapFunction的不同。修改過的例程如下:

SparkConf conf = new SparkConf().setAppName("wordCount");
        JavaSparkContext sc = new JavaSparkContext(conf);
        // Load our input data.
        JavaRDD<String> input = sc.textFile(inputFile);
        // Split up into words.
//參考了https://stackoverflow.com/questions/38880956/spark-2-0-0-arrays-aslist-not-working-incompatible-types/38881118#38881118
        JavaRDD<String> words = input.flatMap(line -> Arrays.asList(line.split(" ")).iterator());
//      JavaRDD<String> words = input.flatMap(new FlatMapFunction<String, String>() {
//          public Iterable<String> call(String x) {
//              return Arrays.asList(x.split(" "));
//          }
//      });
        // Transform into word and count.
        JavaPairRDD<String, Integer> counts = words.mapToPair(new PairFunction<String, String, Integer>() {
            public Tuple2<String, Integer> call(String x) {
                return new Tuple2(x, 1);
            }
        }).reduceByKey(new Function2<Integer, Integer, Integer>() {
            public Integer call(Integer x, Integer y) {
                return x + y;
            }
        });
        // Save the word count back out to a text file, causing evaluation.
        counts.saveAsTextFile(outputFile);

運行時出現錯誤:org.apache.spark.SparkException: A master URL must be set in your configuration
由於沒有配置master URL,解決方案是在HelloSpark右鍵–Run As–Run Configurations…–Arguments–VM Arguments 框中配置:
-Dspark.master=local

2.5 總結

本章介紹下載並單機運行Spark,以及Spark的使用方式,包括交互式方式和通過一個獨立應用進行調用。並簡單介紹了Spark編程的核心概念:通過一個驅動器程序創建一個SparkContext和一系列RDD,然後進行並行操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章