【博学谷学习记录】超强总结,用心分享|大数据之ES

Elasticsearch准实时索引原理

ES在保存数据的时候, 分片/分区存储的(shard) 每一个分区/分片对应一个Lucene的实例

  • 每一个shard对应多个文件, segment
  • segment是可以被检索的最小单元, 每一个segment都对应一个倒排索引

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fhnuNCNx-1678104481099)(assets/es5.png)]

当数据写入到ES的分片时, 先会写入内存buffer中(缓冲区), 从buffer中读取数据, 生成segment, 这个过程就是在维护倒排索引

只要生成了内存中的segment数据就可以被检索

从内存中的buffer → 内存中的segment 这个过程叫refresh 默认1s一次

  • refresh触发, 定时默认1s , buffer默认jvm 10% , 也可以手动refresh
  • 如果大批导入数据,可以将定期refresh关掉 -1

在数据写入内存的同时, 数据还会复制一份到磁盘上, 写入到translog文件中, 如果在refresh期间出现了异常, 可以从Translog中把数据恢复回来

当内存中的segments的数据都刷到磁盘上之后, translog会清空, 这个过程Flush

ES默认每30分钟Flush一次, 或者内存中的segments达到512mb 也会触发flush , 也可以手动Flush

segments的合并 es做了更新/删除操作的时候, 不会修改原来的数据, 在merge的时候才会真正的修改

Elasticsearch SQL(了解)
SELECT select_expr [, …]
[ FROM table_name ]
[ WHERE condition ]
[ GROUP BY grouping_element [, …] ]
[ HAVING condition]
[ ORDER BY expression [ ASC | DESC ] [, …] ]
[ LIMIT [ count ] ]
[ PIVOT ( aggregation_expr FOR column IN ( value [ [ AS ] alias ] [, …] ) ) ]

2 数据从Hive导入ES

在数据库【tags_dat】中包含四张表:

1)、用户表:tbl_users 950

2)、订单数据表:tbl_orders 120125

3)、订单商品表:tbl_goods 125463

4)、行为日志表:tbl_logs 376983

Mysql数据通过Sqoop导入到Hive中

  • 创建表 用户表 create-hive-table 创建一个Hive表, 读取mysql的表结构, 使用这个结构来创建Hive表
/export/server/sqoop/bin/sqoop create-hive-table \
--connect jdbc:mysql://up01:3306/tags_dat \
--table tbl_users \
--username root \
--password 123456 \
--hive-table tags_dat2.tbl_users \
--fields-terminated-by '\t' \
--lines-terminated-by '\n'
  • 订单表
/export/server/sqoop/bin/sqoop create-hive-table \
--connect jdbc:mysql://up01:3306/tags_dat \
--table tbl_orders \
--username root \
--password 123456 \
--hive-table tags_dat2.tbl_orders \
--fields-terminated-by '\t' \
--lines-terminated-by '\n'
  • 商品表
/export/server/sqoop/bin/sqoop create-hive-table \
--connect jdbc:mysql://up01:3306/tags_dat \
--table tbl_goods \
--username root \
--password 123456 \
--hive-table tags_dat2.tbl_goods \
--fields-terminated-by '\t' \
--lines-terminated-by '\n'
  • 日志表
/export/server/sqoop/bin/sqoop create-hive-table \
--connect jdbc:mysql://up01:3306/tags_dat \
--table tbl_logs \
--username root \
--password 123456 \
--hive-table tags_dat2.tbl_logs \
--fields-terminated-by '\t' \
--lines-terminated-by '\n'

导入数据

  • 用户数据 direct 直接导出模式 会加快导出速度 使用关系型数据库自带的导出工具(mysql 会使用mysqldump命令)
/export/server/sqoop/bin/sqoop import \
--connect jdbc:mysql://up01:3306/tags_dat \
--username root \
--password 123456 \
--table tbl_users --direct --hive-overwrite --delete-target-dir --fields-terminated-by '\t' --lines-terminated-by '\n' --hive-table tags_dat2.tbl_users --hive-import --num-mappers 1
  • 订单数据
/export/server/sqoop/bin/sqoop import \
--connect jdbc:mysql://up01:3306/tags_dat \
--username root \
--password 123456 \
--table tbl_orders --direct --hive-overwrite --delete-target-dir --fields-terminated-by '\t' --lines-terminated-by '\n' --hive-table tags_dat2.tbl_orders --hive-import --num-mappers 10
  • 商品数据
/export/server/sqoop/bin/sqoop import \
--connect jdbc:mysql://up01:3306/tags_dat \
--username root \
--password 123456 \
--table tbl_goods --direct --hive-overwrite --delete-target-dir --fields-terminated-by '\t' --lines-terminated-by '\n' --hive-table tags_dat2.tbl_goods --hive-import --num-mappers 5
  • 行为日志
/export/server/sqoop/bin/sqoop import \
--connect jdbc:mysql://up01:3306/tags_dat \
--username root \
--password 123456 \
--table tbl_logs --direct --hive-overwrite --delete-target-dir --fields-terminated-by '\t' --lines-terminated-by '\n' --hive-table tags_dat2.tbl_logs --hive-import --num-mappers 20

hive数据导入ES

一 下载 es-hadoop.jar 放到HDFS上, es-hadoop版本要跟 ElasticSearch版本对应

二 创建外部表

create external table if not exists tags_ec_userprofile.ec_tbl_logs(
      -- 字段名字
    ) 
        stored by 'org.elasticsearch.hadoop.hive.EsStorageHandler'
    tblproperties('es.resource'='ec_tbl_logs',   -- index的名字
    'es.nodes'='up01:9200',     -- es机器节点信息
    'es.index.auto.create'='TRUE',   -- 索引自动创建
    'es.index.refresh_interval' = '-1',  -- 定时refresh关闭, 减少refresh次数, 加快导数据过程
    'es.index.number_of_replicas' = '0',  -- es8 可以设置number_of_replicas 副本数量为0 目的加快导数据速度
    'es.batch.write.retry.count' = '6',   -- 重试次数
    'es.batch.write.retry.wait' = '60s'   -- 等待超时时间
    'es.mapping.names'='' -- 如果hive字段信息和ES字段有区别, 可以通过这个配置进行修改 hive字段名字:es字段名字, 
                  -- 如果字段不需要修改的话, 这个可以不配置
                  -- hive表字段名 跟 es表的字段名字不一致需要配置这个mapping names
     -- 注意这些配置信息, 不要手敲, 如果写错了不报错, 只是没有效果             
    );
    -- 使用外部表的原因, 数据实际上没在HDFS上 是在ES集群里, 创建这个外部表实际上就是给es-hadoop传参

三 add jar 把es-hadoopjar包添加到hive classpath下边 add jar 后面接.jar的路径

add jar hdfs:///libs/es-hadoop/elasticsearch-hadoop-7.10.2.jar;

hive命令行中执行

四 把数据从数仓Hive表中查询出来, 插入到刚创建的外部表中(导入到ES中)

insert overwrite table tags_ec_userprofile.ec_tbl_users select *  from tags_dat2.tbl_users;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值