我有shell script
调用pyspark
作业并在Hive中创建表。该脚本工作正常。现在希望减少脚本在调用cron jobs
时运行的时间超过100 tables
。
import.sh
脚本位于下方。
#!/bin/bash
source /home/$USER/source.sh
[ $# -ne 1 ] && { echo "Usage : $0 table "; exit 1; }
table=$1
TIMESTAMP=`date "+%Y-%m-%d"`
touch /home/$USER/logs/${TIMESTAMP}.success_log
touch /home/$USER/logs/${TIMESTAMP}.fail_log
success_logs=/home/$USER/logs/${TIMESTAMP}.success_log
failed_logs=/home/$USER/logs/${TIMESTAMP}.fail_log
function log_status
{
status=$1
message=$2
if [ "$status" -ne 0 ]; then
echo "`date +\"%Y-%m-%d %H:%M:%S\"` [ERROR] $message [Status] $status : failed" | tee -a "${failed_logs}"
#echo "Please find the attached log file for more details"
exit 1
else
echo "`date +\"%Y-%m-%d %H:%M:%S\"` [INFO] $message [Status] $status : success" | tee -a "${success_logs}"
fi
}
#Executing Spark job with python script
spark-submit --name "SparkJob" --driver-memory 2g --executor-memory 4g --num-executors 3 --conf "spark.yarn.executor.memoryOverhead=709" --conf "spark.yarn.driver.memoryOverhead=209" /home/$USER/import.py ${table} ${mysqldb} ${hivedb} ${domain} ${port} ${username} ${password}
g_STATUS=$?
log_status $g_STATUS "SPARKJOB ${table} EXECUTION"
echo "*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"
import.py
pyspark脚本位于
#!/usr/bin/env python
import sys
from pyspark import SparkContext, SparkConf
from pyspark.sql import HiveContext
conf = SparkConf()
sc = SparkContext(conf=conf)
sqlContext = HiveContext(sc)
#Condition to specify exact number of arguments in the spark-submit command line
if len(sys.argv) != 8:
print "Invalid number of args......"
print "Usage: spark-submit file.py Input_path Output_path"
exit()
table=sys.argv[1]
mysqldb=sys.argv[2]
hivedb=sys.argv[3]
domain=sys.argv[4]
port=sys.argv[5]
username=sys.argv[6]
password=sys.argv[7]
#Get table from MYSQL as a Data Frame into Spark
df = sqlContext.read.format("jdbc").option("url", "{}:{}/{}".format(domain,port,mysqldb)).option("driver", "com.mysql.jdbc.Driver").option("dbtable","{}".format(table)).option("user", "{}".format(username)).option("password", "{}".format(password)).load()
df.registerTempTable('mytempTable')
# Create Table in Hive using the temptable
sqlContext.sql("create table {}.`{}` as select * from mytempTable".format(hivedb,table))
sc.stop()
我使用上面的脚本获得了预期的结果。
我能够从MYSQL
数据库获取数据到PYSPARK
,然后能够在HIVE
中创建表格。此外,我可以收集每个sparkjob
的日志。
例如,我有100个表要从MYSQL
导入到HIVE
。
我将此shell脚本安排为cronjob。这个shell脚本将在循环中并行运行10次。
我的意思是./import.sh table1
,./import.sh table2
,./import.sh table3
,./import.sh table4
等等10次
Now my question
每次调用shell脚本时,都会打开一个spark上下文。打开火花环境大约需要10-12秒。现在最后我们使用sc.stop()
关闭了spark上下文。
所以如果我想运行脚本,我必须打开100个spark上下文并在完成作业后关闭它们。
我想要的是在完成作业后关闭spark context
而不是在循环中为另一个表重用相同的sparkContext
。
我的意思是当我执行此操作./import.sh table1
时,我想使用在此作业中打开的sparkcontext
作为循环中接下来的表。我的意思是table 11
。
这可能吗?
如果是,那么我该如何实现呢?
答案 0 :(得分:1)