最近在做es集群的海量數據寫入,公司的數據量比較大,日均增量達到了5億+,有將近150G的數據,這對es來說,如果用默認的設置和常規的寫入簡直無法完成,哪怕寫進去了,也是大量重復,數據丟失,基本寫不進去。
es的寫入方式有很多種,可以通過logstach直接寫入,可以通過api接口寫入,也可以通過spark寫入,還可以直接從kafka、filebeat、flume之類的寫入。
綜合考慮后,我們選擇了數據先進入hive,然后做清洗和增加uuid等處理。
下面將詳細介紹這次測試的效果和思路,分享給廣大的es開發者們,希望可以給大伙兒有一點幫助吧。
一、底層優化
1.es 配置文件目錄修改JVM.Umm jvm配置那個配置文件 xms xmx堆棧數字設置一定一樣,而且最好都設置為30G,當然內存一定要足夠
2.elasticsearch.yml 加 bootstrap.memory_lock:true 防止系統內存交換,只給es使用
3.需要修改/etc/security/limits.conf 這是對linux系統底層的多線程優化,允許es最大可以並發6萬+線程
* soft nofile 65536
* hard nofile 65536
* soft memlock unlimited
* hard memlock unlimited
4.修改: /etc/sysctl.conf 然后之心 sysctl -p 使其生效 這個操作是,如果系統有其他進程需要臨時用內存還是要允許系統分一點去做其他事兒
vm.swappiness = 1
5.es配置信息和索引設置信息外,es在索引時的時候最好是只設置一個主分片,待數據寫入后,再增加副本數,這樣索引速度會快很多
一、Elasticsearch整理之template使用
es在開發過程中,還是建議使用模板,這樣可以批量設置索引的信息,在數據寫入的時候可以更方便管理,也可以在數據寫入的時候再創建索引,不創建便不占內存空間。
創建模板如下,
PUT _template/template_date_test_index_mapping { "index_patterns": ["date_test_index_*"], "settings": { "number_of_shards":4, "number_of_replicas":0 //副本數默認為0 }, "mappings": { "doc":{ "properties": { "appname":{ "type": "keyword", "index_options": "freqs", "norms": false, "copy_to": "full_name" }, "request_time": { "type": "date", "format":"yyyy-MM-dd HH:mm:ss" } } } } }
二、Elasticsearch整理之settings的設置
以下內容摘自:https://blog.csdn.net/Interstellar_/article/details/81355589 ,當然大家可以去官網看看,會有更詳細的設置信息,我看到這篇博客的博主寫的挺好的就摘下來附上了
//靜態設置:只能在索引創建時或者在狀態為 closed index(閉合的索引)上設置 index.number_of_shards //主分片數,默認為5.只能在創建索引時設置,不能修改 index.shard.check_on_startup //是否應在索引打開前檢查分片是否損壞,當檢查到分片損壞將禁止分片被打開 false //默認值 checksum //檢查物理損壞 true //檢查物理和邏輯損壞,這將消耗大量內存和CPU fix //檢查物理和邏輯損壞。有損壞的分片將被集群自動刪除,這可能導致數據丟失 index.routing_partition_size //自定義路由值可以轉發的目的分片數。默認為 1,只能在索引創建時設置。此值必須小於index.number_of_shards index.codec //默認使用LZ4壓縮方式存儲數據,也可以設置為 best_compression,它使用 DEFLATE 方式以犧牲字段存儲性能為代價來獲得更高的壓縮比例。
//動態設置 index.number_of_replicas //每個主分片的副本數。默認為 1。 index.auto_expand_replicas //基於可用節點的數量自動分配副本數量,默認為 false(即禁用此功能) index.refresh_interval //執行刷新操作的頻率,這使得索引的最近更改可以被搜索。默認為 1s。可以設置為 -1 以禁用刷新。 index.max_result_window //用於索引搜索的 from+size 的最大值。默認為 10000 index.max_rescore_window // 在搜索此索引中 rescore 的 window_size 的最大值 index.blocks.read_only //設置為 true 使索引和索引元數據為只讀,false 為允許寫入和元數據更改。 index.blocks.read // 設置為 true 可禁用對索引的讀取操作 index.blocks.write //設置為 true 可禁用對索引的寫入操作。 index.blocks.metadata // 設置為 true 可禁用索引元數據的讀取和寫入。 index.max_refresh_listeners //索引的每個分片上可用的最大刷新偵聽器數
三、elasticsearch整理之hive寫es的映射配置項
set hive.exec.parallel=true; //設置可以並發執行hive 腳本
set hive.exec.parallel.thread.number=50; //給hive任務足夠多的cpu去執行mr任務,如果有足夠的cpu還可以加更多的,一般寫的慢除了es的問題,hive的任務執行速度也有關系的
add jar ./elasticsearch-hadoop-hive-6.5.0.jar; USE testdb; DROP TABLE IF EXISTS test_20190806; CREATE EXTERNAL TABLE test_20190806 ( cs_uri_stem STRING COMMENT '客戶端訪問的url' ,userid STRING COMMENT '客戶端訪問ID' ,requesttime STRING COMMENT '客戶端提交請求的時間' ,session_id STRING COMMENT '會話id' ,server_port STRING COMMENT '服務器端口號' ,server_ip STRING COMMENT '服務器IP' ,client_ip STRING COMMENT '客戶端IP' ,uuid STRING COMMENT 'uuid' )COMMENT 'ACC日志數據傳入ES外部表' STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' TBLPROPERTIES(
'es.nodes' = 'host1:port1,host2:port2,host3:port3',
'es.resource' = 'index/type_name',
'es.index.auto.create' = 'true',
'es.nodes.wan.only' = 'true',
'es.index.translog.durability' = 'async',
'es.index.translog.sync_interval' = '120s',
'es.index.translog.flush_threshold_size' = '1024mb',
'es.index.translog.flush_threshold_period' = '120m',
'es.index.refresh_interval'='120s',
'es.read.metadata' = 'true',
'es.mapping.id' = 'uuid',
'es.write.operation' = 'upsert',
'es.http.timeout' = '1800s',
'es.batch.write.retry.count' = '-1',
'es.batch.size.bytes' = '20mb',
'es.batch.write.retry.wait' = '900s',
'es.batch.size.entries' = '5000'
)
;
具體的es配置優化可以根據自己的需求到官網找,此處附上配置的官方url:https://www.elastic.co/guide/en/elasticsearch/hadoop/master/configuration.html#cfg-multi-writes
四、elasticsearch整理之mapping字段 的相關配置
名稱 枚舉 作用
enable true/false 僅存儲,不做搜索和聚合分析
index true/false 是否構建倒排索引,false不記錄,即不可搜索
index_options docss/freqs/positions/offsets 存儲倒排索引的哪些信息,text類型默認配置為positions,其他默認為docs ,記錄內容越多,占用空間越大。
norms true/false 是否存儲歸一化的相關參數,如果字段僅用於過濾和聚合分析,可關閉
doc_values true/false 是否開啟,用於排序和聚合分析
field_data true/false 是否為text類型啟用,實現排序和聚合分析
store true/false 是否存儲該字段值
coerce true/false 是否開啟自動數據類型轉換,比如字符串轉數字,浮點轉int(默認是true)
multifields 多字段:靈活使用多字段來解決多樣的業務需求
dynamic true/false/strict 控制mapping的自動跟新
date_detection true/false 是否自動識別日期類型 (建議false,手動去設置格式)
五、_source,_all,store的關系
_source默認會存儲寫入es的json文檔,可通過includes參數指定存儲部分field,也可以通過excludes參數指定那些部分field不存儲,不過查詢的時候只會顯示這里存儲的field,不存的將無法顯示。
_all是默認將所有字段合並,做一個分詞,但是es6以后該字段默認禁用,好像還不能更改,但是可以通過copy_to把需要進行多字段分詞查詢的field指定到一個full_name的字段里,這個字段類似_all的功能
一般來說_source和store必須要存儲一份數據,否則該字段在es中將沒有任何存儲。但是_source里沒有的字段,即便設置field的store為true,該field在查詢結果中也無法顯示。
本段摘自:https://blog.csdn.net/qq_34646817/article/details/82585517