HIVE导出数据到Elasticsearch及ES的索引优化

一、导入须知

1、ES作为搜索引擎不只是数据的简单存储,向ES导入数据需要做相应的设置,如手动建立mapping。
2、ES本身的安装参数配置已经很优秀,绝大数情况下不需要修改除内存大小以外的参数。
3、想最佳的优化存储和查询的性能,就要有针对性的根据每一个字段的功能设置相关的属性,es作为搜索引擎通常会给每个字段动态自动映射相应的字段类型并设置最全的默认属性,但是过于冗余,而且动态自动映射的数据类型可能会出现一起麻烦,比如日期数据会自动映射为date类型,当日期中有null字段就会报错终止,所以提前手动建立索引的mapping,单独设定每个字段的属性,同时启用index别名,方便以后重建索引:
4、关于分片数的设定,网上有尽量少的说法,减少分片数可减少合并分片查询结果时的复杂度,同时减少索引段的数量从而提高ES性能。并且有具体的公式:
    节点数<=主分片数*(副本数+1)
但亲测在查询返回数量不多的时候(几个),分片合并查询结果的压力并不大,适当增大分片数可提高查询速度(300万文档复杂查询耗时从2.5s降化为1.6s)

二、关于字段属性的设置 

1、对于不会进行排序和聚合操作的字段,可以禁用该字段的正排索引,也就是"doc_values":false
2、其次数据大小尽量小,字段尽量少
3、可通过慢查询日志发现慢查询
4、搜索结果不要反回过大的数据集,否则使用批量滚动查询
5、避免过大的document,不超100M,耗费大量网络,磁盘,内存资源
6、避免稀疏的数据,否则浪费大量的存储空间
(1)避免将不同结构数据写入同一索引
(2)对document结构进行规范化、标准化,重命名已存在的字段并且对缺少的字段自动生成默认值
(3)如果一个field不需要考虑其相关度分数,那么可以禁用norms,如果不需要对一个field进行排序或者聚合,那么可以禁用doc_values字段。
7、写入时的优化
设置不需要分词的字符串为type=keyword
8、搜索时:
(1)用term搜索不分词
term query相当于SQL中的单个where条件
(2)caching bitset,跟踪query,在最近256个query中超过一定次数的过滤条件,缓存其bitset。对于小segment(<1000,或<3%),不缓存bitset。
(3)filter大部分情况下来说,在query之前执行,先尽量过滤掉尽可能多的数据

(4)query:是会计算doc对搜索条件的relevance score,还会根据这个score去排序
(5)filter:只是简单过滤出想要的数据,不计算relevance score,也不排序
(6)比如postDate=2017-01-01,[0, 0, 1, 1, 0, 0],可以缓存在内存中,这样下次如果再有这个条件过来的时候,就不用重新扫描倒排索引,反复生成bitset,可以大幅度提升性能。以后只要是有相同的filter条件的,会直接来使用这个过滤条件对应的cached bitset

三、案例演示

本案例涉及的字段情况:

id字段:不切词,不设索引,不排序

obtypename字段:不切词,设置索引,不排序
appealcontent字段:切词,设置索引
其他字段不设置评分
使用bool查询
删除:
curl -X DELETE '172.xx.xx.141:9200/ywsldjnrb_index'
先创建mapping

curl -H "Content-Type: application/json" -XPUT 'http://172.xx.xx.141:9200/_all/_settings?preserve_existing=true' -d '{
  "index.refresh_interval" : "120s"
}'
[INFO ][o.e.c.s.IndexScopedSettings] [trs1] updating [index.refresh_interval] from [1s] to [120s]
不存多余字段所以省略id,指定为元数据id
curl -H "Content-Type: application/json" -X PUT '172.xx.xx.141:9200/ywsldjnrb_index3' -d '
{
    "settings":{
    "number_of_shards" : 10,
    "number_of_replicas" : 0
    },
  "mappings": {
    "ywsl_djnrb_type": {
      "properties": {
        "id": {
          "type": "keyword",
          "doc_values":false
        },
        "regunit": {
          "type": "keyword",
          "doc_values":false
        },
        "invopt": {
          "type": "keyword",
          "doc_values":false
        },
        "regtime": {
          "type": "keyword",
          "doc_values":false
        },
        "bjdate": {
          "type": "keyword",
          "doc_values":false
        },
        "ccfkdate": {
          "type": "keyword",
          "doc_values":false
        },
        "incform": {
          "type": "keyword",
          "doc_values":false
        },
        "salemode": {
          "type": "keyword",
          "doc_values":false
        },
        "fknr": {
          "type": "keyword",
          "doc_values":false
        },
        "obtypename": {
          "type": "keyword",
          "doc_values":false
        },
        "applbasquename": {
          "type": "keyword",
          "doc_values":false
        },
        "brandname": {
          "type": "keyword",
          "doc_values":false
        },
        "appealcontent": {
          "type": "keyword",
          "doc_values":false
        },
        "applidique": {
          "type": "text",
          "analyzer": "ik_max_word",
          "search_analyzer": "ik_max_word"
        }
      }
    }
  }
}'

导入时可能ES集群负载较大,临时关闭该索引的刷新,等数据倒完后再启用
curl -H "Content-Type: application/json" -XPUT 'http://172.xx.xx.141:9200/ywsldjnrb_index3/_settings' -d '{
  "index.refresh_interval" : "-1"
}'
恢复索引刷新
curl -H "Content-Type: application/json" -XPUT 'http://172.xx.xx.141:9200/ywsldjnrb_index/_settings' -d '{
  "index.refresh_interval" : "10s"
}'
查看:
curl -X GET 'http://172.16.30.141:9200/_cat/indices?v'
curl -X GET 'http://SHELL2:9200/esindex/estype/_mapping?pretty=true'
创建表:
create external table test(
id string,
regunit string,
brandname string,
invopt string,
regtime string,
bjdate string,
ccfkdate string,
incform string,
salemode string,
applidique string,
fknr string,
obtypename string,
applbasquename string,
appealcontent string
 )
STORED BY "org.elasticsearch.hadoop.hive.EsStorageHandler"
TBLPROPERTIES(
"es.nodes" = "172.xx.xx.141:9200",
'es.mapping.id' = 'id',
"es.resource" = "ywsldjnrb_index3/ywsl_djnrb_type"
);
插入:
"es.mapping.names" = "applbasquename:applbasquename,appealcontent:appealcontent"
hive中执行:
insert overwrite table test select id,regunit,brandname,invopt,regtime,bjdate,ccfkdate,incform,salemode,applidique,fknr,obtypename,applbasquename,appealcontent from default.tmp_ywsl_djnrb ;
若因集群性能问题任务失败,删除es中不完整的索引:
curl -X DELETE 'http://172.xx.xx.141:9200/ywsldjnrb_index3'
在重建索引(略)

四、需要注意的问题

为防止ES和Hive字段不对齐问题:
注:导入不会自动映射字段,es表实际字段与hive映射外表一致,数据顺序与insert顺序一致!所以要保证表与内容一致要hive与insert顺序一致!(很坑,试了好多次才试出来)

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值