這幾天用spark和es寫(xiě)了點(diǎn)統(tǒng)計(jì)和查詢,記錄下這過(guò)程中踩過(guò)的一些坑。
先說(shuō)說(shuō)spark中的坑吧,記得之前在書(shū)上看spark算子的時(shí)候,是這么說(shuō)action和transformation的區(qū)別的:transformation變換/轉(zhuǎn)換算子:這種變換并不觸發(fā)提交作業(yè),完成作業(yè)中間過(guò)程處理。action行動(dòng)算子:這類算子會(huì)觸發(fā) sparkcontext 提交 job 作業(yè)。
當(dāng)時(shí)看過(guò)之后也沒(méi)太在意這句話,可是這幾天真正實(shí)踐的時(shí)候出現(xiàn)了一個(gè)百思不得其解的問(wèn)題。好吧,當(dāng)我信心滿滿的寫(xiě)完一堆map,filter,groupby的時(shí)候開(kāi)始調(diào)試,問(wèn)題來(lái)了,map函數(shù)的斷點(diǎn)死活進(jìn)不去,頓時(shí)開(kāi)始懷疑人生......后來(lái)偶然間和一個(gè)網(wǎng)友討論這事兒,才得知這里的奧秘,map屬于transformation,它是會(huì)延遲加載的,只有當(dāng)你調(diào)用了rdd.collect才會(huì)觸發(fā)map去執(zhí)行,也就是上面說(shuō)的那兩類算子的區(qū)別。
第二個(gè)問(wèn)題,我要從es里面查詢每天的流量數(shù)據(jù),然后拿到里面的每條數(shù)據(jù)根據(jù)ip分組統(tǒng)計(jì)該ip的訪問(wèn)次數(shù),然后就噌噌寫(xiě)完了,當(dāng)時(shí)想的是用es查詢,分組統(tǒng)計(jì)直接spark reducebykey。寫(xiě)慣了java面向?qū)ο蟮拇a,自然而然的就在循環(huán)里調(diào)了連接spark-es的context,然后reducebykey了。很顯然這樣功能是實(shí)現(xiàn)了,但是性能卻會(huì)有很大影響,而且spark的函數(shù)有點(diǎn)類似于面向過(guò)程的思想,這么調(diào)用顯然不符合思想,最終換成了es的分組聚合。
最后一個(gè)es的奇葩的問(wèn)題,按照時(shí)間范圍搜索的時(shí)候,明明有數(shù)據(jù)在那個(gè)范圍內(nèi),死活就是搜索不出來(lái),后來(lái)發(fā)現(xiàn)mapping里這個(gè)字段竟然是string類型的,好坑,然后各種刪mapping,再重建。最后把那個(gè)字段的日期定義成了date,再次搜索完美解決,還需要注意一個(gè)地方,時(shí)間的查詢條件最好寫(xiě)成毫秒值,那樣的話就不會(huì)出現(xiàn)什么日期轉(zhuǎn)化異常,省的在這上面浪費(fèi)時(shí)間了。
剛接觸es好多坑還需要繼續(xù)踩,歡迎有用到這些技術(shù)的朋友一起探討!