PySpark的安装以及运行时报错的解决方法

896 阅读7分钟

1.在pycharm中安装PySpark时,可以通过终端下载并且使用国内的镜像源,以下以清华提供的镜像源为例, 在安装时我们需要在pycharm左下角的工作栏中选择终端

屏幕截图 2024-11-17 204641.png 接下来在终端本地中输入相关代码使用pip下载

屏幕截图 2024-11-17 205138.png 使用镜像源时需要在前面加上-i,当然也可以不使用,不使用镜像源时就不需要加-i,但是下载速度会很慢,毕竟是国外的网站,此时按enter即可下载,等待下载完成,此时pycharm中就有PySpark的库了,但是依旧不能运行,此时直接运行就会产生报错,以下是具有的报错:

24/11/17 16:43:58 WARN Shell: Did not find winutils.exe: java.io.FileNotFoundException: java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset. -see wiki.apache.org/hadoop/Wind… Setting default log level to "WARN". To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel). 24/11/17 16:43:58 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Traceback (most recent call last): File "D:\pycharm\pythonProject\dome\PySpark.py", line 10, in sc=SparkContext(conf=conf) File "D:\pycharm\pythonProject.venv\Lib\site-packages\pyspark\context.py", line 203, in init self._do_init( ~~~~~~~~~~~~~^ master, ^^^^^^^ ...<10 lines>... memory_profiler_cls, ^^^^^^^^^^^^^^^^^^^^ ) ^ File "D:\pycharm\pythonProject.venv\Lib\site-packages\pyspark\context.py", line 296, in _do_init self._jsc = jsc or self._initialize_context(self._conf._jconf) ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^ File "D:\pycharm\pythonProject.venv\Lib\site-packages\pyspark\context.py", line 421, in _initialize_context return self._jvm.JavaSparkContext(jconf) ~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^ File "D:\pycharm\pythonProject.venv\Lib\site-packages\py4j\java_gateway.py", line 1587, in call return_value = get_return_value( answer, self._gateway_client, None, self._fqn) File "D:\pycharm\pythonProject.venv\Lib\site-packages\py4j\protocol.py", line 326, in get_return_value raise Py4JJavaError( "An error occurred while calling {0}{1}{2}.\n". format(target_id, ".", name), value) py4j.protocol.Py4JJavaError: An error occurred while calling None.org.apache.spark.api.java.JavaSparkContext. : java.lang.UnsupportedOperationException: getSubject is supported only if a security manager is allowed at java.base/javax.security.auth.Subject.getSubject(Subject.java:347) at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:577) at org.apache.spark.util.Utils..anonfungetCurrentUserNamegetCurrentUserName1(Utils.scala:2416) at scala.Option.getOrElse(Option.scala:189) at org.apache.spark.util.Utils$.getCurrentUserName(Utils.scala:2416) at org.apache.spark.SparkContext.(SparkContext.scala:329) at org.apache.spark.api.java.JavaSparkContext.(JavaSparkContext.scala:58) at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:501) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:485) at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:247) at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:374) at py4j.Gateway.invoke(Gateway.java:238) at py4j.commands.ConstructorCommand.invokeConstructor(ConstructorCommand.java:80) at py4j.commands.ConstructorCommand.execute(ConstructorCommand.java:69) at py4j.ClientServerConnection.waitForCommands(ClientServerConnection.java:182) at py4j.ClientServerConnection.run(ClientServerConnection.java:106) at java.base/java.lang.Thread.run(Thread.java:1575)

原因就在于使用PySpark时需要构建Hadoop和Java环境,接下来我会具体展开如何下载和构建此环境

1.Hadoop

我们可以通过清华提供的镜像源去下载Hadoop:mirrors.tuna.tsinghua.edu.cn/apache/hado… 点开此链接,进行以下操作

屏幕截图 2024-11-17 205739.png

屏幕截图 2024-11-17 210327.png

屏幕截图 2024-11-17 210547.png

此时下载好的是一个压缩包,我们需要对其解压,当使用文件资源管理器解压时出现错误时,我们就需要使用其他压缩器以管理员的身份进行解压,我使用的是WinRAR,此时我们只需要右键选择以管理员身份运行再进行解压就行,解压在D:\001_Deverlop\052_Hadoop\hadoop-3.3.6中,如果没有就创建一个(不创建也行),此时的Hadoop就下载完成了,接下载就是搭配在系统环境中 接下来我们右键此电脑选择属性

屏幕截图(19).png

再找到查看高级系统设置

屏幕截图 2024-11-17 211442.png 进去之后,选择环境变量

屏幕截图(20).png

我们需要在系统变量中添加HADOOP_HOME并将你下载Hadoop的路径填写进去

屏幕截图(21).png

屏幕截图(22).png 接下来要在系统变量中找到path并双击打开

屏幕截图(23).png 再新建一个%HADOOP_HOME%\bin,点击确定

屏幕截图(24).png 此时的Hadoop的环境已经搭建好了

2.Java

Hadoop搭载好了之后还要去搭载Java的环境,Java下载可以在Oracle官网中下载:www.oracle.com

进入之后在最上面一栏找到产品

屏幕截图 2024-11-17 213035.png 再点击硬件与软件中的Java

屏幕截图 2024-11-17 213114.png 再点击右上角的下载Java

屏幕截图 2024-11-17 213227.png 选择自己电脑的系统,Windows下载按以下过程下载,选择自己想要的Java版本(我使用的是Java11,具体下载教程可以去b站上搜索) 屏幕截图 2024-11-17 213405.png 将Java下载到自己方便找到的文件夹中 接下来就是Java环境的构建了,依旧是在此电脑中打开属性,选择环境变量,在系统变量中新建JAVA_HOME ,并将Java所在的路径填写进去

屏幕截图(25).png 接下来在系统变量中找到path并打开,新建一个%JAVA_HOME%\bin

屏幕截图(26).png 此时Java的环境也构建好了

完成之后我们打开pycharm运行可能依旧会报错,原因是pycharm使用的是虚拟环境,而我们构建的是系统环境,无法运行的原因就是两者的环境不一样,所以我们需要把我们系统环境弄到pycharm中去,具体的教程可以b站上搜索,我使用默认的编译器就运行了,可能有些人不能运行就是pycharm环境并没有改变 接下来我们可以通过以下代码去验证是否成功

# 导包
from pyspark import SparkConf,SparkContext
# 创建SparkConf类对象
conf=SparkConf().setMaster("local[*]").setAppName("test_spark_app")
# 基于SparkConf类对象创建SparkContext对象
sc=SparkContext(conf=conf)
# 打印pyspark的运行版本
print(sc.version)
# 停止SparkContext对象运行(停止PySpark程序)
sc.stop()

此时只要我们能够打印出版本号就算成功了

屏幕截图 2024-11-17 214628.png 以上的警告可以不用理会,有一个是因为我们没有下载与我们下载的Hadoop版本相对应winutils,想下载的可以去b站搜索教程,winutils需要放在Hadoop的bin目录中