零,应用场景
刚刚接触arcgis不久,最近有需求增量同步其他数据库的地理数据到arcgis server 使用的sql server数据库中,升级为Geodatabase的sqlserver数据库不方便直接往数据表中更新数据,更新数据只能通过其预制的存储过程(猜想),提供的feature access接口,或者重新发布更新后的要素,要从其他数据库自动同步数据到已经发布的图层,本文介绍一种kettle+feature access的方案。
为什么用kettle呢?1. 快,接触水壶两天就走通技术路线了;2.能够Post;3.水壶好像很受欢迎。
feature access提供的rest api有增删查改操作,怎么发布feature access服务这里就不再描述,可以参考arcgis文档。
feature access REST接口增量同步数据的具体需求尚不明确,但无非是:1,只更新,2,只新增,3,更新又新增,4,增删改,这个以后再深入探讨,本文主要讨论通过kettle的post请求功能来进行要素的同步。
本文将从kettle小白的角度实现一个简单的技术demo,有待完善的地方欢迎一起研究。
一,kettle安装
kettle是一款不错的ETL工具,可以省下写原生代码进行ETL的功夫。
首先下载kettle,下载页在这里:下载页,找到Downloads下载即可。
下载页下载完毕,解压压缩包,双击运行Spoon.bat就可进入kettle的可视化操作界面,忘了说了,要想使用kettle得先准备好java环境,本人使用的是64位jdk1.8.1,如果启动过程出现问题可以使用SpoonDebug.bat进行启动,然后检查SpoonDebug.txt进行排错。
调试工具二,数据库连接和表输入
进入勺子(Spoon.bat),新建一个“转换(transformation)”任务,这个“转换”就负责执行我们同步数据的具体流程。新建“表输入”,在“编辑”中设置好数据库连接(这里以mysql为例),
数据库连接设置好数据库字符集,不设置字符集可能导致乱码,
设置字符集点击“获取SQL查询语句”选择需要导入的表和选择需要同步的字段,在增量更新的应用场景中需要在SQL中限制数据的更新日期或创建日期,并使用kettle记录最近一次同步的日期,这个以后再讨论。这里可以限制从表导入的数据的行数。
数据选择三,POST请求参数的封装
在“转换”中新建一个JavaScript脚本,然后按住Shift从刚刚建立的“表输入”中拖拉一个箭头指向JS脚本,这个箭头将表输入的数据传输给JS脚本,一行一行地传输的,因此在JS脚本中是一行一行地处理的(有多行同时处理的方法吗?)。
JS脚本建设通过这个JS脚本完成下一步POST请求的参数的封装,这里需要查看一下Feature Access接口的API Reference,在熟悉Kettle之前建议先使用Postman确认接口参数的正确性。本文以新增要素(Add Features)功能作为示范,这个接口是可以同时更新多个要素的,但是由于JS脚本是一条一条处理数据的(由于懒),本文示范一条一条地POST。在这里我们拼装features(待更新要素),f(返回值格式),rollbackOnFailure(失败后回滚)三个参数。其中features参数的拼装最为麻烦,需要将数据放入json,然后再调用JSON.stringify(str);。
API REFRENCEKETTLE中JS脚本的流程是输入一行数据,经过一番处理后指定输出的字段,JS脚本将指定的字段通过箭头输出到下一步操作。左侧红框内是上一步输入到该步的数据,可以在脚本中直接操作,下面红框是指定的输出字段,这些字段将输出到下一步作为参数。我们也将POST请求的URL和Header在这里生成。“获取变量”按钮可以自动从代码中指定输出字段,同时还可以自动检查语法错误。
JS脚本
四,每一条记录POST的设置
加入一个“Http Post”任务,或者“Rest Client”也可以,从上一步拉出箭头来接上。
Post参数传递从上一步输入的字段中选择好请求地址,设置好字符集,在Output fields里面指定该步骤输出字段的名称,后面日志输出要用。
General设置点击进入Fields,设置好请求的参数,设置好Header参数。注意请求的参数名要和Feature Access中参数名对应哦。
POST参数的Mapping五,POST结果当做日志输出
新建“文本文件输出”,从上一步输入“result”字段作为日志内容。
更新日志的输出选择好存放的文件夹,扩展名,本案例中其他参数使用默认就行了。
文本输出在“字段”中选择输出到日志中的字段,该文本将会累计所有的行的日志并将它们一口气输出为一个文件。调试过程中日志的打印尤其关键。
字段输出
六,测试结果
完成,调试一条数据,成功运行!是不是很方便呢,比徒手写原生代码同步快多了。
总体过程测试1000条数据,耗时16.4秒。这个案例每一条数据post一次,在生产环境中可以积累所有的数据post一次完成。
运行记录数据源字段如图,来源百度地图POI。
数据源更新结果可以马上在arcgis server 中查看。
效果七,OVERVIEW
乱码问题:
在调试中遇到数据提交到sqlserver乱码的情况,最后检查为Arcgis Server内置Tomcat配置的问题,折腾了半天加上一段配置解决问题。
Tomcat配置重复并作为本地程序运行:
作为本地程序(或服务)更轻便,更方便启停。
在勺子中建立一个job,job中调用刚刚创建的转换,在START设置循环时间:
循环时间同步前检查网络状况,同步结束后将日志发送到邮箱内。
检查网络,发送邮件新建一个批处理程序(.bat),编辑内容如下(根据实际情况修改盘符和kitchen.bat所在位置):
d:
cd D:\data-integration
kitchen /file:D:\data-integration\samples\jobs\firstjob.kjb
也可以通过命令行运行该job:
参考文献总结:
第一次写技术文章,刚刚上手kettle两天还不知道怎么一次处理多行数据,后面会继续记录使用kettle进行增量同步的过程。
网友评论