spark-submit 提交python外部依赖包

需求:使用pyspark的过程中,发现集群的python并没有安装自己需要的包,比如elasticsearch包等,这样就只能靠自己把包打上,然后才能被分发到集群的各台节点机器上,然后被执行,这里举个例子,如何加载自己的外部包

1.创建模块

构建 spark_submit.py

# -*- coding:utf-8 -*-

def spark_submit_test(key):
    return 'execute data:' + str(key)

if __name__ == '__main__':
    result = spark_submit_test('2')
    print result

注意模块名和文件名不要一样

2.压缩文件打包成.zip或者 .egg文件,这样spark-submit中的py-files才能使用上传

压缩文件:zip -r spark_submit.zip spark_submit.py

3.创建需要提交的pyspark任务

这里我把订单号传入自定义的函数模块中进行处理,构建 test.py

# -*- coding:utf-8 -*-
from pyspark import SparkContext, SparkConf, StorageLevel
from pyspark.sql import SQLContext
from pyspark.sql.functions import udf,explode,split,col,concat_ws
from pyspark.sql.types import StringType
from pyspark.sql import SparkSession
from spark_submit import spark_submit_test  # 自己的模块导入方式

spark = SparkSession.builder \
         .appName("spark-submit test") \
         .enableHiveSupport()\
         .getOrCreate()
            
test_own_package = spark.udf.register('test_own_package',spark_submit_test)
result = spark.sql("select order_id ,test_own_package(order_id) as execute_data from xxxxx where dt=20190101 limit 10").collect()
print result

目前的结构树

结构树

$ tree
.
|-- spark_submit.py
|-- spark_submit.zip
`-- test.py
0 directories, 4 files

3.终端提交

spark-submit \
--queue 公司队列 \
--conf 'spark.scheduler.executorTaskBlacklistTime=30000'   \
--driver-memory 10g  \
--executor-memory 12g   \
--conf spark.yarn.executor.memoryOverhead=3000 \
--conf spark.dynamicAllocation.maxExecutors=700  \
--conf spark.network.timeout=240s  \
--conf spark.dynamicAllocation.enabled=true \
--conf spark.executor.cores=2 \
--py-files='spark_submit.zip' \  -- 注意填写自己的绝对路径
test.py  --填写绝对路径
 
 
结果输出
 
[Row(order_id=1762006aaaaa, execute_data=u'execute data:1762006aaaaa'), 
...]
 
成功被捕获进行外部包处理

你可能感兴趣的:(Spark)