這一段,主要是 Spark 的基本概念,以及Anaconda的基本組成。
了解Spark
Hadoop 随着資料的增長水準擴充,可以運作在普通的硬體上, 是以是低成本的. 資料密集型應用利用可擴充的分布處理架構在大規模商業叢集上分析PB級的資料. Hadoop 是第一個map-reduce的開源實作. Hadoop 依賴的分布式存儲架構叫做 HDFS(Hadoop Distributed File System). Hadoop 在批進行中運作map-reduce任務.Hadoop 要求在每個 map, shuffle,和reduce 處理步驟中将資料持久化到硬碟. 這些批處理工作的過載和延遲明顯地影響了性能.
Spark 是一個面向大規模資料處理的快速、分布式、通用的分析計算引擎. 主要不同于Hadoop的特點在于Spark 通過資料管道的記憶體處理允許不同階段共享資料. Spark 的獨特之處在于允許四種不同的資料分析和處理風格. Spark能夠用在:
- Batch: 該模式用于處理大資料集典型的是執行大規模map-reduce 任務。
- Streaming: 該模式用于近限處理流入的資訊。
- Iterative: 這種模式是機器學習算法,如梯度下降的資料通路重複以達到資料收斂。
- Interactive: 這種模式用于資料探索,有用大資料塊位于記憶體中,是以Spark的響應時間非常快。
下圖描述了資料處理的4種方式:
Spark 有三種部署方式: 單機單節點和兩種分布式叢集方式Yarn(Hadoop 的分布式資料總管)或者Mesos(Berkeley 開發的開源資料總管,同時可用于Spark):
Spark 提供了一個Scala, Java, Python, and R的多語言接口.
Spark libraries
Spark 時一個完整的解決方案, 有很多強大的庫:
- SparkSQL: 提供 類SQL 的能力 來通路結構化資料,并互動性地探索大資料集
- SparkMLLIB: 用于機器學習的大量算法和一個管道架構
- Spark Streaming: 使用微型批處理和滑動視窗對進入的流資料T實作近限分析
- Spark GraphX: 對于複雜連接配接的屍體和關系提供圖處理和計算
PySpark實戰
Spark是使用Scala實作的,整個Spark生态系統既充分利用了JVM環境也充分利用了原生的HDFS. Hadoop HDFS是Spark支援的衆多資料存儲之一。 Spark與其互相作用多資料源、類型和格式無關.
PySpark 不是Spark的一個Python轉寫,如同Jython 相對于Java。PySpark 提供了綁定Spark的內建 API,能夠在所有的叢集節點中通過pickle序列化充分使用Python 生态系統,更重要的是, 能夠通路由Python機器學習庫形成的豐富的生态系統,如Scikit-Learn 或者象Pandas那樣的資料處理。
當我們着有一個Spark 程式的時候, 程式第一件必需要做的事情是建立一個SparkContext 對象,來告訴Spark如何防蚊雞群。Python程式會建立PySparkContext。Py4J 是一個網關将Spark JVM SparkContex于python程式綁定。應用代碼JVM SparkContextserializes
和閉包把他們發送給叢集執行.
叢集管理器配置設定資源,排程,運送這些閉包給叢集上的 Spark workers,這需要激活 Python 虛拟機. 在每一台機器上, 管理 Spark Worker 執行器負責控制,計算,存儲和緩存.
這個例子展示了 Spark driver 在本地檔案系統上如何管理PySpark context 和Spark context以及如何通過叢集管理器與 Spark worker完成互動。
彈性分布資料集(RDS,Resilient Distributed Dataset)
Spark 應用包含了一個驅動程式來運作使用者的主函數,在叢集上建立分布式資料集, 并在這些資料集上執行各種并行操作 (轉換和動作 )。 Spark 應用運作在獨立的程序集合, 與一個驅動程式中的一個 SparkContext 協調工作。SparkContext 将從叢集管理器中配置設定系統資源 (主機, 記憶體, CPU)。
SparkContext管理執行器,執行器來管理叢集上的多個worker .驅動程式中有需要運作的Spark 工作。這些工作被分拆成多個任務,送出給執行器來完成。執行器負責每台機器的計算,存儲和緩存。Spark 中的核心建構塊是 RDD (Resilient Distributed Dataset). 一個已選元素的資料集。分布意味着資料集可以位于叢集的任何節點。彈性意味着資料集在不傷害資料計算程序的條件下可以全部或部分丢失,spark 将重新計算記憶體中的資料關系,例如操作 DAG (Directed Acyclic Graph) 基本上,Spark 将RDD的一個狀态的記憶體快照放入緩存。如果一台計算機在操作中挂了, Spark 将從緩存的RDD中重建并操作DAG,進而使RDD從節點故障中恢複。
這裡有兩類的RDD 操作:
• Transformations: 資料轉換使用現存的RDD,并生産一個新轉換後的RDD指針。一個RDD是不可變的,一旦建立,不能更改。 每次轉換生成新的RDD. 資料轉換的延遲計算的,隻有當一個動作發生時執行。如果發生故障,轉換的資料世系重建RDD
. • Actions: 動作是一個RDD觸發了Spark job,并纏上一個值。一個動作操作引發Spark 執行資料轉換操作,需要計算動作傳回的RDD。動作導緻操作的一個DAG。 DAG 被編譯到不同階段,每個階段執行一系列任務。 一個任務是基礎的工作單元。
這是關于RDD的有用資訊:
-
RDD 從一個資料源建立,例如一個HDFS檔案或一個資料庫查詢 .
有三種方法建立 RDD:
∞從資料存儲中讀取
∞ 從一個現存的RDD轉換
∞使用記憶體中的集合
- RDDs 的轉換函數有 map 或 filter, 它們生成一個新的RDD.
-
一個RDD上的一個動作包括 first, take, collect, 或count 将發送結果到Spark 驅動程式. Spark驅動程式是使用者與Spark叢集互動的用戶端。
下圖描述了RDD 資料轉換和動作:
了解 Anaconda
Anaconda 是由 Continuum(
https://www.continuum.io/)維護的被廣泛使用的Python分發包. 我們将使用 Anaconda 提供的流行的軟體棧來生成我們的應用. 本書中,使用 PySpark和PyData生态系統。PyData生态系統由Continuum維護,支援并更新,并提供 Anaconda Python 分發包。Anaconda Python分發包基本避免了python 環境的安裝過程惡化進而節約了時間;我們用它與Spark對接. Anaconda 有自己的包管理工具可以替代傳統的 pip install 和easy_install. Anaconda 也是完整的解決方案,包括一下有名的包如 Pandas, Scikit-Learn, Blaze, Matplotlib, and Bokeh. 通過一個簡單的指令久可以更新任何已經安裝的庫:
`$ conda update`
通過指令可以我們環境中已安裝庫的清單:
$ conda list
主要元件如下:
* Anaconda: 這是一個免費的Python分發包包含了科學,數學,工程和資料分析的200多個Python包
* Conda: 包管理器負責安裝複雜軟體棧的所有依賴,不僅限于 Python ,也可以管理R和其它語言的安裝程序。
* Numba: 通過共性能函數和及時編譯,提供了加速Python代碼的能力。
* Blaze: 通過統一和适配的接口來通路提供者的資料來實作大規模資料分析,包括Python 流處理, Pandas, SQLAlchemy, 和Spark.
* Bokeh: 為巨型流資料集提供了互動資料的可視化.
* Wakari: 允許我們在一個托管環境中分享和部署 IPython Notebooks和其它應用
下圖展示了 Anaconda 軟體棧中的部分元件: