Elasticsearch-jdbc数据同步配置

来源:互联网 发布:微软平板软件下载 编辑:程序博客网 时间:2024/06/08 12:49

一、 简介
在使用 Elasticsearch 的时候,经常会涉及到要将其它数据源的数据导入到 Elasticsearch 中,在使用logstash进行数据同步的时候发现在大批量数据同步过程中效率不高,所以在实现数据导入和增量索引用到一个Elasticsearch 的插件 elasticsearch-jdbc。本文档中使用的资源和版本为:Elasticsearch 版本:2.4.1;elasticsearch-jdbc 版本 :2.3.4.0;java版本:1.8
二、 安装 Elasticsearch -jdbc
jdbc 的压缩包我已经放在了/home/hadoop目录下,可以去它的 GitHub地址 获取对应版本的压缩包。
执行cd /home/Hadoop
unzip ./elasticsearch-jdbc-2.3.4.zip
三、 使用jdbc
1、数据源导入
首先执行全部数据导入(注:ES 使用的是默认配置),写一个名叫oracle_ar01.sh的bash脚本,并放在/home/hadoop/elasticsearch-jdbc-2.3.4.0/bin下面,脚本内容如下

执行:./bin/oracle_ar01.sh

文件内容如下:

!/bin/sh

DIR=”$( cd "$( dirname “${BASH_SOURCE[0]}” )” && pwd )”
bin=/home/hadoop/elasticsearch-jdbc-2.3.4.0/bin
lib=/home/hadoop/elasticsearch-jdbc-2.3.4.0/lib

echo ’
{
“type” : “jdbc”,
“jdbc” : {
“url” : “jdbc:oracle:thin:@192.168.10.198:1521:qzj04db”,
“statefile” : “ar01.json”,
“schedule” : “0 0-59 0-23 ? * *”,
“user” : “xzjck”,
“password” : “qzj04dbdba”,
“sql” :”SELECT jaa001||jar052 AS \”_id\”,JAR054,JAR051,JAR053,JAR058,JAR005,JAR057,JAR055,JAR052,JAR056,JAR003,JAA002,JAA001,JAR002,JAR004 FROM t_arj_01”,
“index” : “ar01”,
“type” : “jdbc”,
“ignore_null_values” : true,
“metrics”: {
“enabled” : true
},
“elasticsearch” : {
“cluster” : “elasticsearch”,
“host” : “192.168.10.197”,
“port” : 9300
}
}
}
’ | java \
-cp “${lib}/*” \
-Dlog4j.configurationFile=${bin}/log4j2.xml \
org.xbib.tools.Runner \
org.xbib.tools.JDBCImporter
执行后会自动创建 ar01索引(若不存在),jdbc 类型 和几个对应的字段,若执行失败,请查看日志文件,jdbc 的日志存放在 /home/hadoop/elasticsearch-jdbc-2.3.4.0/bin/logs /jdbc.log 查看是否导入成功。
系统运维部 > Elasticsearch-jdbc数据同步配置 > image2016-11-4 16:57:11.png
内容已成功导入到 Elasticsearch 中
2、增量索引、更新
如果我们对数据做了更改或是有新数据加入,若再执行全部导入,就有点得不偿失了 。这里我们就要用到jdbc 的两个属性 statefile(状态文件) 和 schedule(计划任务时间),并且 sql 语句也要改成动态的 。改动如下:
“statefile” : “oracle-ar01.json”,
“schedule” : “0 0-59 0-23 ? * *”,
“sql” :[
{“statement” :”SELECT jaa001||jar052 AS \”_id\”,JAR054,JAR051,JAR053,JAR058,JAR005,JAR057,JAR055,JAR052,JAR056,JAR003,JAA002,JAA001,JAR002,JAR004 FROM t_arj_01 where abg018 > ?”,
“parameter” : [ “$metrics.lastexecutionstart” ]
}
],
改动后的完整文件 oracle-ar01.sh

!/bin/sh

DIR=”$( cd "$( dirname “${BASH_SOURCE[0]}” )” && pwd )”
bin=/home/hadoop/elasticsearch-jdbc-2.3.4.0/bin
lib=/home/hadoop/elasticsearch-jdbc-2.3.4.0/lib

echo ’
{
“type” : “jdbc”,
“jdbc” : {
“url” : “jdbc:oracle:thin:@192.168.10.198:1521:qzj04db”,
“statefile” : “ar01.json”,
“schedule” : “0 0-59 0-23 ? * *”,
“user” : “xzjck”,
“password” : “qzj04dbdba”,
“sql” :[{“statement” :”SELECT jaa001||jar052 AS \”_id\”,JAR054,JAR051,JAR053,JAR058,JAR005,JAR057,JAR055,JAR052,JAR056,JAR003,JAA002,JAA001,JAR002,JAR004 FROM t_arj_01 where abg018 > ?”,
“parameter” : [ “$metrics.lastexecutionstart” ]}],
“index” : “ar01”,
“type” : “jdbc”,
“ignore_null_values” : true,
“metrics”: {
“enabled” : true
},
“elasticsearch” : {
“cluster” : “elasticsearch”,
“host” : “192.168.10.197”,
“port” : 9300
}
}
}
’ | java \
-cp “${lib}/*” \
-Dlog4j.configurationFile=${bin}/log4j2.xml \
org.xbib.tools.Runner \
org.xbib.tools.JDBCImporter
运行该文件hadoop@Slave1:~/elasticsearch-jdbc-2.3.4.0/bin$ sh oracle_ar01.sh可以看到 命令行端被占用,一直在运行,并且在oracle-ar01.sh 的同级目录下生成了一个 oracle-ar01.json 的文件,sql 语句中需要的数据 lastexecutionstart 就保存在该文件中。
在我们来改动一下ORACLE 中的数据,增加一条数据
INSERT INTO t_arj_01 (jaa001,jar052,abg018)VALUES(‘testjdbc’,’test’,SYSDATE)
最多等一分钟,再看看ES 中的数据
系统运维部 > Elasticsearch-jdbc数据同步配置 > image2016-11-4 16:57:28.png
测试成功。 为了让 oracle-ar01.sh后台执行,我们可以使用 nohup 命令。当我们想停止执行的时候。使用 kill 命令关闭进程,
至此,Oracle数据源的 增量索引和更新就完成了。
3、bash 文件释义
增量索引的bash文件注释如下,更多详细配置请查阅官方文档

!/bin/sh

当前脚本的绝对路径

DIR=”$( cd "$( dirname “${BASH_SOURCE[0]}” )” && pwd )”
bin=/home/hadoop/elasticsearch-jdbc-2.3.4.0/bin
lib=/home/hadoop/elasticsearch-jdbc-2.3.4.0/lib

echo ’
{
“type” : “jdbc”,
“jdbc” : {
# 链接 Oracle的 xzjck数据库
“url” : “jdbc:oracle:thin:@192.168.10.198:1521:qzj04db”,
# 计划任务状态文件
“statefile” : “ar01.json”,
# 计划任务时间 这里是每分钟执行一次
“schedule” : “0 0-59 0-23 ? * *”,
#用户名
“user” : “xzjck”,
#密码
“password” : “qzj04dbdba”,
# 执行导入的sql 语句
“sql” :[{“statement” :”SELECT jaa001||jar052 AS \”_id\”,JAR054,JAR051,JAR053,JAR058,JAR005,JAR057,JAR055,JAR052,JAR056,JAR003,JAA002,JAA001,JAR002,JAR004 FROM t_arj_01 where abg018 > ?”,
“parameter” : [ “$metrics.lastexecutionstart” ]}],
# 索引名称 jdbctest
“index” : “ar01”,
# 类型名称 article
“type” : “jdbc”,
#空值是否显示
“ignore_null_values” : true,
“metrics”: {
“enabled” : true
},
“elasticsearch” : {
“cluster” : “elasticsearch”,
“host” : “192.168.10.197”,
“port” : 9300
}
}
}
’ | java \
-cp “${lib}/*” \
-Dlog4j.configurationFile=${bin}/log4j2.xml \
org.xbib.tools.Runner \
org.xbib.tools.JDBCImporter
这里选几个属性来介绍一下
url:数据库链接串,所以把这个链接串改成其它数据源,这个脚本也可以使用(前提是那个数据源中有对应的 t_arj_01表)
statefile :计划任务状态文件名称。它长这样:
{
“type” : “jdbc”,
“jdbc” : {
“schedule” : “0 0-59 0-23 ? * *”,
“password” : “qzj04dbdba”,
“elasticsearch” : {
“host” : “192.168.10.197”,
“cluster” : “elasticsearch”,
“port” : “9300”
},
“ignore_null_values” : “true”,
“index” : “ar01”,
“statefile” : “ar01.json”,
“metrics” : {
“lastexecutionstart” : “2016-11-04T08:23:00.083Z”,
“lastexecutionend” : “2016-11-04T08:23:00.135Z”,
“counter” : “27”,
“enabled” : “true”
},
“type” : “jdbc”,
“user” : “xzjck”,
“url” : “jdbc:oracle:thin:@192.168.10.198:1521:qzj04db”,
“sql” : [ {
“statement” : “SELECT jaa001||jar052 AS \”_id\”,JAR054,JAR051,JAR053,JAR058,JAR005,JAR057,JAR055,JAR052,JAR056,JAR003,JAA002,JAA001,JAR002,JAR004 FROM t_arj_01 where abg018 >?”,
“parameter” : [ “$metrics.lastexecutionstart” ]
} ]
}
}
其实 jdbc 每次执行的就是这个文件,执行完成后就覆盖此文件,改变的只是 metrics 属性内的时间,而 lastexecutionstart 这个时间就是我们下面 sql 语句要用到的最后更新时间
schedule : 计划任务时间表。表示多久执行一次更新。下面有几个例子
0 0-59 0-23 ? * *:每分钟执行一次
0 0/5 0-23 ? * * :每五分钟执行一次;当分钟等于 0,5,10,15…55的时候执行
我还是贴一个官方的字段描述
字段名称
允许的值
允许的特殊字符
Seconds
0-59
, - * /
Minutes
0-59
, - * /
Hours
0-23
, - * /
Day-of-month
1-31
, - * ? / L W
Month
1-12 or JAN-DEC
, - * /
Day-of-Week
1-7 or SUN-SAT
, - * ? / L #
Year (Optional)
empty, 1970-2199
, - * /
sql:支持两种方式,一种是直接写sql语句,一种是有条件的sql语句。一般我们会在sql语句中使用”field as _id “这样的方式来指定这条数据在ES 中的唯一标识(field字段为唯一标识)
parameter 属性中的可选的动态参数有
$now - the current timestamp
$state - the state, one of: BEFORE_FETCH, FETCH, AFTER_FETCH, IDLE, EXCEPTION
$metrics.counter - a counter
$lastrowcount - number of rows from last statement
$lastexceptiondate - SQL timestamp of last exception
$lastexception - full stack trace of last exception
$metrics.lastexecutionstart - SQL timestamp of the time when last execution started
$metrics.lastexecutionend - SQL timestamp of the time when last execution ended
$metrics.totalrows - total number of rows fetched
$metrics.totalbytes - total number of bytes fetched
$metrics.failed - total number of failed SQL executions
$metrics.succeeded - total number of succeeded SQL executions
在我们的例子中sql使用:SELECT jaa001||jar052 AS \”_id\”,JAR054,JAR051,JAR053,JAR058,JAR005,JAR057,JAR055,JAR052,JAR056,JAR003,JAA002,JAA001,JAR002,JAR004 FROM t_arj_01 where abg018 > ?表示获取更新时间(abg018)大于 最后执行时间($metrics.lastexecutionstart)的所有数据。在配置id的时候注意,在更新数据中是根据id进行更新操作的,所以例子中使用主键作为id。

原创粉丝点击