2017-01-09 47 views
0

如何加入RDDS我正在尋找方法來從大的索引處理並行數據, 我想過快照指數(以HDFS),然後提交火花作業要處理的記錄。基於彈性的Hadoop

其他解決方法是使用elastic with spark

我的問題:

  1. 快照API輸出可以是文本文件,而不是二進制文件?
  2. 如何使用spark-elastic並對特定文檔執行子查詢? (可以說我有狗的索引,然後我想找到每隻狗的骨頭)?

------編輯------

我的指標變化不大,有狗指標,一個狗-關係指數。 狗指數:

... 
{ 
    name: "rex", 
    id: 1, 
    ... 
}, 
{ 
    name: "bobby", 
    id : 2, 
    ... 
} 
... 

狗關係指數:

... 
{ 
    first_dog_id: 1, 
    second_dog_id: 2, 
    relation_type: "enemies", 
    ... 
} 
... 

的關係是多到很多,所以每隻狗可以在犬,關係指數許多文件。我想創建2個RDDS(狗&關係),並以某種方式加入他們在內存中沒有廣播的數據(大型索引)

+0

關於2.,我想我會在Spark中首先讀取狗的數據,並將骨頭數據讀入內存中,而不是每次給狗一塊骨頭時都打到ES。 – ImDarrenG

+0

@ImDarrenG我如何將這2個列表合併到內存中?我如何運行第一個RDD的分區並在第二個RDD上查詢? –

+0

我的第一個直覺就是通過某個關鍵點來加入RDD,但假設這不起作用,請提供有關您的用例的更多信息,否則我們只是在猜測? – ImDarrenG

回答

0

鉑1.

我不這麼認爲,據我所知最接近的選項將使用掃描/滾動API(取決於您所在的ES版本):ES v5.1 scroll api。 你可以將你的索引以這種方式導出到文本文件中。

鉑2.

最簡單的方法 - 代碼明智的 - 做你想做什麼(每隻狗文件elasticsearch查詢),將使用彈性的Hadoop加載您dogsRDD,則子查詢行爲,這樣做:

dogsRDD.mapPartitions { dogsPart => 
    // this code is executed by the workers 
    dogsPart.map { dog => 
     // do the dog specific ES queries here 
    } 
} 

但是,您將無法使用elastic-hadoop做你的狗的具體工作就是這樣,你將不得不使用Scala的ES連接器,或HTTP,和ES掃描/滾動api。

你大概就能改善這個跟你有使用情況的更具體的知識,也許你可以拆分爲多個易於管理的步驟IDK的工作。

可能沒有幫助這晚在你的生命週期,但我有一些看法,我想最有建設性的可行方法,使:

  • 我不知道所有的細節很明顯,但是,你用關係術語推理你的文檔表明現有的數據模型會引起更多的麻煩。 ES不會加入。

  • 考慮在寫時間

  • 執行一些聚集在字裏行間讓生活更容易在查詢時,它聽起來就像你有一個大的指數?如果合適的話,你可能會更好地分成更小的索引。我使用基於時間的索引取得了成功。即每天或每月的索引,取決於多少數據。

  • 同樣,這可能不是很有幫助,但是當您使用的數據適合羣集的內存或者可以合理地分解爲基於時間的「分片」時,Spark最有用。或者,也許可以通過將每個步驟的輸出寫入磁盤來釋放內存來減少工作量。我知道這一切都取決於用例!

  • ElasticSearch的主要用例是查詢,根據我的經驗,這對批處理/批量處理用例來說並不好。

只是想我會分享我的一些發現,以防萬一它在一些小的方面有用。 :)