初识Windows下Python开发Spark

最近需要在Windows上配置python 开发 Spark应用,在此做一个总结笔记。

Spark 简介

Spark的介绍及运行环境要求,引自 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

从官方网站下载tar包 http://spark.apache.org/downloads.html

Download Spark package.png

Spark 由 Scala语言开发,而Scala也是运行于JVM之上,因此也可以看作是跨平台的,所以在下载 spark-2.1.0-bin-hadoop2.7.tgz 之后, 在Windows 平台直接解压即可。

在Spark 的 sbin 目录下,并没有提供Spark作为 Master 启动脚本,所以在windows下,我们借助spark-shell, pyspark等方式启动并调用Spark。

配置环境变量

假设 spark-2.1.0-bin-hadoop2.7.tgz 已被解压至E:\Spark, 接下来需要配置环境变量。 对于python开发来说,有三个环境变量至关重要。 开始-> 计算机, 右键点击 -> 属性->高级系统设置->环境变量,在系统环境变量中添加环境变量 SPARK_HOME和PYTHONPATH,并将Spark\bin加入到系统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下已经通过cmd打开命令窗口,则需要退出命令窗口再重新打开,以上设置的环境变量才会生效。

Python Spark入门示例

在Spark的安装包,提供了经典的入门示例程序,通过这些示例程序演示了基本的Spark开发和API调用过程。

1. Word Count

统计文本中某一单词的重复次数,是在技术面试中,特别是考察编程能力经常遇到的面试题,网络中也有各种语言的解题代码。在Spark的示例中,通过非常精悍的代码展示了Spark的强大。

from __future__ import print_function

import sys
from operator import add

# SparkSession:是一个对Spark的编程入口,取代了原本的SQLContext与HiveContext,方便调用Dataset和DataFrame API
# SparkSession可用于创建DataFrame,将DataFrame注册为表,在表上执行SQL,缓存表和读取parquet文件。
from pyspark.sql import SparkSession


if __name__ == "__main__":

    # Python 常用的简单参数传入
    if len(sys.argv) != 2:
        print("Usage: wordcount <file>", file=sys.stderr)
        exit(-1)
        
    # appName 为 Spark 应用设定一个应用名,改名会显示在 Spark Web UI 上
    # 假如SparkSession 已经存在就取得已存在的SparkSession,否则创建一个新的。
    spark = SparkSession\
        .builder\
        .appName("PythonWordCount")\
        .getOrCreate()
        
    # 读取传入的文件内容,并写入一个新的RDD实例lines中,此条语句所做工作有些多,不适合初学者,可以截成两条语句以便理解。
    # map是一种转换函数,将原来RDD的每个数据项通过map中的用户自定义函数f映射转变为一个新的元素。原始RDD中的数据项与新RDD中的数据项是一一对应的关系。
    lines = spark.read.text(sys.argv[1]).rdd.map(lambda r: r[0])
   
    # flatMap与map类似,但每个元素输入项都可以被映射到0个或多个的输出项,最终将结果”扁平化“后输出 
    counts = lines.flatMap(lambda x: x.split(' ')) \
                  .map(lambda x: (x, 1)) \
                  .reduceByKey(add)
                
    # collect() 在驱动程序中将数据集的所有元素作为数组返回。 这在返回足够小的数据子集的过滤器或其他操作之后通常是有用的。由于collect 是将整个RDD汇聚到一台机子上,所以通常需要预估返回数据集的大小以免溢出。             
    output = counts.collect()
    
    for (word, count) in output:
        print("%s: %i" % (word, count))

    spark.stop()

测试数据, 可以拷贝下面的文字存入一个文本文件,比如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.

执行测试结果

wordcount.jpg

概念介绍

RDD:弹性分布式数据集,是一种特殊集合 ‚ 支持多种来源 ‚ 有容错机制 ‚ 可以被缓存 ‚ 支持并行操作

RDD有两种操作算子:

  • Transformation(转换):Transformation属于延迟计算,当一个RDD转换成另一个RDD时并没有立即进行转换,仅仅是记住了数据集的逻辑操作
  • Ation(执行):触发Spark作业的运行,真正触发转换算子的计算

常见执行错误

初次执行Python Spark可能会遇到类似错误提示


python spark error.jpg

之所以有上面提示的内容,主要包含两部分配置问题

1. 日志输出

Spark在执行过程中,很多INFO日志消息都会打印到屏幕,方便执行者获得更多的内部细节。开发者可以根据需要设置$SPARK_HOME/conf下的log4j。在 $SPARK_HOME/conf 下 已经预先存放了一份模版log4j.properties.template文件,开发者可以拷贝出一份 log4j.properties, 并设置成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

其次,设置HADOOP_HOME环境变量,指向 c:\hadoop, 并将HADOOP_HOME加到系统变量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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容