I have a python script called spark.py. This scipt will be invoked using a shell script in Linux.
The spark.py is like below:
#!/usr/bin/env python
import sys
import os
if len(sys.argv) != 2:
print "Invalid number of args......"
print "Usage: spark-submit file.py Arguments"
exit()
table=sys.argv[1]
hivedb=sys.argv[2]
from pyspark import SparkContext, SparkConf
conf = SparkConf()
sc = SparkContext(conf=conf)
from pyspark.sql import HiveContext
sqlContext = HiveContext(sc)
from datetime import datetime
df.registerTempTable('mytempTable')
date=datetime.now().strftime('%Y-%m-%d %H:%M:%S')
try:
sqlContext.sql("create table {}.`{}` as select * from mytempTable".format(hivedb,table))
except Exception as e:
status = 'fail'
error_message = e
else: # Executes only if no Exception.
status = 'success'
error_message = 'No error'
print error_message
print ("{},{},{},{},{}".format(hivedb,table,date,status,error_message))
if status != 'success': sys.exit(1)
sc.stop()
The shell.sh is like below
#!/bin/bash
source /home/$USER/source.sh
[ $# -ne 2 ] && { echo "Usage : $0 input file "; exit 1; }
table=$1
hivedb=$2
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 to get the status of the job creation
function log_status
{
status=$1
message=$2
if [ "$status" -ne 0 ]; then
echo "$result" | tee -a "${failed_logs}"
else
echo "$result" | tee -a "${success_logs}"
fi
}
result=$(spark-submit --name "Spark" --master "yarn-client" /home/$USER/spark.py ${table} ${hivedb})
g_STATUS=$?
log_status $g_STATUS "$result"
In this shell script I am collecting the output of the spark.py as a variable. When I do so I am unable to see any print commands of the spark.py in the console logs in Linux.
How can I have all the print commands to be printed in the linux console logs.
And In my spark.py script I have
print error_message
print ("{},{},{},{},{}".format(hivedb,table,date,status,error_message))
How can I exclude the print error_message while collecting the output as a variable in the shell.sh .
Advertisement
Answer
A simple way would be to add echo "$result" to your shell script. You could also revise the sub command to add a tee at the end: result=$(... | tee /dev/stderr ).