需求:使用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'),
...]
成功被捕获进行外部包处理