这是我安装 pyspark 二进制文件的一些上下文。
在我的公司,我们使用 Cloudera Data Science Workbench (CDSW)。当我们为新项目创建会话时,我猜它是来自特定 Dockerfile 的图像。并且在这个 dockerfile 中推送了 CDH 二进制文件的安装和配置。
现在我希望在 CDSW 之外使用这些配置。我有一个 Kubernetes 集群,我在其中部署 web 应用程序。我想在 Yarn 模式下使用 spark 为 webapps 部署非常小的资源。
我所做的是将 tar.gz 中的所有二进制文件和配置文件/opt/cloudera/parcels/CDH-6.3.4-1.cdh6.3.4.p4484.8795072
和/var/lib/cdsw/client-config/
. 然后在容器或 WSL2 实例中解压缩它们。
我没有像我应该做的那样把所有东西都拆开包装,而是把它们/var/
放在and中。我为什么这样做?因为我可能想在我的 kubernetes 中使用挂载的卷并在容器之间共享二进制文件。/opt/
$HOME/opt/cloudera/parcels/CDH-6.3.4-1.cdh6.3.4.p4484.8795072/*
$USER/etc/client-config/*
我已经sed
修改了所有配置文件以适应路径:
- 火花环境.sh
- 拓扑.py
- 任何 *.txt、*.sh、*.py
所以我设法beeline
hadoop
hdfs
hbase
用文件夹指向它们hadoop-conf
。我可以使用pyspark
,但只能在本地模式下使用。但我真正想要的是使用pyspark
with yarn
。
所以我设置了一堆环境变量来完成这项工作:
export HADOOP_CONF_DIR=$HOME/etc/client-config/spark-conf/yarn-conf
export SPARK_CONF_DIR=$HOME/etc/client-config/spark-conf/yarn-conf
export JAVA_HOME=/usr/local
export BIN_DIR=$HOME/opt/cloudera/parcels/CDH-6.3.4-1.cdh6.3.4.p4484.8795072/bin
export PATH=$BIN_DIR:$JAVA_HOME/bin:$PATH
export PYSPARK_PYTHON=python3.6
export PYSPARK_DRIVER_PYTHON=python3.6
export OPENBLAS_NUM_THREADS=1
export MKL_NUM_THREADS=1
export SPARK_HOME=/opt/cloudera/parcels/CDH-6.3.4-1.cdh6.3.4.p4484.8795072/lib/spark
export PYSPARK_ARCHIVES_PATH=$(ZIPS=("$CDH_DIR"/lib/spark/python/lib/*.zip); IFS=:; echo "${ZIPS[*]}"):$PYSPARK_ARCHIVES_PATH
export SPARK_DIST_CLASSPATH=$HOME/opt/cloudera/parcels/CDH-6.3.4-1.cdh6.3.4.p4484.8795072/lib/hadoop/client/accessors-smart-1.2.jar:<ALL OTHER JARS FOR EVERY BINARIES>
无论如何,所有路径都存在并且有效。而且由于我已经 sed 了所有配置文件,它们也会生成与导出的相同的路径。
我像这样启动我的 pyspark 二进制文件:
pyspark --conf "spark.master=yarn" --properties-file $HOME/etc/client-config/spark-conf/spark-defaults.conf --verbose
仅供参考,它使用的是 pyspark 2.4.0。我已经安装了Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
. 我在 CDSW 实例上找到的相同。我用公司的公共证书添加了密钥库。而且我还为 kerberos 身份验证生成了一个密钥表。他们两个都在工作,因为我可以hdfs
使用HADOOP_CONF_DIR=$HOME/etc/client-config/hadoop-conf
在详细模式下,我可以看到 spark 的所有细节和配置。当我从 CDSW 会话中比较它时,它们完全相同(修改了路径,例如:
Using properties file: /home/docker4sg/etc/client-config/spark-conf/spark-defaults.conf
Adding default property: spark.lineage.log.dir=/var/log/spark/lineage
Adding default property: spark.port.maxRetries=250
Adding default property: spark.serializer=org.apache.spark.serializer.KryoSerializer
Adding default property: spark.driver.log.persistToDfs.enabled=true
Adding default property: spark.yarn.jars=local:/home/docker4sg/opt/cloudera/parcels/CDH-6.3.4-1.cdh6.3.4.p4484.8795072/lib/spark/jars/*,local:/home/docker4sg/opt/cloudera/parcels/CDH-6.3.4-1.cdh6.3.4.p4484.8795072/lib/spark/hive/*
...
几秒钟后,它无法创建sparkSession
:
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
2022-02-22 14:44:14 WARN Client:760 - Exception encountered while connecting to the server : org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): Operation category READ is not supported in state standby. Visit https://s.apache.org/sbnn-error
2022-02-22 14:44:14 ERROR SparkContext:94 - Error initializing SparkContext.
java.lang.IllegalArgumentException: java.net.URISyntaxException: Expected scheme-specific part at index 12: pyspark.zip:
...
Caused by: java.net.URISyntaxException: Expected scheme-specific part at index 12: pyspark.zip:
...
2022-02-22 14:44:15 WARN YarnSchedulerBackend$YarnSchedulerEndpoint:69 - Attempted to request executors before the AM has registered!
2022-02-22 14:44:15 WARN MetricsSystem:69 - Stopping a MetricsSystem that is not running
2022-02-22 14:44:15 WARN SparkContext:69 - Another SparkContext is being constructed (or threw an exception in its constructor). This may indicate an error, since only one SparkContext may be running in this JVM (see SPARK-2243). The other SparkContext was created at:
org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:58
据我了解,它因我不确定的原因而失败,然后尝试退回到其他模式。那也失败了。
在配置文件spark-conf/yarn-conf/yarn-site.xml
中,指定它使用的是zookeeper
:
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>corporate.machine.node1.name.net:9999,corporate.machine.node2.name.net:9999,corporate.machine.node3.name.net:9999</value>
</property>
会不会是 Yarn 集群不接受来自随机 IP(kuber IP 或来自计算机的个人 IP)的流量?对我来说,我正在处理的 IP 不在白名单上,但目前我无法要求将我的 IP 添加到白名单中。我怎么能确定我正在寻找好的方向?
编辑1:
正如评论中所说,的URIpyspark.zip
是错误的。我已经修改了我PYSPARK_ARCHIVES_PATH
的真实位置pyspark.zip
。
PYSPARK_ARCHIVES_PATH=local:$HOME/opt/cloudera/parcels/CDH-6.3.4-1.cdh6.3.4.p4484.8795072/lib/spark/python/lib/py4j-0.10.7-src.zip,local:$HOME/opt/cloudera/parcels/CDH-6.3.4-1.cdh6.3.4.p4484.8795072/lib/spark/python/lib/pyspark.zip
现在我得到一个错误UnknownHostException
:
org.apache.spark.SparkException: Uncaught exception: org.apache.spark.SparkException: Exception thrown in awaitResult
...
Caused by: java.io.IOException: Failed to connect to <HOSTNAME>:13250
...
Caused by: java.net.UnknownHostException: <HOSTNAME>
...