全部产品

栅格入库

更新时间:2019-08-13 10:04:32

栅格入库

1. 准备工作

在使用Ganos Raster ETL工具(以下简称ETL)进行数据入库前,首先需要完成以下操作:

1.1 配置Spark集群

ETL需要Spark集群作为运行环境Spark负责原始文件的加载、重投影、拼接、生成数据分块以及入库等操作。
第1步:创建Spark集群,具体请参考:
https://help.aliyun.com/document_detail/93900.html?spm=a2c4g.11186623.6.585.70482e22jbAKMJ

第2步:然后下载ETL工具包:
http://ganos-public.oss-cn-beijing.aliyuncs.com/ganos-raster-etl-1.0-SNAPSHOT.jar
下载完成后,在spark的“资源管理”中创建lib文件目录与job文件目录,如下图所示:

并将下载的ganos-raster-etl-1.0-SNAPSHOT.jar放在lib目录下。

1.2 原始栅格数据已经上传到OSS

ETL运行时会根据用户指定的OSS文件路径来加载数据.

2. 栅格数据入库

2.1 创建Cover

在进行入库操作前,用户可以选择是否创建cover数据集以支持图像镶嵌操作,具体方式如下

  1. curl '[地址]:[端口]/geoserver/geomesa/geojson/raster/cover/:cid/?

其中cid为创建cover数据集的名称。创建完成后可以通过下面方式获取所有cover的列表:

  1. curl '[地址]:[端口]/geoserver/geomesa/geojson/raster/cover

如果需要删除指定cover可以通过DELETE方法指定删除的cover对象:

  1. curl '[地址]:[端口]/geoserver/geomesa/geojson/raster/cover/:cid -X DELETE

用户也可以通过granules方法获取cover中所有图层的信息:

  1. curl '[地址]:[端口]/geoserver/geomesa/geojson/raster/cover/granules/:cid

2.2 编写入库脚本:

栅格数据入库前首先需要编写ETL运行配置文件。配置文件分为四个模块:基本运行配置,input参数,output参数以及backend参数,一个简单的配置文件如下所示:

  1. {
  2. "spark":{
  3. "spark_id":"用户sparkid",
  4. "spark_oss":"用户oss地址",
  5. "spark_jar":"ganos raster jar包地址",
  6. "spark_httpfs":"http://用户sparkid-master2-001.spark.rds.aliyuncs.com:14000",
  7. "livy_server":"http://用户sparkid-master1-001.spark.rds.aliyuncs.com:8998",
  8. "driver-memory":"8G",
  9. "driver-cores":4,
  10. "num-executors":4,
  11. "executor-memory":"4G",
  12. "executor-cores":4,
  13. "cover":"cover数据集名称",
  14. },
  15. "input":{
  16. "format": "multiband-geotiff",
  17. "name": "图层名称",
  18. "cache": "NONE",
  19. "backend": {
  20. "type": "oss",
  21. "path":"oss地址"
  22. }
  23. },
  24. "output":{
  25. "backend": {
  26. "type": "hbase",
  27. "profile":"hbase",
  28. "path": "图层存储Tile表名称"
  29. },
  30. "reprojectMethod": "buffered",
  31. "pyramid": true,
  32. "tileSize": 256,
  33. "keyIndexMethod": {
  34. "type": "zorder"
  35. },
  36. "resampleMethod": "nearest-neighbor",
  37. "layoutScheme": "zoomed",
  38. "crs": "EPSG:3857"
  39. "attributeTable":"Ganos Raster Tile元数据表名称"
  40. },
  41. "backend":{
  42. "backend-profiles": [{
  43. "name":"hbase",
  44. "type":"hbase",
  45. "master":"master",
  46. "hbase-name":"hbase",
  47. "zookeepers":"HBase Zookeepers链接地址"
  48. }
  49. ]
  50. }
  51. }

下面分别解释配置文件中各个参数的意义。

Spark基础配置属性

基础配置属性定义了执行Spark ETL任务时的系统环境有关的一些变量,具体如下:

属性名
livy_server Spark集群提供的Livy Server地址
spark_httpfs 辅助文件上传路径
spark_id Spark分析集群实例ID
spark_jar Ganos Raster jar包地址
spark_oss Spark提供的OSS地址,用于存放各种资源
driver-memory spark运行参数,运行Spark集群driver节点分配内存数量
driver-cores spark运行参数,driver节点分配的core数量
num-executors spark运行参数,executor个数
executor-memory spark运行参数,每个executor节点分配的内存大小
executor-cores spark运行参数,每个executor节点分配的core数目
cover cover数据集名称

注意:上述spark运行参数需要根据具体文件大小与文件数量进行配置。

input参数

input模块负责定义数据源的属性,其具体参数定义如下表所示:

属性名
format 指定遥感栅格数据类型:{geotiff|multiband-geotiff}
name 图层名称
path 原始文件OSS路径,该路径可以时单个文件,也可以是文件目录。当指定为文件目录时,该目录下所有文件会进行拼接,然后作为一个图层进行入库。

format:数据转换格式:

geotiff 单波段栅格数据,以Tile RDD方式读取数据
multiband-geotiff 多波段栅格数据,以MultibandTile RDD方式读取数据

output参数

output模块负责定义数据输出的具体属性,其具体参数定义如下表所示:

属性名
path Tile存储路径
reprojectMethod 重投影方法:{per-tile|buffered}
resampleMethod 重采样方法 :{nearest-neighbor|bilinear|cubic-convolution|cubic-spline|average}
layoutScheme Tile组织模式: {zoomed|local}
crs 投影CRS信息
attributeTable Ganos Raster Tile元数据表名称

参数解释:
reprojectMethod:重投影处理方式

per-tile 处理单个数据块,不考虑相邻数据块值。处理速度块,处理结果不如buffered方式
buffered 处理单个数据块时考虑相邻数据块值。处理较慢,需要进行大量数据交换,处理结果最好

resampleMethod:重采样方法

nearest-neighbor 最邻近
bilinear 双线性
cubic-convolution 三次立方卷积
cubic-spline 三次样条曲线
average 平均值

layoutScheme:数据块组织模式

zoomed 按照TMS标准进行全球尺幅分块并创建金字塔,采用Web Mercator投影方式
local 按照数据本地图副范围和坐标系进行分块,左上角编号为(0,0)

这两种方式的对比效果如下图:

请注意,ZoomedLayoutScheme需要知道从CRS获取的世界范围,以便构建TMS金字塔布局。这可能会导致输入栅格的重新采样以匹配TMS各层级的分辨率。

backend参数

backend定义了用于数据分块存储的存储方式,具体属性如下:

属性名
zookeepers HBase Ganos zookeepers地址

2.3 提交任务

编写好JSON格式的任务运行参数后,就可以通过rest接口提交服务器运行了,请求地址为

  1. curl '[地址]:[端口]/geoserver/geomesa/geojson/raster/etl

参数列表如下:

URL raster/etl
请求体 GeoJSON格式表示的参数集合
成功消息 Code: 200 Content: 启动Spark Job 的 ID
失败消息 Code: 400 -参数不完成 Content: empty

实例1:
将上面设计的JSON文件启动Spark ETL任务:

  1. echo '{
  2. "livy_server":"http://[用户spark_id]-master1-001.spark.rds.aliyuncs.com:8998",
  3. "httpfs":"http://[用户spark_id]-master2-001.spark.rds.aliyuncs.com:14000",
  4. "spark_id":"[用户spark_id]",
  5. "spark_oss":"oss地址",
  6. "input":{
  7. "format": "temporal-geotiff",
  8. }
  9. .....
  10. }'
  11. > params.json
  12. curl localhost:20180/geoserver/geomesa/geojson/raster/etl
  13. -H 'Content-type: application/json' \
  14. -d @params.json

如果运行成功,服务器会返回Spark启动的ETL任务的id,具体如下:

  1. {
  2. "job_id": 131,
  3. "resource_id": "ccaf0607-7009-4ed2-a9c9-a1b8f5b2b03b",
  4. "params": {
  5. "output": {
  6. "path": "tile表名",
  7. "resampleMethod": "average",
  8. "layoutScheme": "zoomed",
  9. "temporalResolution": 3600000,
  10. "crs": "ESRI:4326",
  11. "reprojectMethod": "per-tile"
  12. },
  13. "input": {
  14. "path": "oss://ganos-test/MTSAT",
  15. "timeTag": "TIFFTAG_DATETIME",
  16. "timeFormat": "yyyy-MM-dd HH:mm:ss",
  17. "format": "temporal-geotiff",
  18. "name": "layer名称"
  19. },
  20. "spark_id": "[用户spark_id]",
  21. "livy_server": "http://[用户spark_id]-master1-001.spark.rds.aliyuncs.com:8998",
  22. "httpfs": "http://[用户spark_id]-master2-001.spark.rds.aliyuncs.com:14000",
  23. "driver-memory": "8G",
  24. "num-executors": 4,
  25. "spark_oss": "spark oss地址",
  26. "backend": {
  27. "zookeepers": "zookeeper地址"
  28. },
  29. "driver-cores": 4,
  30. "executor-cores": 4,
  31. "executor-memory": "6G"
  32. },
  33. "status": "STARTING"
  34. }

2.4 查看工作列表

任务启动成功后,用户可以查看目前正在运行的ETL任务列表:

  1. curl '[地址]:[端口]/geoserver/geomesa/geojson/raster/etl/jobs

参数列表如下:

URL raster/etl /jobs
成功消息 Code: 200 Content: Spark启动的所有Job 的 ID
失败消息 Code: 400

实例1:

  1. curl localhost:20180/geoserver/geomesa/geojson/raster/etl/jobs

返回内容:

  1. {
  2. "jobs": {
  3. "from": 0,
  4. "total": 1,
  5. "sessions": [
  6. {
  7. "id": 131,
  8. "state": "success",
  9. "appId": "application_1556160980419_0137",
  10. "appInfo": {
  11. "driverLogUrl": "https://[用户spark_id]-nginx-master1-001.spark.rds.aliyuncs.com/spark-master3-1/node/containerlogs/container_1556160980419_0137_01_000001/livy",
  12. "sparkUiUrl": "https://[用户spark_id]-nginx-master1-001.spark.rds.aliyuncs.com/proxy/application_1556160980419_0137/"
  13. },
  14. "log": [
  15. "\t tracking URL: http://[用户spark_id]-master1-1:9088/proxy/application_1556160980419_0137/",
  16. "\t user: livy",
  17. "19/06/02 15:53:25 INFO ShutdownHookManager: Shutdown hook called"
  18. ......
  19. ]
  20. }
  21. ]
  22. }
  23. }

2.5 查看工作列表

  1. curl '[地址]:[端口]/geoserver/geomesa/geojson/raster/etl/status/:jobid

参数列表如下:

URL raster/etl /jobs
URL参数 jobid:ETL任务的id
成功消息 Code: 200 Content: 指定id的任务的当前运行状态
失败消息 Code: 400

实例1:

  1. curl localhost:20180/geoserver/geomesa/geojson/raster/etl/status/123

返回内容:

  1. {
  2. "job_id": 131,
  3. "job_info": {
  4. "id": 131,
  5. "state": "success",
  6. "appId": "application_1556160980419_0137",
  7. "appInfo": {
  8. "driverLogUrl": "https://[用户spark_id]-nginx-master1-001.spark.rds.aliyuncs.com/spark-master3-1/node/containerlogs/container_1556160980419_0137_01_000001/livy",
  9. "sparkUiUrl": "https://[用户spark_id]-nginx-master1-001.spark.rds.aliyuncs.com/proxy/application_1556160980419_0137/"
  10. },
  11. "log": [
  12. "\t tracking URL: http://spark-master1-1:9088/proxy/application_1556160980419_0137/",
  13. "\t user: livy",
  14. "19/06/02 15:53:25 INFO ShutdownHookManager: Shutdown hook called",
  15. .......
  16. ]
  17. },
  18. "status": "SUCCESS"
  19. }