Pyspark spark-submit 集群提交任务以及引入虚拟环境依赖包攻略
网上提交 scala spark 任务的攻略非常多,官方文档其实也非常详细仔细的介绍了 spark-submit 的用法。但是对于 python 的提交提及得非常少,能查阅到的资料非常少导致是有非常多的坑需要踩。
官方文档对于任务提交有这么一段介绍,但是初次使用者依然会非常疑惑:
Bundling Your Application’s Dependencies
If your code depends on other projects, you will need to package them alongside your application in order to distribute the code to a Spark cluster. To do this, create an assembly jar (or “uber” jar) containing your code and its dependencies. Both sbt and Maven have assembly plugins. When creating assembly jars, list Spark and Hadoop as
provideddependencies; these need not be bundled since they are provided by the cluster manager at runtime. Once you have an assembled jar you can call thebin/spark-submitscript as shown here while passing your jar.For Python, you can use the
--py-filesargument ofspark-submitto add.py,.zipor.eggfiles to be distributed with your application. If you depend on multiple Python files we recommend packaging them into a.zipor.egg.
可以看到如果我们使用 java 系语言,例如 java scala 我们可以轻松的将相关的依赖环境打包成 .jar,然后在提交的时候使用官方建议使用在的姿势进行集群提交。例如使用:
sudo -u hdfs spark-submit \
--class "Excellent" \
--master yarn \
--deploy-mode cluster \
--driver-memory 2g \
--executor-memory 2g \
--executor-cores \
/home/zhizhizhi/sparktry_2.-0.1.jar
主要程序是 Excellent, 使用 yarn 进行调度,使用集群模式运行。需要分配的执行和 driver 的内存,以及执行的时候指定的核数。
其实对 python 的 submit 使用 yarn 也和这个命令差不多,我们可以使用
/etc/alternatives/spark-submit \
--master yarn \
--deploy-mode cluster \
--name md_day_dump_user \
--conf "spark.pyspark.driver.python=/home/uther/miniconda2/envs/uther/bin/python2.7" \
--conf "spark.pyspark.python=/home/uther/miniconda2/envs/uther/bin/python2.7" \
--py-files /home/uther/uther/uther.zip \
/home/uther/uther/spark_run/md_day_dump_users.py
好了让我们来谈下这里面的坑。
首先注意一下我这里显示申明了使用 /etc/alternatives/spark-submit 如果我们不使用这个申明我们会默认使用安装 pyspark 的时候给我们带的 spark-submit。
这一点非常重要,因为我们的集群使用的 CDH 部署的,所以其实很多环境变量依赖什么的 CDH 都已经给我们配置好了,使用自己的 spark-submit 就需要自己配置这些东西,可能会导致很多问题,比如你无法直接连接到目标 hive 等等等。
默认会使用
(uther) [uther@zed- ~]$ which spark-submit
~/miniconda2/envs/uther/bin/spark-submit
这一点要非常难发现。。。。。。得非常小心。
使用集群进行运行这一点感觉也有坑,按照我查阅的一些资料来看,如果使用集群调度,很有可能在分配 application master 的时候被分配到别的机器上去,这就需要别的机器也有这一套环境,否则可能会导致失败。可能会报出类似下面的问题,但是也不太确定,因为最近跑似乎每次都分配给了提交任务的节点进行执行的,之后再观察一下。
thread "main" java.io.FileNotFoundException: File
经过一段时间的观察,如果使用 yarrn 进行任务调度,的确需要在每个可以分配的节点上同样的路径下有相同的运行环境才可以保证程序的正常运行这一点要 注意。
我使用的是 miniconda 的环境,所以直接将 miniconda 的包拷贝到相同的路径下然后将权限设置成 777 就可以了。
另外最关键的一步指定虚拟环境可以使用类似命令:
--conf "spark.pyspark.driver.python=/home/uther/miniconda2/envs/uther/bin/python2.7" \
--conf "spark.pyspark.python=/home/uther/miniconda2/envs/uther/bin/python2.7" \
这个两条命令指定了集群使用哪里的环境来运行你的程序。明显我们可能会关联非常多的依赖包,使用这种方法会比较优雅。
另外 spark 提供了另外一条命令给我们引入包
--py-files /home/uther/uther/uther.zip
这条命令的意思类似于我的程序里有 import uther.xxxx.xxx or from uther.xx.xx import xxx 类似语句,我需要将 uther 当错一个 egg or zip 包来 import 。像第三方包的行为一样。
指定之后 spark 就能在执行你的代码的时候找到对应的环境了。这对在使用 pyspark 的代码结构有一定的要求,尽量将你的逻辑打包成一个 python 包来方便引用。
另外还值得一提的是,当我们操作提交代码的时候还会报出各种奇奇怪怪的错误,但是基本上分为 权限问题 | 和环境变量问题。
例如没有在 hdfs 上操作读写的权限,就需要你耐心的去 hdfs 上面把相关权限加上,这里列举一个我遇到的比较典型的问题,由于我们需要将环境部署到每一台可能生成 application master 的机器上去,所以我们所有的机器都需要部署相关的 python_env 环境。
我们可以把 miniconda 包打包好然后分别传到各个服务器上的目标路径去。
我在一切都弄好了之后还是收到如下报错:
19/03/06 21:23:36 INFO yarn.ApplicationMaster: Unregistering ApplicationMaster with FAILED (diag message: User class threw exception: java.io.IOException:
Cannot run program "/home/uther/miniconda2/envs/uther/bin/python2.7": error=13, Permission denied)
这毫无疑问是一个权限问题,但是我当时检查了我的目标文件夹包括整个 miniconda 包都已经全部 777 了究竟为啥还是没有权限?
最后我发现原来是 /home/uther 这个我的 /home 目录下的用户目录还没有设置权限,当设置完毕之后 it works!
ps:spark-6358 的一个同学和我遇到了相同的问题。
要用 yarn 调用相关的程序也记得把 yarn 加入被调用方的组,然后仔细检查相关的权限。
Trouble Shooting:
在新创建用户提交的时候还可能遇到的问题可能有,在某个机器上新创建账号并赋予权限之后,可能 hdfs 上还并没有该用户的账号。
所以我们需要在 hdfs 上也创建该用户,这里为了方便我直接通过 HUE 在 hdfs 上创建了跟新机器上一样名称的用户,就未再报出过没有权限访问 /user 权限不足的问题。
另外有一点也值得注意,我尝试在我经常使用的 zed-2 上试图访问集群上的执行日志
yarn logs -applicationId application_1572242315020_51855
却一直得到如下输出
19/12/06 14:56:36 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
19/12/06 14:56:38 INFO ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
19/12/06 14:56:39 INFO ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 1 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
19/12/06 14:56:40 INFO ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 2 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
19/12/06 14:56:41 INFO ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 3 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleep
起初我一直怀疑是连接问题或者配置问题,但是检查了一圈发现都没有。并且以前可以正常访问现在却突然不可以了。
于是去逐一查找问题,最后发现是因为我们提交 submit 任务的机器目前已经资源问题已经被踢出了 NodeManager 所以无法再和 ResourceManager 通信了。
所以可以换台机器看,或者重新将其加入即可。
Reference:
https://zhuanlan.zhihu.com/p/43434216 spark-python版本依赖与三方模块方案
https://spark.apache.org/docs/2.2.0/submitting-applications.html 官方 Submitting Applications 文档
https://issues.apache.org/jira/browse/SPARK-6358
Pyspark spark-submit 集群提交任务以及引入虚拟环境依赖包攻略的更多相关文章
- spark yarn 集群提交kafka代码
配置好hadoop的环境,具体根据http://blog.csdn.net/u010638969/article/details/51283216博客所写的进行配置. 运行start-dfs.sh启动 ...
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十三)kafka+spark streaming打包好的程序提交时提示虚拟内存不足(Container is running beyond virtual memory limits. Current usage: 119.5 MB of 1 GB physical memory used; 2.2 GB of 2.1 G)
异常问题:Container is running beyond virtual memory limits. Current usage: 119.5 MB of 1 GB physical mem ...
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十一)定制一个arvo格式文件发送到kafka的topic,通过Structured Streaming读取kafka的数据
将arvo格式数据发送到kafka的topic 第一步:定制avro schema: { "type": "record", "name": ...
- spark在集群上运行
1.spark在集群上运行应用的详细过程 (1)用户通过spark-submit脚本提交应用 (2)spark-submit脚本启动驱动器程序,调用用户定义的main()方法 (3)驱动器程序与集群管 ...
- Spark的集群管理器
上篇文章谈到Driver节点和Executor节点,但是如果想要运行Driver节点和Executor节点,就不能不说spark的集群管理器.spark的集群管理器大致有三种,一种是自带的standa ...
- 4. Spark在集群上运行
*以下内容由<Spark快速大数据分析>整理所得. 读书笔记的第四部分是讲的是Spark在集群上运行的知识点. 一.Spark应用组件介绍 二.Spark在集群运行过程 三.Spark配置 ...
- 安装spark ha集群
安装spark ha集群 1.默认安装好hadoop+zookeeper 2.安装scala 1.解压安装包 tar zxvf scala-2.11.7.tgz 2.配置环境变量 vim /etc/p ...
- (二)win7下用Intelij IDEA 远程调试spark standalone 集群
关于这个spark的环境搭建了好久,踩了一堆坑,今天 环境: WIN7笔记本 spark 集群(4个虚拟机搭建的) Intelij IDEA15 scala-2.10.4 java-1.7.0 版本 ...
- Yarn集群的搭建、Yarn的架构和WordCount程序在集群提交方式
一.Yarn集群概述及搭建 1.Mapreduce程序运行在多台机器的集群上,而且在运行是要使用很多maptask和reducertask,这个过程中需要一个自动化任务调度平台来调度任务,分配资源,这 ...
随机推荐
- centos7下源码安装多个nginx步骤完整版
1.下载:wget http://nginx.org/download/nginx-1.10.0.tar.gz 解压:tar -zxvf nginx-1.10.0.tar.gz 2. 执行下面 ...
- ubuntu18.04 递归批量删除op_test_xml/ 目录下 .pyc后缀的文件
find op_test_xml/ -type f -name "*.pyc" -exec rm -f {} \;
- 【转】Chrome 控制台新玩法-console显示图片以及为文字加样式
在正常模式下,一般只能向console 控制台输出简单的文字信息.但为了把信息输出得更优雅更便于阅读,除了cosole.log()方法外还可以调用 cosole.warn() 来输出警告信息,在控制台 ...
- Python:Day42 Position
1 static static 默认值,无定位,不能当作绝对定位的参照物,并且设置标签对象的left.top等值是不起作用的的. 2 position: relative/absolute ...
- 洛谷 P2404 自然数的拆分问题
题目链接 https://www.luogu.org/problemnew/show/P2404 题目背景 木有...... 题目描述 任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和. ...
- Oracle 取前几条记录
今天看了篇文章,对oracle取前几条数据的方式和说明,总结比较全,学习了,做个记录点.oracle 取前10条记录 以下内容是原始文章内容,用于做留存阅读. 1.oracle 取前10条记录 1) ...
- 错误 103 未能加载文件或程序集“Telerik.Web.UI”或它的某一个依赖项。磁盘空间不足。 (异常来自 HRESULT:0x80070070)
运行vs2010时出现错误: 错误 103 未能加载文件或程序集“Telerik.Web.UI”或它的某一个依赖项.磁盘空间不足. (异常来自 HRESULT:0x80070070) 处理方式:清理C ...
- Item 19: 使用srd::shared_ptr来管理共享所有权的资源
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 使用带垃圾回收机制语言的程序员指出并嘲笑C++程序员需要遭受防止资 ...
- python面向对象(封装、继承、多态)+ 面向对象小栗子
大家好,下面我说一下我对面向对象的理解,不会讲的很详细,因为有很多人的博客都把他写的很详细了,所以,我尽可能简单的通过一些代码让初学者可以理解面向对象及他的三个要素. 摘要:1.首先介绍一下面向对象 ...
- 平均精度均值(mAP)——目标检测模型性能统计量
在机器学习领域,对于大多数常见问题,通常会有多个模型可供选择.当然,每个模型会有自己的特性,并会受到不同因素的影响而表现不同. 每个模型的好坏是通过评价它在某个数据集上的性能来判断的,这个数据集通常被 ...