1. 程式人生 > >關於spark執行FP-growth演算法報錯com.esotericsoftware.kryo.KryoException

關於spark執行FP-growth演算法報錯com.esotericsoftware.kryo.KryoException

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