1

使用spark java查看對elasticsearch的低寫入次數。Spark +彈性搜索寫入性能問題

下面是使用13.xlarge機ES羣集配置

4 instances each have 4 processors. 
Set refresh interval to -1 and replications to '0' and other basic 
configurations required for better writing. 

火花:

2節點EMR集羣

2 Core instances 
    - 8 vCPU, 16 GiB memory, EBS only storage 
    - EBS Storage:1000 GiB 

1 Master node 
    - 1 vCPU, 3.8 GiB memory, 410 SSD GB storage 

ES索引具有16個碎片在映射中定義。

運行作業時有以下配置,

executor-memory - 8g 
spark.executor.instances=2 
spark.executor.cores=4 

,並使用

es.batch.size.bytes - 6MB 
es.batch.size.entries - 10000 
es.batch.write.refresh - false 

這個配置,我嘗試加載100萬文件(每個文件的大小1300個字節),因此它每個ES節點的負載爲500條記錄/文檔。

和火花日誌我看到每個任務

-1116 bytes result sent to driver 

星火代碼

JavaRDD<String> javaRDD = jsc.textFile("<S3 Path>"); 
    JavaEsSpark.saveJsonToEs(javaRDD,"<Index name>"); 

而且,當我看着在ES集羣中的所有網絡圖是非常低的,我看EMR不通過網絡發送大量數據。有沒有一種方法可以告訴Spark發送正確數量的數據以加快寫入速度?

OR

有沒有,我很想念來調整任何其他配置。 原因我看到每秒每個實例的500docs更低。有人可以請指導我是什麼這個設置缺少提高我上課寫入性能提前

+0

在你的s3目錄中,你正在閱讀單個文件還是多個文件? –

+0

使用許多文件 – camelBeginner

回答

0

謝謝您可在這裏有一個問題。 spark.executor.instances=2

您僅限於兩個執行程序,您可以根據羣集配置使用兩個執行程序。我會改變這個4或更大。我也可以嘗試executor-memory = 1500M,cores = 1,instances = 16。我喜歡在我的記憶中留下一點點開銷,這就是爲什麼我從2G降到1.5G(但你不能做1.5G,所以我們必須做1500M)。如果你通過你的執行者連接,這將提高性能。

需要一些代碼進一步調試。我想知道你是否僅在你的驅動程序中連接到彈性搜索,而不是在你的工作節點中。這意味着你只能得到一個連接,而不是每個執行者一個連接。

+0

非常感謝Dan,當你說執行者增加到4時,你的意思是增加EMR集羣有4個實例而不是2個?我連接到ES的方式是通過下面的代碼。 SparkConf conf = new SparkConf()。setAppName(「SparkES Application」); – camelBeginner

+0

SparkConf conf = new SparkConf()。setAppName(「SparkES Application」); (「es.nodes」,「」); conf.set(「es.batch.size.bytes」,「6mb」); conf.set(「es.batch.size.entries」,「10000」); conf.set(「es.batch.concurrent.request」,「4」); conf.set(「es.batch.write.refresh」,「false」); conf.set(「spark.kryoserializer.buffer」,「24」); JavaSparkContext jsc = new JavaSparkContext(conf); JavaRDD javaRDD = jsc.textFile(「S3 PATH」); JavaEsSpark.saveJsonToEs(javaRDD,「Index name」); – camelBeginner

+0

和上面的最後兩行是在一個方法中,並從main()調用,我發送一個參數在loadSNindex(jsc)方法中使用; – camelBeginner