Apache Spark结构以及安装pyspark报错Java gateway process exited的原因接上篇

(5条消息) 测试pyspark时,解决Java gateway process exited的问题_コキリ的博客-CSDN博客

在第一篇blog(5条消息) 测试pyspark时,解决Java gateway process exited的问题_コキリ的博客-CSDN博客中,

我记录了解决安装pyspark报错Java gateway process exited的解决过程。最后卸了JAVA 16,装了低版本JAVA 8, 问题就OKAY了。

那么今天我想回溯一下之前碰到的报错问题,以及融合最近学的Apache Spark的知识来深度谈谈当时报错的原因,顺便帮自己 comb through.

首先我们要明白pyspark是spark的python API,但是实际在pyspark中写的代码和平时实操的python code 是很大的区别。因为spark是通过scala语言来操作的,而scala是基于java之上的,所以当我们使用pyspark时,一些代码是类似scala语言,而不是平时看到的python code. 当然,我们是在python 或jupyter notebook中操作,也会用到python, SQL等等你一下就能识别出来的语言。

这也是为什么当我们在学习spark和pyspark时你起码需要知道这个东西和java有关系的原因. Spark的底层其实是用的java byte code来创建一些dataframe or perhaps RDD  that is usually partitioned。

当我们开始在python/jupyter notebook中从开始写import pyspark以及之后的代码, 背后其实是通过py4j libriaries communicating with JAVA API. 

Py4J 是一个用 Python 和 Java 编写的库。通过 Py4J,Python程序 能够动态访问 Java虚拟机 中的 Java对象,Java程序 也能够回调 Python对象。

还记得第一篇日志我是通过pip来装 py4j的吗?

Apache Spark结构以及安装pyspark报错Java gateway process exited的原因接上篇_第1张图片

所以在装pyspark时,不要遗漏pip install py4j这一步也是必要的环节

下面我在两个地方找到了py4j,1.一个是python里我们通过python pip装的,2,是你在装spark时候自带的,spark我装在D盘

 1.

Apache Spark结构以及安装pyspark报错Java gateway process exited的原因接上篇_第2张图片

2.

Apache Spark结构以及安装pyspark报错Java gateway process exited的原因接上篇_第3张图片

 

让我们再来看一下当时报错的文件java_gateway.py

Apache Spark结构以及安装pyspark报错Java gateway process exited的原因接上篇_第4张图片

在45,46行那边我们看到这几行解释:

launch jvm gateway

 

    Parameters

    ----------

    conf : :py:class:`pyspark.SparkConf`

        spark configuration passed to spark-submit

    popen_kwargs : dict

        Dictionary of kwargs to pass to Popen when spawning

        the py4j JVM. This is a developer feature intended for use in

        customizing how pyspark interacts with the py4j JVM (e.g., capturing

        stdout/stderr).

 

    Returns

    -------

    ClientServer or JavaGateway

这边已经写了一点报错文件在干什么,特别是报错的地方(java gateway exited)经常出现的popen_kwargs。当触发py4j时,这是个dic that pass to Popen(啥是Popen?)。反正这个字典是用来记录py4j和pyspark连接情况的个人脚的

这边我们来学习两个单词stdout and stderr:标准输出和标准错误(abbr for standout/standerro)

图中35行定义的function是在customizing how spark intecacts with py4j,最终会显示连上了>>>client server,没连上>>>JavaGetAway

 

下面的if已经不用看了,因为报错在else里,直接看else,

有点长

Apache Spark结构以及安装pyspark报错Java gateway process exited的原因接上篇_第5张图片

看懂了一点,可以确信的是,想要这边不报错,配置环境正确的环境变量很重要。但是我大部分没看懂,目前知识量有待提高。。但看最底层报错信息我觉得是环境变量的问题。但是为什么重装JAVA8就解决问题了呢。。真的大部分人都在讨论环境变量,但是!好像重装了JAVA8还真的就解决了,而这个文件目前报错地方以上很少和JAVA有关的参数出现。。在import刚开始那边有。。后面就涉及spark和py4j. 而在java的文件夹里搜这两个字眼一点都搜不到。看来还得放一下改天再来更,这玩意起码得学习一下cs system才能解开这个谜团了

再来看一下当时报错,和java, py4j有关吧我感觉

Apache Spark结构以及安装pyspark报错Java gateway process exited的原因接上篇_第6张图片

感觉,目前对于cs system和java API知识 不够,以后再来回顾一下。

我怀疑是两种可能,

第一种可能我自己感觉错了,不是因为重装了JAVA8而解决的问题,而是在当时我重启系统之前重新改动了环境变量(虽然有点模糊我有修改或配置,可能是配置了C盘的python目录下的spark环境变量和D盘的spark环境变量使py4j可以工作。。

第二种是,虽然报错在spark文件夹下的java_gateway.py,但是可能问题出在JAVA其他地方导致py4j和java没办法配置好。

而且我比较在意这句话,虽然目前看不懂

我还是偏向于第二种。改天回来看吧。

下面我自己复习一下Apache spark的结构,

当你在pyspark屏幕上写代码的时候(创建spark session啊,load data into RDD啊,agg啊,show啊)

driver node transfers your transformation and actions into logical DAG(Directed Acyclic Graph),

 

 

你可能感兴趣的:(Apache Spark结构以及安装pyspark报错Java gateway process exited的原因接上篇)