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工具包: https://tst-ganos-bj-public.oss-cn-beijing.aliyuncs.com/hbase/driver_jar/spark/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数据集以支持图像镶嵌操作,具体方式如下

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

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

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

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

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

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

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

2.2 编写入库脚本:

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

{
"spark":{
  "spark_id":"用户sparkid",
  "spark_oss":"用户oss地址",
  "spark_jar":"ganos raster jar包地址",
  "spark_httpfs":"http://用户sparkid-master2-001.spark.rds.aliyuncs.com:14000",
  "livy_server":"http://用户sparkid-master1-001.spark.rds.aliyuncs.com:8998",
  "driver-memory":"8G",
  "driver-cores":4,
  "num-executors":4,
  "executor-memory":"4G",
  "executor-cores":4,
  "cover":"cover数据集名称",
},
"input":{
    "format": "multiband-geotiff",
    "name": "图层名称",
    "cache": "NONE",
    "backend": {
        "type": "oss",
        "path":"oss地址"
    }
},
"output":{
    "backend": {
        "type": "hbase",
        "profile":"hbase",
        "path": "图层存储Tile表名称"
    },
    "reprojectMethod": "buffered",
    "pyramid": true,
    "tileSize": 256,
    "keyIndexMethod": {
        "type": "zorder"
    },
    "resampleMethod": "nearest-neighbor",
    "layoutScheme": "zoomed",
    "crs": "EPSG:3857"
  	"attributeTable":"Ganos Raster Tile元数据表名称"
},
"backend":{
    "backend-profiles": [{
    	"name":"hbase",
    	"type":"hbase",
     "master":"master",
    	"hbase-name":"hbase",
    	"zookeepers":"HBase Zookeepers链接地址"
    }
    ]
}
}
			

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

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接口提交服务器运行了,请求地址为

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

参数列表如下:

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

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

echo '{
	"livy_server":"http://[用户spark_id]-master1-001.spark.rds.aliyuncs.com:8998",
    "httpfs":"http://[用户spark_id]-master2-001.spark.rds.aliyuncs.com:14000",
 	"spark_id":"[用户spark_id]",
 	"spark_oss":"oss地址",
	"input":{
			"format": "temporal-geotiff",
	 }
	 .....
	}'
> params.json

curl localhost:20180/geoserver/geomesa/geojson/raster/etl 
	-H 'Content-type: application/json' \ 
    -d @params.json
			

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

{
    "job_id": 131,
    "resource_id": "ccaf0607-7009-4ed2-a9c9-a1b8f5b2b03b",
    "params": {
        "output": {
            "path": "tile表名",
            "resampleMethod": "average",
            "layoutScheme": "zoomed",
            "temporalResolution": 3600000,
            "crs": "ESRI:4326",
            "reprojectMethod": "per-tile"
        },
        "input": {
            "path": "oss://ganos-test/MTSAT",
            "timeTag": "TIFFTAG_DATETIME",
            "timeFormat": "yyyy-MM-dd HH:mm:ss",
            "format": "temporal-geotiff",
            "name": "layer名称"
        },
        "spark_id": "[用户spark_id]",
        "livy_server": "http://[用户spark_id]-master1-001.spark.rds.aliyuncs.com:8998",
        "httpfs": "http://[用户spark_id]-master2-001.spark.rds.aliyuncs.com:14000",
        "driver-memory": "8G",
        "num-executors": 4,
        "spark_oss": "spark oss地址",
        "backend": {
            "zookeepers": "zookeeper地址"
        },
        "driver-cores": 4,
        "executor-cores": 4,
        "executor-memory": "6G"
    },
    "status": "STARTING"
}
			

2.4 查看工作列表

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

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

参数列表如下:

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

实例1:

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

返回内容:

{
    "jobs": {
        "from": 0,
        "total": 1,
        "sessions": [
            {
                "id": 131,
                "state": "success",
                "appId": "application_1556160980419_0137",
                "appInfo": {
                    "driverLogUrl": "https://[用户spark_id]-nginx-master1-001.spark.rds.aliyuncs.com/spark-master3-1/node/containerlogs/container_1556160980419_0137_01_000001/livy",
                    "sparkUiUrl": "https://[用户spark_id]-nginx-master1-001.spark.rds.aliyuncs.com/proxy/application_1556160980419_0137/"
                },
                "log": [
                    "\t tracking URL: http://[用户spark_id]-master1-1:9088/proxy/application_1556160980419_0137/",
                    "\t user: livy",
                    "19/06/02 15:53:25 INFO ShutdownHookManager: Shutdown hook called",
				     ......
                ]
            }
        ]
    }
}
			

2.5 查看工作列表

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

参数列表如下:

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

实例1:

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

返回内容:

{
    "job_id": 131,
    "job_info": {
        "id": 131,
        "state": "success",
        "appId": "application_1556160980419_0137",
        "appInfo": {
            "driverLogUrl": "https://[用户spark_id]-nginx-master1-001.spark.rds.aliyuncs.com/spark-master3-1/node/containerlogs/container_1556160980419_0137_01_000001/livy",
            "sparkUiUrl": "https://[用户spark_id]-nginx-master1-001.spark.rds.aliyuncs.com/proxy/application_1556160980419_0137/"
        },
        "log": [
            "\t tracking URL: http://spark-master1-1:9088/proxy/application_1556160980419_0137/",
            "\t user: livy",
            "19/06/02 15:53:25 INFO ShutdownHookManager: Shutdown hook called",
		  	.......
        ]
    },
    "status": "SUCCESS"
}
			

2.6 访问Livy Server 查看任务队列

访问Spark的Livy服务,可以看到已经完成和正在进行的ETL任务队列: