栅格入库
栅格入库
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数据集以支持图像镶嵌操作,具体方式如下
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任务队列:
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论