PYSpark环境构建总结
一、需要的软件及版本
-
- jdk版本:1.8
- spark 版本:-2.4.0-bin-hadoop2.7
- scala版本:2.12 (可选)
- hadoop版本:2.7 ====另外需要
- python版本:3.7 或者anaconda
- pyspark以及py4j
- pycharm的安装,暂时用社区版吧
二、环境变量配置:
JAVA_HOME=C:\gyhProgramFiles\jdk\jdk8
SPARK_HOME=C:\gyhProgramFiles\spark-2.4.0-bin-hadoop2.7
HADOOP_HOME=C:\gyhProgramFiles\hadoop-2.7.7
SCALA_HOME=C:\gyhProgramFiles\scala-2.12.8
PYTHON_PATH=%SPARK_HOME%\python;%SPARK_HOME%\python\lib\py4j-0.10.7-src.zip
PATH=.;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;%SPARK_HOME%;%SPARK_HOME%\bin;%SPARK_HOME%\sbin;%SCALA_HOME%\bin;%HADOOP_HOME%\bin;%HADOOP_HOME%\sbin;C:\gyhProgramFiles\Python\Python37\;C:\gyhProgramFiles\Python\Python37\Scripts\;%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;%PyCharm Community Edition%;
三、安装注意事项:
1、spark依赖scala,scala依赖jdk,所以scala和jdk都要安装;jdk尽量用1.8的。别用11;
2、spark和hadoop的版本要注意尽量匹配;
3、spark启动spark-shell的时候会报错winutil.exe的错误,解决方法是在安装完hadoop后下载相关文件替换hadoop下面的bin目录里:
4、pyspark和py4j是否需要单独安装??有的文件说只要安装完spark了,并配置了PATH=%SPARK_HOME%;%SPARK_HOME%\bin;%SPARK_HOME%\sbin; 了就可以用pyspark了。但大多数的帖子里是说要单独安装: pip3 install py4j --proxy=proxy.cmcc:8080 pip3 install pyspark --proxy=proxy.cmcc:8080
另外:py4j也可以:在pycharm上的project interpreter上下载py4j
5、注意:spark要链接mysql,需要把 链接jar包 放到spark/jars 目录底下。在spark_en.sh里面配置的不起作用。
6、以上安装后用了在pycharm里面调试程序时候,不需要事先手动启动spark,直接运行程序即可。
四、pycharm集成spark的操作步骤
第一个地方:打开RUN->Edit Configurations ;添加 SPARK_HOME和PYTHONPATH等;
SPARK_HOME为spark的绝对路径;PYTHONPATH为spark的绝对路径下的python目录;
即:SPARK_HOME=C:\gyhProgramFiles\spark-2.4.0-bin-hadoop2.7
PYTHONPATH=C:\gyhProgramFiles\spark-2.4.0-bin-hadoop2.7\python
另外JAVA_HOME不设置的话会报错:Java not found and JAVA_HOME environment variable is not set.
HADOOP_HOME不设置的话会报错:Failed to locate the winutils binary in the hadoop binary path
第二个地方:在setting==》perferences中的project structure中点击右边的“add content root”,添加py4j-some-version.zip和pyspark.zip的路径(这两个文件都在Spark中的python/lib文件夹下)
有很多帖子没有执行这个操作就可以,但我必须这样操作才行。
第三个地方:拷贝spark下的两个目录到python目录下,据说这样能实现在pycharm里面的代码自动补全功能
效果:
五、测试
from __future__ import print_function
from pyspark.sql import SparkSession
def json_dataset_example(spark):
sc = spark.sparkContext
path = "C://people.json"
peopleDF = spark.read.json(path)
peopleDF.printSchema()
peopleDF.createOrReplaceTempView("people")
teenagerNamesDF = spark.sql("SELECT name FROM people WHERE age BETWEEN 13 AND 19")
teenagerNamesDF.show()
def jdbc_dataset_example(spark):
myDF = spark.read \
.format("jdbc") \
.option("url", "jdbc:mysql://10.1.4.64:3306/myd?characterEncoding=gbk") \
.option("dbtable", "gyh_menzhen") \
.option("user", "root") \
.option("password", "zhaowei") \
.load()
myDF.createOrReplaceTempView("gyh_menzhen")
spark.sql("select count(*) from gyh_menzhen ").show()
if __name__ == "__main__":
spark = SparkSession.builder.appName("Python Spark SQL data source example").getOrCreate()
##json_dataset_example(spark) ##############################################################这里测试成功
jdbc_dataset_example(spark) ##################################这里连接数据库测试报错:py4j.protocol.Py4JJavaError: An error occurred while calling o32.load.
: java.sql.SQLException: No suitable driver
spark.stop()
####################测试证明这个错误需要把 mysql的链接jar文件放到 spark安装目录下的jars文件夹下面。像有的帖子说在spark_env.sh里面加入export SPARK_CLASSPATH=C:\gyhProgramFiles\mysql-connector-java-5.1.35.jar;$SPARK_CLASSPATH 好像从没有成功过。