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;