我有如下的pyspark脚本。在此脚本中,我将脚本的stdout和stderr收集到一个文件中并存储在本地。
在此脚本中,我正在循环运行输入文件上的initial函数。
该脚本可以正常运行,但是错误很小。在此脚本中,我正在使用子流程将本地数据移动到其他位置。
我希望此子进程调用在完成循环后运行,但是,它在第一次运行循环时运行,而在第二次运行循环时,则会引发预期的错误。文件存在时会引发错误。
Pyspark脚本
#!/usr/bin/python
import os
import sys
import traceback
import subprocess
import pandas as pd
from datetime import datetime
from pyspark import SparkContext, SparkConf
from pyspark.sql import HiveContext
conf = SparkConf()
sc = SparkContext(conf=conf)
sqlContext = HiveContext(sc)
def initial(
table,
hivedb,
domain,
port,
mysqldb,
mysql_user,
user,
dir,
):
day = datetime.now().strftime('%Y-%m-%d')
month = datetime.now().strftime('%Y-%m')
Linux_path = '/data/logging/{}'.format(input_file)
HDFS_path = '/user/{}/{}/logging/{}/{}/{}'.format(user,dir,mysqldb,month,day)
subprocess.call(["hdfs", "dfs", "-mkdir", "-p", HDFS_path])
subprocess.call(["rm", Linux_path])
so = se = open('/data/logging/{}'.format(input_file), 'a',
0)
#re-open stdout without buffering
sys.stdout = os.fdopen(sys.stdout.fileno(), 'a', 0)
# redirect stdout and stderr to the log file opened above
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
### CODE:
Do something
### if errors the print traceback
### repeat the same for every table in input file
subprocess.call(["hdfs", "dfs", "-put", Linux_path, HDFS_path])
if len(sys.argv) != 9:
print 'Invalid number of args......'
print 'Usage: spark-submit file.py Input_path Output_path'
exit()
input_file = sys.argv[1]
hivedb = sys.argv[2]
domain = sys.argv[3]
port = sys.argv[4]
mysqldb = sys.argv[5]
mysql_user = sys.argv[6]
user = sys.argv[7]
dir = sys.argv[8]
input = \
sc.textFile('/user/{}/{}/{}/args/{}'.format(user,
dir, mysqldb,
input_file)).collect()
for table in input:
initial(
table,
hivedb,
domain,
port,
mysqldb,
mysql_user,
user,
dir,
)
sc.stop()
print '**********************************************************************************************************************************************************************'
如何更改脚本,以便在for循环完成后运行子进程?我需要对脚本进行哪些更改?