2016-03-04 97 views
3

編輯#2:這可能與內存有關。日誌顯示出堆外。flatMap找到編譯錯誤:TraversableOnce [String]必需:TraversableOnce [String]

是的,絕對與內存有關。基本上,docker日誌會報告所有來自java的垃圾堆,但jupyter web筆記本不會將其傳遞給用戶。相反,用戶會遇到內核故障和偶爾的奇怪行爲,例如代碼編譯不正確。


星火1.6,特別docker run -d .... jupyter/all-spark-notebook

想在約1萬宗交易的文件數賬戶。

這很簡單,它可以做到沒有火花,但我碰到了一個奇怪的錯誤嘗試火花斯卡拉。

輸入數據是類型RDD[etherTrans]其中etherTrans是包含單個事務的自定義類型:時間戳,來自和去往賬戶以及在以太事務中處理的值。

 
class etherTrans(ts_in:Long, afrom_in:String, ato_in:String, ether_in: Float) 
extends Serializable { 
    var ts: Long = ts_in 
    var afrom: String = afrom_in 
    var ato: String = ato_in 
    var ether: Float = ether_in 
    override def toString():String = ts.toString+","+afrom+","+ato+","+ether.toString  
} 

data:RDD[etherTrans]看起來不錯:

 
data.take(10).foreach(println) 

etherTrans(1438918233,0xa1e4380a3b1f749673e270229993ee55f35663b4,0x5df9b87991262f6ba471f09758cde1c0fc1de734,3.1337E-14) 
etherTrans(1438918613,0xbd08e0cddec097db7901ea819a3d1fd9de8951a2,0x5c12a8e43faf884521c2454f39560e6c265a68c8,19.9) 
etherTrans(1438918630,0x63ac545c991243fa18aec41d4f6f598e555015dc,0xc93f2250589a6563f5359051c1ea25746549f0d8,599.9895) 
etherTrans(1438918983,0x037dd056e7fdbd641db5b6bea2a8780a83fae180,0x7e7ec15a5944e978257ddae0008c2f2ece0a6090,100.0) 
etherTrans(1438919175,0x3f2f381491797cc5c0d48296c14fd0cd00cdfa2d,0x4bd5f0ee173c81d42765154865ee69361b6ad189,803.9895) 
etherTrans(1438919394,0xa1e4380a3b1f749673e270229993ee55f35663b4,0xc9d4035f4a9226d50f79b73aafb5d874a1b6537e,3.1337E-14) 
etherTrans(1438919451,0xc8ebccc5f5689fa8659d83713341e5ad19349448,0xc8ebccc5f5689fa8659d83713341e5ad19349448,0.0) 
etherTrans(1438919461,0xa1e4380a3b1f749673e270229993ee55f35663b4,0x5df9b87991262f6ba471f09758cde1c0fc1de734,3.1337E-14) 
etherTrans(1438919491,0xf0cf0af5bd7d8a3a1cad12a30b097265d49f255d,0xb608771949021d2f2f1c9c5afb980ad8bcda3985,100.0) 
etherTrans(1438919571,0x1c68a66138783a63c98cc675a9ec77af4598d35e,0xc8ebccc5f5689fa8659d83713341e5ad19349448,50.0) 

接下來的這個函數解析確定,是這樣寫的,因爲早期的嘗試是Array[String]List[String]TraversableOnce[?]之間抱怨類型不匹配的:

def arrow(e:etherTrans):TraversableOnce[String] = Array(e.afrom,e.ato)

但是隨後在flatMap中使用這個函數獲取所有帳戶的RDD [String]失敗。

 
val accts:RDD[String] = data.flatMap(arrow) 

Name: Compile Error 
Message: :38: error: type mismatch; 
found : etherTrans(in class $iwC)(in class $iwC)(in class $iwC)(in class $iwC) => TraversableOnce[String] 
required: etherTrans(in class $iwC)(in class $iwC)(in class $iwC)(in class $iwC) => TraversableOnce[String] 
     val accts:RDD[String] = data.flatMap(arrow) 
              ^
StackTrace: 

確保您向右滾動才能看到它抱怨TraversableOnce[String] 不匹配TraversableOnce[String]

爲更加肆無忌憚的類型不匹配的Generate List of Pairs出現這必須是一個相當普遍的問題,雖然有ISN」足夠的上下文,建議在I have a Scala List, how can I get a TraversableOnce?

這是怎麼回事?


編輯:以上報告的問題不會出現,代碼工作正常,在老年火花外殼,星火1.3.1獨立運行的泊塢窗容器。使用jupyter/all-spark-notebook docker容器在spark 1.6 scala jupyter環境中運行錯誤。

而且@ zero323說,這種玩具例子:

 
val rdd = sc.parallelize(Seq((1L, "foo", "bar", 1))).map{ case (ts, fr, to, et) => new etherTrans(ts, fr, to, et)} 
rdd.flatMap(arrow).collect 

在終端火花外殼1.6.0/2.10.5火花,也斯卡拉2.11.7爲他工作和Spark 1.5.2作爲工作好。

+0

作品只是罰款我。你測試過這個外部筆記本嗎? – zero323

+0

不,我沒有。讓我看看Docker容器中是否有火花外殼... – Paul

+0

@ zero323 Docker容器中有一個火花外殼,但是我只是從文本數據中讀取一些奇怪的內存問題。你如何測試這個?你是用spark-shell還是編譯器測試編譯問題?如果你正在運行它,你打電話sc.parallelize我拋出的數據,還是別的?當然,你不必運行它來測試編譯。 – Paul

回答

0

我認爲你應該切換到用例類,它應該工作正常。使用「常規」類時,在序列化它們時可能會出現奇怪的問題,而且它看起來像所有需要的都是值對象,所以case類看起來更適合您的用例。

一個例子:

case class EtherTrans(ts: Long, afrom: String, ato: String, ether: Float) 

val source = sc.parallelize(Array(
    (1L, "from1", "to1", 1.234F), 
    (2L, "from2", "to2", 3.456F) 
)) 

val data = source.as[EtherTrans] 

val data = source.map { l => EtherTrans(l._1, l._2, l._3, l._4) } 

def arrow(e: EtherTrans) = Array(e.afrom, e.ato) 

data.map(arrow).take(5) 
/* 
res3: Array[Array[String]] = Array(Array(from1, to1), Array(from2, to2)) 
*/ 

data.map(arrow).take(5) 
// res3: Array[Array[String]] = Array(Array(from1, to1), Array(from2, to2)) 

如果需要,你可以創建一些方法/對象來生成case類。 如果你真的不需要爲你的邏輯「toString」方法,而只是爲了「演示」,請將它放在case類之外:在存儲if或者顯示它之前,你總是可以使用map操作來添加它。

另外,如果你是在星火1.6.0或更高版本,你可以嘗試使用DataSet API,而不是,那會顯得或多或少是這樣的:

val data = sqlContext.read.text("your_file").as[EtherTrans] 

https://databricks.com/blog/2016/01/04/introducing-spark-datasets.html

相關問題