1. 程式人生 > >spark學習隨筆(一)

spark學習隨筆(一)

Spark 是什麼

Spark 是一個平臺。這個平臺用來實現快速而通用的叢集計算。

在速度方面,Spark 擴充套件了廣泛使用的 MapReduce 計算模型,而且高效地支援更多計算模
式,包括互動式查詢和流處理。在處理大規模資料集時,速度是非常重要的。速度快就意
味著我們可以進行互動式的資料操作,否則我們每次操作就需要等待數分鐘甚至數小時。
Spark 的一個主要特點就是能夠在記憶體中進行計算,因而更快。不過即使是必須在磁碟上
進行的複雜計算,Spark 依然比 MapReduce 更加高效

Spark 的核心是一個計算引擎。這個引擎對應用進行排程、分發以及監控。這些應用由很多計算任務組成、執行在多個工作機器或者是一個計算叢集上。

Spark 的各個元件:
在這裡插入圖片描述

Spark Core 實現了 Spark 的基本功能。包含任務排程、記憶體管理、錯誤恢復、與儲存系統互動等模組。Spark Core 中還包含了對彈性分散式資料集(resilient distributed dataset,簡稱 RDD)的 API 定義。
RDD 表示分佈在多個計算節點上,可以並行操作,的元素集合,是Spark 主要的程式設計抽象。Spark Core 提供了建立和操作這些集合的多個 API。

通過 Spark SQL,我們可以使用 SQL或者 Apache Hive 版本的 SQL 方言(HQL)來查詢資料。

生產環境中的網頁伺服器日誌,或是網路服務中使用者提交的狀態更新組成的訊息佇列,都是資料流。Spark Streaming

提供了用來操作資料流的 API,並且與 Spark Core 中的 RDD API 高度對應。

MLlib 提供了很多種機器學習演算法,包括分類、迴歸、聚類、協同過濾等,還提供了模型評估、資料匯入等額外的支援功能。

***GraphX***實現針對圖的各種操作。

Spark 不僅可以將任何 Hadoop 分散式檔案系統(HDFS)上的檔案讀取為分散式資料集,也可以支援其他支援 Hadoop 介面的系統,比如本地檔案、亞馬遜 S3、Cassandra、Hive、HBase 等。我們需要弄清楚是,Hadoop 並非 Spark 的必要條件,Spark 支援任何實現了 Hadoop 介面的儲存系統。
Spark 支援的 Hadoop 輸入格式包括文字檔案、SequenceFile、Avro、Parquet 等。

Spark 可以執行在許多種模式下,除了本地模式,還支援執行在Mesos 或 YARN 上,也可以執行在 Spark 發行版自帶的獨立排程器上。

Spark shell

下載安裝包,解壓縮
快速入門指南

Spark 帶有互動式的 shell,可以作即時資料分析。和其他 shell 工具不一樣的是,在其他 shell 工具中你只能使用單機的硬碟和記憶體來操作資料,而 Spark shell 可用來與分散式儲存在許多機器的記憶體或者硬碟上的資料進行互動,並且處理過程的分發由 Spark 自動控制完成。

開啟shell:
bin/pyspark : python版本的shell
bin/spark-shell : Scala版本的shell

shell 互動介面訊息很多。通過管理日誌來設定warning 訊息的顯示。
在 conf 目錄下建立一個名為 log4j.properties 的檔案來管理日誌設定。

將log4j.properties.template檔案複製一份到 conf/log4j.properties 來作為日誌設定檔案,
修改檔案中:
log4j.rootCategory=INFO, console
為
log4j.rootCategory=WARN, console
這時再開啟 shell,你就會看到輸出大大減少。

---------------------若需要使用ipython來互動--------------------------
安裝IPYTHON
IPYTHON=1 ./bin/pyspark
要使用 IPython Notebook,也就是 Web 版的 IPython,可以執行:
IPYTHON_OPTS=“notebook” ./bin/pyspark


要退出任一 shell,按 Ctrl-D

Spark 執行方式

每個 Spark 應用都由一個驅動器程式(driver program)來發起叢集上的各種並行操作。
比如開啟一個shell,此時shell就相當於一個driver program。驅動器程式一般要管理多個執行器(executor)節點,這些節點執行運算。
驅動器程式通過一個 SparkContext 物件來訪問 Spark。
在這裡插入圖片描述一旦有了 SparkContext,你就可以用它來建立 一系列RDD。
會有很多用來傳遞函式的 API,可以將對應操作執行在叢集上。

除了互動式執行之外,Spark 也可以在 Java、Scala 或 Python 的獨立程式中被連線使用。這與在 shell 中使用
的主要區別在於你需要自行初始化 SparkContext。接下來,使用的 API 就一樣了。

應用與spark連線

連線 Spark 的過程在各語言中並不一樣。在 Java 和 Scala 中,只需要給你的應用新增一個對於 spark-core 工件的 Maven 依賴。

在 Python 中, 你 可 以 把 應 用 寫 成 Python 腳 本, 但 是 需 要 使 用 Spark 自 帶 的 bin/spark-submit 指令碼來執行。 spark-submit 指令碼會幫我們引入 Python 程式的 Spark 依賴。這個指令碼為 Spark 的 PythonAPI 配置好了執行環境。

bin/spark-submit my_script.py

初始化 SparkContext

from pyspark import SparkConf, SparkContext

conf = SparkConf().setMaster("local").setAppName("My App")
sc = SparkContext(conf = conf)

至少傳遞兩個引數:
• 叢集 URL:告訴 Spark 如何連線到叢集上。 local 這個特殊值可以讓 Spark 執行在單機單執行緒上而無需連線到叢集。
• 應用名:如My App 。當連線到一個叢集時,這個值可以幫助你在叢集管理器的使用者介面中找到你的應用。