相关代码段:
文件1:master.py
# Spark Imports
from pyspark import SparkContext,SparkConf
from pyspark.streaming import StreamingContext
from pyspark.sql import SQLContext
#Import self defined function
from helper import enrichment
def ingestion(sc,ssc):
# Work with stream
kafkaStream = KafkaUtils.createStream(ssc, zkQuorum, "streaming-consumer", {topic: 1})
# Call function defined in helper.py
enriched_data = kafkaStream_json.map(lambda single_log:enrichment(single_log,client_id,machine_id))
if __name__ == "__main__":
# Name of Spark App
conf = SparkConf().setAppName("Test")
# Spark and Spark streaming configuration
sc = SparkContext(conf=conf)
ssc = StreamingContext(sc, 1)
ingestion(sc,ssc)
# Start the stream and keep it running unless terminated
ssc.start()
ssc.awaitTermination()
文件2:helper.py
from pyspark import SparkContext, SparkConf
from pyspark.sql import SQLContext
def enrichment():
test_df = pd.DataFrame(some operations...)
spark_df = sqlContext.createDataFrame(test_df)
...
它的流式传输部分工作正常,但是当我调用函数enrichment
时,根据使用情况,我将面临以下问题:
案例1:运行以上示例时,内容为:
spark_df = sqlContext.createDataFrame(test_df)
NameError: global name 'sqlContext' is not defined
案例2:当我将spark Context作为参数传递时,这是显示的消息:
”异常:似乎您正在尝试引用 来自广播变量,操作或转换的SparkContext。 SparkContext只能在驱动程序上使用,不能在其运行的代码中使用 对工人。有关更多信息,请参阅SPARK-5063。“
这是我找到的最接近的解决方案: ERROR:SparkContext can only be used on the driver, not in code that it run on workers. For more information, see SPARK-5063
但是,它似乎无法解决我的问题。任何线索将不胜感激。
我需要将它们作为两个单独的文件使用,内联将不起作用。使用以下代码运行代码:
sudo $SPARK_HOME/spark-submit --master local[2] /home/user/master.py
答案 0 :(得分:1)
我认为您应该使用SparkSession。
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('abc').getOrCreate()
您可以将spark作为参数传递给浓缩函数:
def enrichment(spark):
test_df = pd.DataFrame(some operations...)
spark_df = spark.createDataFrame(test_df)
...
或:
def enrichment():
spark = SparkSession.builder.getOrCreate()
test_df = pd.DataFrame(some operations...)
spark_df = spark.createDataFrame(test_df)
...