我安装的版本是spark 2.4.3和hadoop 2.7.7(或只安装winutils),配置好环境变量。
驱动器程序通过对象SparkContext(即sc)连接spark集群,在spark shell中会自动初始化sc,但python和scala编写的spark程序中需要自定义一个sc。运行会出现一些WARN。
import findspark
findspark.init()
from pyspark import SparkConf, SparkContext
# setMaster为集群URL:即让spark连接到指定集群上,local指的是单机单线程运行,而不必运行在集群上
conf = SparkConf().setMaster("local").setAppName("name")
sc = SparkContext(conf=conf) # 定义驱动器对象,sparksession的子对象
spark = SparkSession(sc)
# 关闭sc
sc.stop()
解决:更新conda
conda activate base
conda install anaconda
conda update --all
参考链接
看到有的说是C:\Users\
的问题,但对文件进行修改或删除后还是偶尔会出现这样的情况。
参考链接
使用虚拟环境中的pip进行安装即可:D:\Anaconda3\envs\spark\Scripts\pip.exe install findspark
error4:未使用findspark时报错:org.apache.spark.api.python.PythonUtils.isEncryptionEnabled does not exist in the JVM
使用findspark.init()时报错:TypeError: ‘bytes’ object cannot be interpreted as an integer
原因:pyspark版本需要与python版本相匹配
pyspark版本:3.3.1
python版本:3.10.8
解决:使用更低版本的python,我换成了3.7,解决一些包冲突要等挺久。最后更新一下解释器路径。
参考链接
原因:hadoop的bin目录下没有winutils.exe文件(可能是因为版本原因)
解决:JAVA_HOME环境变量不能有空格;下载一个放入bin目录下,重启一下或加上代码
System.setProperty("hadoop.home.dir", "E:\\Program Files\\hadoop-2.7.0")
参考链接
使用pysaprk读取数据并计算元素个数:
def count_line(stream):
numlines = stream.count()
stream.show(10)
print(numlines)
# multiLine=False:12762
# multiLine=True:2184
# 期望:12492
# 读取文件
file_path = "F:/Study/spark/dataset/myntra_products_catalog.csv"
# data = sc.textFile(file_path) # 无法多行读取
spark = SparkSession(sc)
data = spark.read.csv(file_path, multiLine=True, inferSchema= True, header=True)
count_line(data)
pyspark程序运行后可以在http://localhost:4040查看到spark提供的WEB UI界面。由于程序运行完后会关闭spark的驱动器,从而导致连接失败,故需在程序末尾加个空循环再访问。
将读取到的数据保存发现还是有12492行,查阅资料发现使用sparksession读取文件后会返回dataframe格式而不是rdd。考虑到count()是输出rdd中的元素数,故尝试将读取到的data转成rdd。
解决:将numlines = stream.count()
改成numlines = stream.rdd.count()
,输出为12491。
参考链接
dataframe与rdd的区别
error2:ERROR:root:Exception while sending command.
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。
原因:看文献说是Spark 限制了内存使用导致引发错误。
解决:通过conf修改spark的配置、增加内存,如下。
conf = SparkConf().setMaster("local").setAppName("name").set('spark.executor.memory', '15G')
参考链接