[英]A single output request from multiple elements of a JavaRDD in Apache Spark Streaming
我的問題是有關Apache Spark Streaming如何通過改進並行化或將許多寫入合並為一個較大的寫入來處理需要很長時間的輸出操作。 在這種情況下,寫操作是對Neo4J的密碼請求,但它可以應用於其他數據存儲。
我有一個用Java寫的Apache Spark Streaming應用程序,它可以寫入2個數據存儲:Elasticsearch和Neo4j。 這些是版本:
當我將Elasticsearch-Hadoop用於Apache Spark庫時,Elasticsearch的輸出非常容易。
我們的輸入是從Kafka接收的關於特定主題的流,我通過map函數反序列化流的元素以創建JavaDStream<[OurMessage]> dataStream
。 然后,我對此消息進行轉換,以創建一個密碼查詢String cypherRequest
(使用OurMessage到String的轉換),該查詢發送到一個單例,該單例管理Bolt Driver與Neo4j的連接(我知道我應該使用連接池,但是也許這是另一個連接池)題)。 密碼查詢根據OurMessage的內容生成許多節點和/或邊。
該代碼如下所示。
dataStream.foreachRDD( rdd -> {
rdd.foreach( cypherQuery -> {
BoltDriverSingleton.getInstance().update(cypherQuery);
});
});
關於如何提高吞吐量,我有兩個想法:
我在想這個嗎? 我已經嘗試了很多研究,以至於我可能太深了。
感謝任何可能提供幫助的人; 這是很長時間以來我的第一個StackOverflow問題,所以請留下反饋,我會響應並根據需要糾正此問題。
我認為我們所需要的只是一個簡單的Map / Reduce。 以下內容將使我們能夠解析RDD中的每條消息,然后將其一次性全部寫入Graph DB。
dataStream.map( message -> {
return (ParseResult) Neo4JMessageParser.parse(message);
}).foreachRDD( rdd -> {
List<ParseResult> parseResults = rdd.collect();
String cypherQuery = Neo4JMessageParser.buildQuery(parseResults);
Neo4JRepository.update(cypherQuery);
// commit offsets
});
這樣,我們應該能夠減少與必須為每個傳入消息進行寫操作相關的開銷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.