我试图运行一个依赖于某些python3库的PySpark作业。我知道我可以在Spark Cluster上安装这些库,但是因为我正在为多个作业重用集群,所以我更愿意捆绑所有依赖项,并通过--py文件
指令将它们传递给每个作业。
为此,我使用:
pip3 install -r requirements.txt --target ./build/dependencies
cd ./build/dependencies
zip -qrm . ../dependencies.zip
它有效地压缩了需要在根级别使用的包中的所有代码。
在mymain.py
中,我可以导入依赖项
if os.path.exists('dependencies.zip'):
sys.path.insert(0, 'dependencies.zip')
并将.zip添加到我的Spark上下文中
sc.addPyFile('dependencies.zip')
到目前为止还不错。
但出于某种原因,这将在星火星团的某种依赖地狱中恶化
跑步
spark提交--py files dependencies.zip main.py
在main.py
(或类)中,我想使用熊猫。它将触发此错误的代码:
回溯(最近一次呼叫最后一次):
文件"/用户/tomlous/开发/Python/丰富/构建/main.py",第53行,job_module=importlib.import_module('spark.jobs.%s'%args.job_name)...
文件“”,第978行,在_gcd_import中
文件"",第961行,_find_and_load
文件“”,第950行,在“查找”和“加载”中解锁
文件“”,第646行,在“加载”中
文件“”,第616行,可向后加载
文件"dependencies.zip/spark/jobs/classify_existence.py",第9行,在
文件“dependencies.zip/enrich/existence.py”,第3行,在
文件“dependencies.zip/pandas/init.py”,第19行,在
ImportError:缺少必需的依赖项['numpy']
看看panda的\uuuu init\uuuuuuy.py
我看到了类似于\uuuuuu import\uuuuuuy(numpy)
所以我假设Numpy没有加载。
但如果我将代码更改为显式调用numpy函数,它实际上会找到numpy,但不会找到它的某些依赖项
import numpy as np
a = np.array([1, 2, 3])
代码返回
回溯(最近一次呼叫最后一次):
文件“dependencies.zip/numpy/core/init.py”,第16行,在
无法导入多阵列名称
所以我的问题是:
如何将python3库与spark作业捆绑在一起,而不必在spark集群上安装所有可能的库?
如果切换到virtualenv,您可以轻松实现这一点。在这个环境中,您需要安装所有必要的需求,然后使用--archives
将其压缩并传递。这是一篇描述细节的好文章:https://henning.kropponline.de/2016/09/17/running-pyspark-with-virtualenv/
更新:有一个有凝聚力的回购,其中包括一个非常出色地做到这一点的示例项目。你应该看看,尤其是如果我下面的例子不适合你。回购在这里:https://github.com/massmutual/sample-pyspark-application并包括在YARN:https://github.com/massmutual/sample-pyspark-application/blob/master/setup-and-submit.sh上运行的示例,该示例期望您首先导出几个环境变量。(我提供的值是特定于EMR的,所以您的值可能不同。)
export HADOOP_CONF_DIR="/etc/hadoop/conf"
export PYTHON="/usr/bin/python3"
export SPARK_HOME="/usr/lib/spark"
export PATH="$SPARK_HOME/bin:$PATH"
正如这里提到的:我似乎无法让Spark上的--py文件正常工作。有必要使用virtualenv(或者conda)之类的工具来避免遇到与Python包(如Numpy)的C库编译相关的问题依赖于基础硬件体系结构,但由于依赖项和/或任务节点中的硬链接(可能与主节点实例具有不同的硬件)而无法成功移植到群集中的其他计算机。
这里讨论了--Archips和--py文件之间的一些区别:在pyspark作业中运送和使用虚拟环境
我建议使用带有虚拟环境的文件来提供包含包依赖项的压缩文件,以避免我上面提到的一些问题。
例如,从一个Amazon弹性映射减少(EMR)集群中,当ssh进入master实例时,我能够成功地使用ssh提交从一个虚拟环境中执行测试python脚本,如下所示:
pip-3.4 freeze | egrep -v sagemaker > requirements.txt
# Above line is just in case you want to port installed packages across environments.
virtualenv -p python3 spark_env3
virtualenv -p python3 --relocatable spark_env3
source spark_env3/bin/activate
sudo pip-3.4 install -U pandas boto3 findspark jaydebeapi
# Note that the above libraries weren't required for the test script, but I'm showing how you can add additional dependencies if needed.
sudo pip-3.4 install -r requirements.txt
# The above line is just to show how you can load from a requirements file if needed.
cd spark_env3
# We must cd into the directory before we zip it for Spark to find the resources.
zip -r ../spark_env3_inside.zip *
# Be sure to cd back out after building the zip file.
cd ..
PYSPARK_PYTHON=./spark_env3/bin/python3 spark-submit \
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./spark_env3/bin/python3 \
--master yarn-cluster \
--archives /home/hadoop/spark_env3_inside.zip#spark_env3 \
test_spark.py
请注意,上面最后一行末尾附近的主题标签不是注释。这是一个火花提交的指令,如这里所述:使用纱线上的火花提交选项-档案上传zip文件
我正在运行的测试脚本的源代码来自本文,其中讨论了如何使用conda而不是virtualenv来运行pyspark作业:http://quasiben.github.io/blog/2016/4/15/conda-spark/
并包含test_spark.py脚本的代码:
# test_spark.py
import os
import sys
from pyspark import SparkContext
from pyspark import SparkConf
conf = SparkConf()
conf.setAppName("get-hosts")
sc = SparkContext(conf=conf)
def noop(x):
import socket
import sys
return socket.gethostname() + ' '.join(sys.path) + ' '.join(os.environ)
rdd = sc.parallelize(range(1000), 100)
hosts = rdd.map(noop).distinct().collect()
print(hosts)
如@Mariusz所述,如果您想了解有关使用virtualenv执行pyspark作业的一些背景信息,本博文中有一个有用的示例:https://henning.kropponline.de/2016/09/17/running-pyspark-with-virtualenv/ (虽然它没有解释我在其他链接中澄清的一些微妙之处)。
在这里提供的回复帖子中还有一个附加示例:未在PySpark中加载Elephas:没有名为Elephas.spark_model的模块
这里还有另一个例子:https://community.hortonworks.com/articles/104947/using-virtualenv-with-pyspark.html
提前感谢。我有问题启动一个osgi捆绑包,它给出了这个错误消息:包/捆绑包将不安装。它编译,并构建好,当部署到Karaf时,它不会加载和抱怨丢失的布线包,看起来像是正在导出和导入。但是缺少一个版本id。 执行命令时出错:无法启动bundle mvn:com。通用电气。数字的passthru/passthrumt1。dataserviceimpl/1.0.1-SNAPSHOT在功能部件passthr
/subsystem=elytron/dir-context=pepdircontext:add(url=“ldap://127.0.0.1:10389”,principal=“uid=admin,ou=system”,credential-reference={clear-text=“secret”}) /subsystem=elytron/ldap-realm=pepdircontext,id
我是WPF/XAML的新手。如果绑定到XAML中错误的数据类型,我希望得到一条错误消息。XAML似乎希望所有绑定都通过字符串进行,但是如果错误地使用int或double则不会出现错误消息。 我在这里找到了以下XAML代码: 我发现绑定可以在int属性上工作,但不能在公共int字段上工作。下面是我创建的一个Point类来测试它: 如果绑定到int属性X或string属性Xstr,它可以正常工作。如果
本文向大家介绍mysql主键的缺少导致备库hang住,包括了mysql主键的缺少导致备库hang住的使用技巧和注意事项,需要的朋友参考一下 最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住,严重的影响了生产环境的稳定性,也希望通过这篇博客,来加深主键在innodb引擎中的
我的依赖树和多个SLF4J绑定有问题。到目前为止,我发现这通常只会引起一个警告,但在我的情况下,它似乎会阻止我的程序运行:以下是我得到的例外情况: SLF4J:类路径包含多个SLF4J绑定。slf4j:在[jar:file:/c:/users/fischerni/.m2/repository/org/slf4j/slf4j-jdk14/1.5.3/slf4j-jdk14-1.5.3.jar!/or
我正在重构我的应用程序与Hilt作为依赖注入管理器。我有一个构造函数可注入类,构造函数中有两个参数。其中一个参数是。 当我尝试构建应用程序时,我得到一个丢失绑定的错误,如下所示: 我是不是缺少了CoroutineDispatcher的注释?