Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何在Pyspark中的循环中使用相同的spark上下文_Apache Spark_Pyspark - Fatal编程技术网

Apache spark 如何在Pyspark中的循环中使用相同的spark上下文

Apache spark 如何在Pyspark中的循环中使用相同的spark上下文,apache-spark,pyspark,Apache Spark,Pyspark,我有一个shell脚本,它调用pyspark作业并在配置单元中创建表。剧本写得很好。现在,我们希望减少脚本在调用ascron作业时运行所需的时间,以获得100多个表 下面是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 /

我有一个
shell脚本
,它调用
pyspark
作业并在配置单元中创建表。剧本写得很好。现在,我们希望减少脚本在调用as
cron作业
时运行所需的时间,以获得100多个表

下面是
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表1
/import.sh表2
/import.sh表3
/import.sh表4
等等10次

现在我的问题

每次调用shell脚本时,都会打开一个spark上下文。火花上下文打开大约需要10-12秒。现在,在最后,我们将使用
sc.stop()
关闭spark上下文

因此,如果我想运行脚本,我必须打开100 spark上下文,并在完成作业后关闭它们

我想要的是,在完成作业后,我们可以将相同的
sparkContext
重新用于循环中的另一个表,而不是关闭
sparkContext

我的意思是,当我执行此操作时,
/import.sh table 1
我想使用在该作业中打开的
sparkcontext
来处理循环中下一个表。我指的是
表11

这可能吗


如果是,那么我如何才能做到这一点呢?

这是可能的,但您需要改变一些流程

简单的方法是安装Spark作业服务器()

这将允许您提交多个spark作业,通过适当的配置,甚至可以在应用程序之间共享数据帧

我建议你用这个