Hive数据同步到ES

Hive2Es

需求

  1. 将Hive的user标签数据同步到ElasticSearch
  2. 每天生成一个index
  3. 将user_id作为文档id

准备工作-集群

  1. Hadoop集群、Hive集群、Yarn集群(用的是CDH)
  2. Spark集群(用的是CDH)
  3. ElasticSearch集群(单独部署的)

准备工作-数据

Hive

  1. Hive表
  • 创建hive分区表(根据当天的日期进行分区)
hive shell #进入hive shell命令行

CREATE TABLE IF NOT EXISTS test_db.user_info ( 
user_id INT COMMENT '用户id',
age INT COMMENT '用户年龄',
name STRING COMMENT '用户姓名'
) COMMENT '服务信息标签表' PARTITIONED BY ( dt string );

  • 插入两条数据
insert into test_db.user_info partition(dt="2019-10-16") values(1,18,'Tom');
insert into test_db.user_info partition(dt="2019-10-16") values(2,20,'Bob');
  • 查询数据是否插入成功
1. 查询最新日期的数据
select * from test_db.user_info where dt in (select dt from test_db.user_info order by dt desc limit 1);

结果:
OK
1	18	Tom	2019-10-16
2	20	Bob	2019-10-16


编码

1.git地址:github.com/yangxifi/spark-study

  1. 注意事项
  • SparkSession初始化(local模式仅用于本地调试流程,部署的服务器上的时候得去掉)
public class SparkEnvUtil {

    public static SparkSession getSparkEnvWithHiveAndEsSup(AppConfig appConfig) {
        SparkSession spark = SparkSession.builder()
                // 注意本地测试完通过后把这行注释掉 不然服务器上启动
                // 会报java.lang.IllegalStateException: User did not initialize spark context!
//                .master("local[*]")
                .appName("hive2esDemo").config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
                .config("spark.kryo.registrator", MyKryoRegistrator.class.getName())
                .config("hive.metastore.uris", appConfig.getHivemetastoreUris())//指定hive的metastore的地址
                .config("spark.sql.warehouse.dir", appConfig.getHiveWarehouseDir())//指定hive的warehouse目录
                .config("es.nodes", appConfig.getEsNodes())//es的nodes
                .config("es.index.auto.create", "true")//配置es自动创建索引
                .enableHiveSupport()
                .getOrCreate();
        return spark;
    }

}
  • 打包(注意排除掉spark、hadoop得包哦)
  • 由于服务器上已经有这部分的包,所以排除掉(避免冲突),而且打得包还会小很多
  • 因此只需要打包此部分工程独有的包(服务器上没有的)
            <!--maven打包插件-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.1.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <artifactSet>
                                <!--排除此部分包,避免和服务器上的包产生冲突-->
                                <excludes>
                                    <exclude>org.apache.hadoop.*</exclude>
                                    <exclude>org.apache.spark.*</exclude>
                                    <exclude>log4j:log4j:jar:</exclude>
                                    <exclude>org.slf4j.*</exclude>
                                </excludes>
                                <!--打包此部分工程独有的包(服务器上没有的)-->
                                <includes>
                                    <include>org.elasticsearch:*:*</include>
                                    <include>org.projectlombok:*:*</include>
                                    <include>commons-httpclient:*:*</include>
                                </includes>
                            </artifactSet>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

服务器部署

  1. mvn clean package打包,丢到服务器的/home/hive2EsDemo目录下

  2. 以yarn-cluster模式启动

vim start-yarn-cluster.sh
脚本内容如下:
#!/bin/sh
/usr/bin/spark-submit --class com.spark.study.EsLoader \
--master yarn \
--deploy-mode cluster \
/home/hive2EsDemo/Hive2Es-Demo.jar \

  1. sh start-yarn-cluster.sh
  2. 执行成功后
  • 查看es的索引命令:curl -X GET “devenv-bigdata-datanode1:9200/_cat/indices?v”

  • 返回
    在这里插入图片描述

  • 查看其中一个文档命令:curl -X GET “devenv-bigdata-datanode1:9200/user_info_20191016/_doc/1?pretty”

  • 返回
    在这里插入图片描述

  1. Bingo-结束
在将数据Hive同步Elasticsearch时,使用Seatunnel 增量同步是一种有效的解决方案。Seatunnel 是一个开源工具,能够实现数据源(如Hive)与目标地(如Elasticsearch)之间的数据同步。 Seatunnel 增量同步实现的基本原理是通过监控数据源中的变化,将新增、更新和删除的数据实时同步Elasticsearch中。当数据源中的数据发生变化时,Seatunnel会捕获变动的数据,并将其同步Elasticsearch中相应的索引中。 具体来说,Seatunnel 增量同步的步骤如下: 1. 安装并配置Seatunnel:首先需要在系统中安装Seatunnel,并进行相应的配置,包括指定HiveElasticsearch的连接信息、定义数据同步的规则等。 2. 监控数据源:Seatunnel会不断地监控Hive中的数据变化。当有新增、更新或删除操作发生时,Seatunnel会将这些变动的数据捕获并记录下来。 3. 数据同步:Seatunnel将捕获到的变动数据转换成Elasticsearch可以接收的格式,并将其同步到相应的索引中。对于新增的数据,Seatunnel会将其插入到Elasticsearch中;对于更新和删除的数据,Seatunnel会根据指定的规则更新或删除Elasticsearch中对应的文档。 通过Seatunnel 增量同步,可以实现Hive数据Elasticsearch的实时同步。这样做的好处是能够保持Elasticsearch中的数据Hive中的数据保持一致,使得Elasticsearch的搜索结果能够及时地反映Hive数据的最新变化。同时,Seatunnel还提供了监控和告警机制,可以实时监控数据同步的状态,并在发生异常时发出警报,保证同步过程的稳定性和可靠性。 总之,Seatunnel 增量同步是一种可靠高效的数据同步方案,能够将Hive中的数据实时同步Elasticsearch中,为企业提供更快速准确地数据查询和分析能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值