Python 错误:SparkContext只能在驱动程序上使用,不能在工作程序上运行的代码中使用。有关更多信息,请参阅SPARK-5063
我目前正在使用ASN 1解码器。我将从生产者那里得到一个十六进制十进制代码,我将在消费者那里收集它。 之后,我将把十六进制代码转换为RDD,然后将十六进制值RDD传递给另一个具有同一类Decode_模块的函数,并将使用python asn1解码器解码十六进制数据,返回并打印它。 我不明白我的代码有什么问题。我已经在工作节点中安装了asn1解析器依赖项。 我调用lambda表达式或其他东西的方式有任何错误 我的错误:异常:似乎您正试图从广播变量、操作或转换引用SparkContext。SparkContext只能在驱动程序上使用,不能在工作程序上运行的代码中使用。有关更多信息,请参阅SPARK-5063 请帮帮我谢谢 我的代码:Python 错误:SparkContext只能在驱动程序上使用,不能在工作程序上运行的代码中使用。有关更多信息,请参阅SPARK-5063,python,python-2.7,lambda,pyspark,pyasn1,Python,Python 2.7,Lambda,Pyspark,Pyasn1,我目前正在使用ASN 1解码器。我将从生产者那里得到一个十六进制十进制代码,我将在消费者那里收集它。 之后,我将把十六进制代码转换为RDD,然后将十六进制值RDD传递给另一个具有同一类Decode_模块的函数,并将使用python asn1解码器解码十六进制数据,返回并打印它。 我不明白我的代码有什么问题。我已经在工作节点中安装了asn1解析器依赖项。 我调用lambda表达式或其他东西的方式有任何错误 我的错误:异常:似乎您正试图从广播变量、操作或转换引用SparkContext。SparkC
class telco_cn:
def __init__(self,sc):
self.sc = sc
print ('in init function')
logging.info('eneterd into init function')
def decode_module(self,msg):
try:
logging.info('Entered into generate module')
### Providing input for module we need to load
load_module(config_values['load_module'])
### Providing Value for Type of Decoding
ASN1.ASN1Obj.CODEC = config_values['PER_DECODER']
### Providing Input for Align/UnAlign
PER.VARIANT = config_values['PER_ALIGNED']
### Providing Input for pdu load
pdu = GLOBAL.TYPE[config_values['pdu_load']]
### Providing Hex value to buf
buf = '{}'.format(msg).decode('hex')
return val
except Exception as e:
logging.debug('error in decode_module function %s' %str(e))
def consumer_input(self,sc,k_topic):
logging.info('entered into consumer input');print(k_topic)
consumer = KafkaConsumer(ip and other values given)
consumer.subscribe(k_topic)
for msg in consumer:
print(msg.value);
a = sc.parallelize([msg.value])
d = a.map(lambda x: self.decode_module(x)).collect()
print d
if __name__ == "__main__":
logging.info('Entered into main')
conf = SparkConf()
conf.setAppName('telco_consumer')
conf.setMaster('yarn-client')
sc = SparkContext(conf=conf)
sqlContext = HiveContext(sc)
cn = telco_cn(sc)
cn.consumer_input(sc,config_values['kafka_topic'])
这是因为
self.decode\u模块
包含SparkContext的实例
要修复代码,可以使用@staticmethod
:
class telco_cn:
def __init__(self, sc):
self.sc = sc
@staticmethod
def decode_module(msg):
return msg
def consumer_input(self, sc, k_topic):
a = sc.parallelize(list('abcd'))
d = a.map(lambda x: telco_cn.decode_module(x)).collect()
print d
if __name__ == "__main__":
conf = SparkConf()
sc = SparkContext(conf=conf)
cn = telco_cn(sc)
cn.consumer_input(sc, '')
有关更多信息:
不能在lambda表达式中引用实例方法(
self.decode_module
),因为实例对象包含SparkContext引用
这是因为PySpark试图在内部对发送给其工作人员的所有内容进行酸洗。因此,当您说它应该在节点内部执行self.decode_module()
时,PySpark会尝试pickle整个(self)对象(其中包含对spark上下文的引用)
要解决这个问题,您只需要从
telco\u cn
类中删除SparkContext引用,并使用不同的方法,比如在调用类实例之前使用SparkContext(就像张的回答所建议的那样).谢谢你的回答。你能解释一下,如果我们在那里使用静态方法,如果我们在那里不使用静态方法,会发生什么情况。当我尝试上面的代码时,它会返回我这个错误类型错误:“JavaPackage”对象不可调用