The best elasticsearch highlevel java rest api-----bboss
基于bboss持久层和bboss elasticsearch客户端实现数据库数据导入es案例分享(支持各种数据库和各种es版本)
通过bboss,可以非常方便地将数据库表数据导入到es中:
支持逐条数据导入
批量数据导入
批量数据多线程并行导入
定时全量(串行/并行)数据导入
定时增量(串行/并行)数据导入
支持的数据库: mysql,maridb,postgress,oracle ,sqlserver,db2,tidb,hive等
支持的Elasticsearch版本: 1.x,2.x,5.x,6.x,+
支持海量PB级数据同步导入功能
支持设置数据bulk导入任务结果处理回调函数,对每次bulk任务的结果进行成功和失败反馈,然后针对失败的bulk任务通过error方法进行相应处理
下面详细介绍本案例。
1.案例对应的源码
2.在工程中导入jdbc es maven坐标
com.bbossgroups.plugins
bboss-elasticsearch-rest-jdbc
5.9.5
本文从mysql数据库表td_cms_document导入数据到es中,除了导入上述maven坐标,还需要额外导入mysql驱动坐标:
mysql
mysql-connector-java
5.1.40
3.配置es地址
新建application.properties文件,内容为:
elasticsearch.rest.hostNames=10.21.20.168:9200
## 集群地址用逗号分隔
#elasticsearch.rest.hostNames=10.180.211.27:9200,10.180.211.28:9200,10.180.211.29:9200
4.编写简单的导入代码
4.1同步批量导入
public void testSimpleImportBuilder(){
DB2ESImportBuilder importBuilder = DB2ESImportBuilder.newInstance();
try {
//清除测试表数据
ElasticSearchHelper.getRestClientUtil().dropIndice("dbclobdemo");
}
catch (Exception e){
}
//数据源相关配置,可选项,可以在外部启动数据源
importBuilder.setDbName("test")
.setDbDriver("com.mysql.jdbc.Driver") //数据库驱动程序,必须导入相关数据库的驱动jar包
.setDbUrl("jdbc:mysql://localhost:3306/bboss?useCursorFetch=true") //通过useCursorFetch=true启用mysql的游标fetch机制,否则会有严重的性能隐患,useCursorFetch必须和jdbcFetchSize参数配合使用,否则不会生效
.setDbUser("root")
.setDbPassword("123456")
.setValidateSQL("select 1")
.setUsePool(false);//是否使用连接池
//指定导入数据的sql语句,必填项,可以设置自己的提取逻辑
importBuilder.setSql("select * from td_cms_document");
/**
* es相关配置
*/
importBuilder
.setIndex("dbclobdemo") //必填项
.setIndexType("dbclobdemo") //必填项
.setRefreshOption(null)//可选项,null表示不实时刷新,importBuilder.setRefreshOption("refresh");表示实时刷新
.setUseJavaName(true) //可选项,将数据库字段名称转换为java驼峰规范的名称,例如:doc_id -> docId
.setBatchSize(5000) //可选项,批量导入es的记录数,默认为-1,逐条处理,> 0时批量处理
.setJdbcFetchSize(10000);//设置数据库的查询fetchsize,同时在mysql url上设置useCursorFetch=true启用mysql的游标fetch机制,否则会有严重的性能隐患,jdbcFetchSize必须和useCursorFetch参数配合使用,否则不会生效
/**
* 执行数据库表数据导入es操作
*/
DataStream dataStream = importBuilder.builder();
dataStream.execute();
}
可以直接运行上述代码,查看数据导入效果。
4.2 异步批量导入
public void testSimpleLogImportBuilderFromExternalDBConfig(){
DB2ESImportBuilder importBuilder = DB2ESImportBuilder.newInstance();
try {
//清除测试表
ElasticSearchHelper.getRestClientUtil().dropIndice("dbdemo");
}
catch (Exception e){
}
//数据源相关配置,可选项,可以在外部启动数据源
importBuilder.setDbName("test")
.setDbDriver("com.mysql.jdbc.Driver") //数据库驱动程序,必须导入相关数据库的驱动jar包
.setDbUrl("jdbc:mysql://localhost:3306/bboss?useCursorFetch=true")//通过useCursorFetch=true启用mysql的游标fetch机制,否则会有严重的性能隐患,useCursorFetch必须和jdbcFetchSize参数配合使用,否则不会生效
.setDbUser("root")
.setDbPassword("123456")
.setValidateSQL("select 1")
.setUsePool(false);//是否使用连接池
//指定导入数据的sql语句,必填项,可以设置自己的提取逻辑
importBuilder.setSql("select * from td_sm_log");
/**
* es相关配置
*/
importBuilder
.setIndex("dbdemo") //必填项
.setIndexType("dbdemo") //必填项
.setRefreshOption(null)//可选项,null表示不实时刷新,importBuilder.setRefreshOption("refresh");表示实时刷新
.setUseJavaName(true) //可选项,将数据库字段名称转换为