關於spark執行FP-growth演算法報錯com.esotericsoftware.kryo.KryoException
阿新 • • 發佈:2019-01-30
Spark執行FP-growth異常報錯
在spark1.4版上嘗試執行頻繁子項挖掘演算法是,照搬官方提供的python案例原始碼時,爆出該錯誤com.esotericsoftware.kryo.KryoException (java.lang.IllegalArgumentException: Can not set final scala.collection.mutable.ListBuffer field org.apache.spark.mllib.fpm.FPTree$Summary.nodes to scala.collection.mutable.ArrayBuffer
解決辦法
在第二篇中有個指出了這是序列輸出可能引起的錯誤,spark採用的kryo序列化方式比JavaSerializer方式更快,但是在1.4版本的spark上會產生錯誤,故解決方案是,要麼在spark-defaults.conf中替換,要麼只執行中直接替換,現提供執行指令碼testfp.py:
from pyspark import SparkContext, SparkConf
from pyspark.mllib.fpm import FPGrowth
if __name__ == "__main__":
conf = SparkConf().setAppName("pythonFP" ).set("spark.serializer", "org.apache.spark.serializer.JavaSerializer")
sc = SparkContext(conf=conf)
data = sc.textFile("data/mllib/sample_fpgrowth.txt")
transactions = data.map(lambda line: line.strip().split(' '))
model = FPGrowth.train(transactions, minSupport=0.5, numPartitions=10 )
result = model.freqItemsets().collect()
for fi in result:
print(fi)
sc.stop()
關鍵指出在於重新* *定義conf環境中的序列化類,然後利用spark提供的指令碼執行命令即可正常執行(PS:採用最新版的spark也可解決此問題):
spark-submit –master=spark://namenode1-sit..com:7077,namenode2-sit..com:7077 testfp.py