初識(shí)Windows下Python開發(fā)Spark

最近需要在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

Download Spark package.png

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é)果

wordcount.jpg

概念介紹

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ò)誤提示


python spark error.jpg

之所以有上面提示的內(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

https://jaceklaskowski.gitbooks.io/mastering-apache-spark/content/spark-tips-and-tricks-running-spark-windows.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末损趋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浑槽,老刑警劉巖蒋失,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異桐玻,居然都是意外死亡篙挽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門镊靴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铣卡,“玉大人,你說我怎么就攤上這事偏竟≈舐洌” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵踊谋,是天一觀的道長(zhǎng)蝉仇。 經(jīng)常有香客問我,道長(zhǎng)殖蚕,這世上最難降的妖魔是什么轿衔? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮睦疫,結(jié)果婚禮上害驹,老公的妹妹穿的比我還像新娘。我一直安慰自己笼痛,他們只是感情好裙秋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缨伊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪进宝。 梳的紋絲不亂的頭發(fā)上刻坊,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音党晋,去河邊找鬼谭胚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛玩祟,可吹牛的內(nèi)容都是我干的番宁。 我是一名探鬼主播傅事,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼旁趟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起庇绽,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤锡搜,失蹤者是張志新(化名)和其女友劉穎橙困,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耕餐,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凡傅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肠缔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夏跷。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖明未,靈堂內(nèi)的尸體忽然破棺而出槽华,到底是詐尸還是另有隱情,我是刑警寧澤亚隅,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布硼莽,位于F島的核電站,受9級(jí)特大地震影響煮纵,放射性物質(zhì)發(fā)生泄漏懂鸵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一行疏、第九天 我趴在偏房一處隱蔽的房頂上張望匆光。 院中可真熱鬧,春花似錦酿联、人聲如沸终息。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽周崭。三九已至,卻和暖如春喳张,著一層夾襖步出監(jiān)牢的瞬間续镇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工销部, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摸航,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓舅桩,卻偏偏與公主長(zhǎng)得像酱虎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子擂涛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容