文章目录
-
- 1.Python开发Spark的环境配置详细步骤
-
- 1.1 Windows 配置 python 环境变量
- 1.2 Windows 配置 spark 环境变量
- 1.3 Python中安装py4j
- 1.4 Python中安装PySpark模块
- WordCount 测试环境是否配置成功
- 2. Python 开发 Spark原理
1.Python开发Spark的环境配置详细步骤
1.1 Windows 配置 python 环境变量
这个比较简单,安装原生的 Python 或者 Anaconda 都可以,至于步骤这里就不多说了。
我这里用的Anaconda3,至于Anaconda3的安装配置,有兴趣的话可以参考:这篇blog
注意:如果使用的是 anaconda 安装的 python环境 并且打算学习 spark1.6 版本的开发,建议安装python3.5.x 版本,这个版本和 spark1.6 兼容
1.2 Windows 配置 spark 环境变量
我这里用的Spark版本 spark-2.3.1-bin-hadoop2.6.tgz
1. 解压并配置SPARK_HOME
1.3 Python中安装py4j
在 python 环境中安装 py4j 模块(python 调用 java API 的中间通信模块)
两种方式,我这里用的第(2)种
(1)进入python安装目录Scripts
使用pip install py4j
(2)或者将解压的spark安装包中的D:spark-2.3.1-bin-hadoop2.6pythonlibpy4j
拷贝到D:ProgramDataAnaconda3Libsite-packages
中。
验证py4j是否安装成功:python >>>import py4j
回车
1.4 Python中安装PySpark模块
同样也是那两种方法
(1)使用pip安装pyspark。pip install pyspark
会安装最新的版本的pyspark。
(2)或者,将解压的spark安装包中的D:spark-2.3.1-bin-hadoop2.6pythonpyspark
拷贝到D:ProgramDataAnaconda3Libsite-packages
中
验证pyspark模块是否安装成功
如果启动遇到下面错误: ERROR Shell:396 - Failed to locate the winutils binary in the hadoop binary path java.io.IOException: Could not locate executable nullbinwinutils.exe in the Hadoop binaries.
说明你的电脑没有配置 hadoop ,解决办法可以参考:这篇博客
WordCount 测试环境是否配置成功
先来个WordCount试试(我这里用的 PyCharm)
(1)新建一个 txt 文件
(2)运行下面示例代码
代码语言:javascript复制#coding:utf-8
from pyspark import SparkConf
from pyspark import SparkContext
if __name__ == '__main__':
conf=SparkConf()
conf=conf.setAppName("wordcount").setMaster("local")
sc=SparkContext(conf=conf)
lines=sc.textFile("word.txt",2)
print("lines rdd partition length = %d"%(lines.getNumPartitions()))
result=lines.flatMap(lambda line:line.split(" ")).map(lambda word:(word,1)).reduceByKey(lambda v1,v2:v1 v2,3)
print("result rdd partition length = %d"%(lines.getNumPartitions()))
result.foreach(lambda x:print(x))
result.saveAsTextFile("result")
运行结果如下:
说明配置的完全没毛病。
2. Python 开发 Spark原理
使用 python api 编写 pyspark 代码提交运行时,为了不破坏 spark 原有的运行架构,会将写好的代码首先在 python 解析器中运行(cpython),Spark 代码归根结底是运行在 JVM 中的,这里 python 借助 Py4j 实现 Python 和 Java 的交互,即通过 Py4j 将 pyspark 代码“解析”到 JVM 中去运行。例如,在 pyspark 代码中实例化一个 SparkContext 对象,那么通过 py4j 最终在 JVM 中会创建 scala 的 SparkContext 对象及后期对象的调用、在 JVM 中数据处理消息的日志会返回到 python 进程中、如果在代码中会回收大量结果数据到 Driver 端中,也会通过 socket 通信返回到 python 进程中。这样在python进程和JVM进程之间就有大量通信。
python开发spark,需要进行大量的进程间的通信,如果通信量过大,会出现“socket write error”错误。因此,应尽量少使用回收数据类算子,也可以调节回收日志的级别,降低进程之间的通信。