最近需要在Windows上配置python 開發(fā) Spark應(yīng)用走芋,在此做一個(gè)總結(jié)筆記谁榜。
Spark 簡(jiǎn)介
Spark的介紹及運(yùn)行環(huán)境要求逛薇,引自 Spark 官方文檔
Apache Spark is a fast and general-purpose cluster computing system. It provides high-level APIs in Java, Scala, Python and R, and an optimized engine that supports general execution graphs. It also supports a rich set of higher-level tools including Spark SQL for SQL and structured data processing, MLlib for machine learning, GraphX for graph processing, and Spark Streaming.
Spark runs on both Windows and UNIX-like systems (e.g. Linux, Mac OS). It’s easy to run locally on one machine — all you need is to have java installed on your systemPATH, or the JAVA_HOME environment variable pointing to a Java installation.
Spark runs on Java 7+, Python 2.6+/3.4+ and R 3.1+. For the Scala API, Spark 2.1.0 uses Scala 2.11. You will need to use a compatible Scala version (2.11.x).
下載Spark
從官方網(wǎng)站下載tar包 http://spark.apache.org/downloads.html
Spark 由 Scala語言開發(fā),而Scala也是運(yùn)行于JVM之上外里,因此也可以看作是跨平臺(tái)的怎爵,所以在下載 spark-2.1.0-bin-hadoop2.7.tgz 之后, 在Windows 平臺(tái)直接解壓即可盅蝗。
在Spark 的 sbin 目錄下鳖链,并沒有提供Spark作為 Master 啟動(dòng)腳本,所以在windows下风科,我們借助spark-shell, pyspark等方式啟動(dòng)并調(diào)用Spark撒轮。
配置環(huán)境變量
假設(shè) spark-2.1.0-bin-hadoop2.7.tgz 已被解壓至E:\Spark, 接下來需要配置環(huán)境變量。 對(duì)于python開發(fā)來說贼穆,有三個(gè)環(huán)境變量至關(guān)重要。 開始-> 計(jì)算機(jī)兰粉, 右鍵點(diǎn)擊 -> 屬性->高級(jí)系統(tǒng)設(shè)置->環(huán)境變量故痊,在系統(tǒng)環(huán)境變量中添加環(huán)境變量 SPARK_HOME和PYTHONPATH,并將Spark\bin加入到系統(tǒng)Path變量中玖姑。
SPARK_HOME=E:\Spark
Path=%SPARK_HOME%\bin;%Path%
PYTHONPATH=%SPARK_HOME%\Python;%SPARK_HOME%\Python\lib\py4j-0.10.4-src.zip
切記愕秫,如果在windows下已經(jīng)通過cmd打開命令窗口,則需要退出命令窗口再重新打開焰络,以上設(shè)置的環(huán)境變量才會(huì)生效戴甩。
Python Spark入門示例
在Spark的安裝包,提供了經(jīng)典的入門示例程序闪彼,通過這些示例程序演示了基本的Spark開發(fā)和API調(diào)用過程甜孤。
1. Word Count
統(tǒng)計(jì)文本中某一單詞的重復(fù)次數(shù),是在技術(shù)面試中畏腕,特別是考察編程能力經(jīng)常遇到的面試題缴川,網(wǎng)絡(luò)中也有各種語言的解題代碼。在Spark的示例中描馅,通過非常精悍的代碼展示了Spark的強(qiáng)大把夸。
from __future__ import print_function
import sys
from operator import add
# SparkSession:是一個(gè)對(duì)Spark的編程入口,取代了原本的SQLContext與HiveContext铭污,方便調(diào)用Dataset和DataFrame API
# SparkSession可用于創(chuàng)建DataFrame恋日,將DataFrame注冊(cè)為表膀篮,在表上執(zhí)行SQL,緩存表和讀取parquet文件岂膳。
from pyspark.sql import SparkSession
if __name__ == "__main__":
# Python 常用的簡(jiǎn)單參數(shù)傳入
if len(sys.argv) != 2:
print("Usage: wordcount <file>", file=sys.stderr)
exit(-1)
# appName 為 Spark 應(yīng)用設(shè)定一個(gè)應(yīng)用名各拷,改名會(huì)顯示在 Spark Web UI 上
# 假如SparkSession 已經(jīng)存在就取得已存在的SparkSession,否則創(chuàng)建一個(gè)新的闷营。
spark = SparkSession\
.builder\
.appName("PythonWordCount")\
.getOrCreate()
# 讀取傳入的文件內(nèi)容烤黍,并寫入一個(gè)新的RDD實(shí)例lines中,此條語句所做工作有些多傻盟,不適合初學(xué)者速蕊,可以截成兩條語句以便理解。
# map是一種轉(zhuǎn)換函數(shù)娘赴,將原來RDD的每個(gè)數(shù)據(jù)項(xiàng)通過map中的用戶自定義函數(shù)f映射轉(zhuǎn)變?yōu)橐粋€(gè)新的元素规哲。原始RDD中的數(shù)據(jù)項(xiàng)與新RDD中的數(shù)據(jù)項(xiàng)是一一對(duì)應(yīng)的關(guān)系。
lines = spark.read.text(sys.argv[1]).rdd.map(lambda r: r[0])
# flatMap與map類似诽表,但每個(gè)元素輸入項(xiàng)都可以被映射到0個(gè)或多個(gè)的輸出項(xiàng)唉锌,最終將結(jié)果”扁平化“后輸出
counts = lines.flatMap(lambda x: x.split(' ')) \
.map(lambda x: (x, 1)) \
.reduceByKey(add)
# collect() 在驅(qū)動(dòng)程序中將數(shù)據(jù)集的所有元素作為數(shù)組返回。 這在返回足夠小的數(shù)據(jù)子集的過濾器或其他操作之后通常是有用的竿奏。由于collect 是將整個(gè)RDD匯聚到一臺(tái)機(jī)子上袄简,所以通常需要預(yù)估返回?cái)?shù)據(jù)集的大小以免溢出。
output = counts.collect()
for (word, count) in output:
print("%s: %i" % (word, count))
spark.stop()
測(cè)試數(shù)據(jù), 可以拷貝下面的文字存入一個(gè)文本文件泛啸,比如a.txt
These examples give a quick overview of the Spark API. Spark is built on the concept of distributed datasets, which contain arbitrary Java or Python objects.
執(zhí)行測(cè)試結(jié)果
概念介紹
RDD:彈性分布式數(shù)據(jù)集绿语,是一種特殊集合 ? 支持多種來源 ? 有容錯(cuò)機(jī)制 ? 可以被緩存 ? 支持并行操作
RDD有兩種操作算子:
- Transformation(轉(zhuǎn)換):Transformation屬于延遲計(jì)算,當(dāng)一個(gè)RDD轉(zhuǎn)換成另一個(gè)RDD時(shí)并沒有立即進(jìn)行轉(zhuǎn)換候址,僅僅是記住了數(shù)據(jù)集的邏輯操作
- Ation(執(zhí)行):觸發(fā)Spark作業(yè)的運(yùn)行吕粹,真正觸發(fā)轉(zhuǎn)換算子的計(jì)算
常見執(zhí)行錯(cuò)誤
初次執(zhí)行Python Spark可能會(huì)遇到類似錯(cuò)誤提示
之所以有上面提示的內(nèi)容,主要包含兩部分配置問題
1. 日志輸出
Spark在執(zhí)行過程中岗仑,很多INFO日志消息都會(huì)打印到屏幕匹耕,方便執(zhí)行者獲得更多的內(nèi)部細(xì)節(jié)。開發(fā)者可以根據(jù)需要設(shè)置$SPARK_HOME/conf下的log4j荠雕。在 $SPARK_HOME/conf 下 已經(jīng)預(yù)先存放了一份模版log4j.properties.template文件稳其,開發(fā)者可以拷貝出一份 log4j.properties, 并設(shè)置成WARN
將log4j.properties.template 中的 INFO
# Set everything to be logged to the console
log4j.rootCategory=INFO, console
修改為 WARN, 存入log4j.properties
# Set everything to be logged to the console
log4j.rootCategory=WARN, console
2. Could not locate executable null\bin\winutils.exe
首先舞虱,下載 winutils.exe欢际,并保存至 c:\hadoop\bin
https://github.com/steveloughran/winutils/blob/master/hadoop-2.7.1/bin/winutils.exe
其次,設(shè)置HADOOP_HOME環(huán)境變量矾兜,指向 c:\hadoop, 并將HADOOP_HOME加到系統(tǒng)變量PATH中
set HADOOP_HOME=c:\hadoop
set PATH=%HADOOP_HOME%\bin;%PATH%
參考:
https://spark.apache.org/docs/preview/api/python/pyspark.sql.html
https://spark.apache.org/docs/latest/programming-guide.html#transformations