pyspark 引入虚拟环境依赖包以及向yarn集群提交任务攻略

以虚拟环境引入project_demo项目包,并向spark yarn提交spark任务为例:

  1. 将project_demo安装到虚拟环境中

1)virtualenv local_venv #创建虚拟环境

2)source local_venv/bin/activate #运行虚拟环境

3)pip install -U git+ssh://[email protected]_demo.git -i http://pypi.xxx.com/simple/ --trusted-host pypi.xxx.com #将project_demo包安装到虚拟环境中

4)zip -r local_venv.zip local_venv #将虚拟环境打包

  1. 向yarn 提交spark代码的脚本

HADOOP_CONF_DIR=/opt/hadoop/etc/hadoop

spark2-submit

–conf spark.pyspark.driver.python=/data/home/xxx/local_venv/bin/python

–conf spark.pyspark.python=./local_venv/local_venv/bin/python

–master yarn

–num-executors 8

–executor-cores 4

–executor-memory 5g

–principal xxx/user

–keytab /data/home/xxx/xxx.keytab

–archives /data/home/xxx/local_venv.zip#local_venv

xxx.py 1> log 2>&1

  1. 参数说明:

  • HADOOP_CONF_DIR #设置hadoop配置文件的目录

  • 指定虚拟环境命令

    –conf spark.pyspark.python=./local_venv/local_venv/bin/python #executor集群端的pyspark配置,即任务执行的机器

    –conf spark.pyspark.driver.python=/data/home/niulijun/local_venv/bin/python #dirver端的pyspark配置,driver端就是你的sparkcontext所在的机器,driver如果是spark-submit yarn-client是当前提交的机器上,如果是yarn-cluster 是随机找一台机器

  • num-executors:#该参数用于设置Spark作业总共要用多少个Executor进程来执行。Driver在向YARN集群管理器申请资源时,YARN集群管理器会尽可能按照你的设置来在集群的各个工作节点上,启动相应数量的Executor进程。这个参数非常之重要,如果不设置的话,默认只会给你启动少量的Executor进程,此时你的Spark作业的运行速度是非常慢的。
    参数调优建议:每个Spark作业的运行一般设置50~100个左右的Executor进程比较合适,设置太少或太多的Executor进程都不好。设置的太少,无法充分利用集群资源;设置的太多的话,大部分队列可能无法给予充分的资源。

  • executor-cores #该参数用于设置每个Executor进程的CPU core数量。这个参数决定了每个Executor进程并行执行task线程的能力。因为每个CPU core同一时间只能执行一个task线程,因此每个Executor进程的CPU core数量越多,越能够快速地执行完分配给自己的所有task线程

  • executor-memory #参数说明:该参数用于设置每个Executor进程的内存。Executor内存的大小,很多时候直接决定了Spark作业的性能,而且跟常见的JVM OOM异常,也有直接的关联。
    参数调优建议:每个Executor进程的内存设置4G8G较为合适。但是这只是一个参考值,具体的设置还是得根据不同部门的资源队列来定。可以看看自己团队的资源队列的最大内存限制是多少,num-executors乘以executor-memory,就代表了你的Spark作业申请到的总内存量(也就是所有Executor进程的内存总和),这个量是不能超过队列的最大内存量的。此外,如果你是跟团队里其他人共享这个资源队列,那么申请的总内存量最好不要超过资源队列最大总内存的1/31/2,避免你自己的Spark作业占用了队列所有的资源,导致别的同学的作业无法运行。

  • **keytab #**作业认证,是spark-submit提交作业的时候,能够接入到kerberos中,从而向YARN提交作业、访问HDFS等等。针对spark-submit的任务,有两种办法通过kerberos认证:

    1. kinit -kt /etc/security/xx.keytab -p xxx/user,然后spark-submit提交即可

    2. 作为参数提供给spark-submit:--keytab /etc/security/xxx.keytab --principal niulijun/user注意紧跟着命令,不要放到最后,否则会被当做spark JOB的参数

  • archives /data/home/niulijun/local_venv.zip#local_venv

    Comma separated list of archives to be extracted into the working directory of each executor:archives是档案馆的意思,将以逗号分隔的档案都提取到每个处理器的工作目录中;

    在本脚本中,将虚拟开发环境的包命名为local_ven,并上传到每个处理器的工作目录中 ;

    注意:zip后的local_venv 不能删,他大概会在这个zip解压后的路径下找到local_venv,然后命名为local_venv。这涉及到配置文件中pyspark 的 python 能否找对

  1. 也可将参数写入spark代码中

import os

os.environ[‘PYSPARK_PYTHON’] = “./local_venv/local_venv/bin/python”

os.environ[‘HADOOP_CONF_DIR’]="/opt/hadoop/etc/hadoop"

conf=SparkConf().setAppName(“rc_data_test”) \

.setMaster(“yarn”) \

.set(“spark.executor.memory”, “6g”) \

.set(‘spark.executor.cores’,‘6’) \

.set(‘spark.executor.instances’,‘80’) \

.set(‘spark.yarn.dist.archives’,‘hdfs:///user/niulijun/local_venv.zip#local_venv’)

sc = SparkContext.getOrCreate(conf)

sc.addPyFile(’./base_spark.py’)

rdd_data = sc.textFile(input_path).repartition(400).mapPartitions(self.deal_partitions)

import commands

command = “kinit -kt /data/home/niulijun/niulijun.keytab -p niulijun/user”

status, output = commands.getstatusoutput(command)

你可能感兴趣的:(spark)