前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >geotrellis使用(二十九)迁移geotrellis至1.1.1版

geotrellis使用(二十九)迁移geotrellis至1.1.1版

作者头像
魏守峰
发布2018-04-28 17:18:26
8720
发布2018-04-28 17:18:26
举报
文章被收录于专栏:点滴积累点滴积累

目录

  1. 前言
  2. 升级过程
  3. 总结

一、前言

       由于忙着安装OpenStack等等各种事情,有半年的时间没有再亲密的接触geotrellis,甚至有半年的时间没能畅快的写代码。近来OpenStack折腾的稍见成效,历经九九八十一Failure后成功的在16台服务器上搭建了云平台,于是干了一件疯狂的事情——在OpenStack上创建建立几台虚拟机,并用他们搭建了Hadoop集群,完事将之前的geotrellis代码运行在集群上。一切看似很顺利,但是我是个有强迫症的人,一看geotrellis已经升级到了1.1.1版,那么我也就赶紧将自己的代码升级到此版本,于是有了本篇文章。

二、升级过程

       从1.0版升级到1.1.1版变化不是非常大,主要是以下几个方面的变化:

2.1 废弃spray,改用akka发布http服务

       之前geotrellis的习惯方式是使用spray来发布http服务,这样会造成总总的版本冲突,前面我还专门有写文章来探讨版本冲突及解决方案。1.1.1版直接使用akka发布http服务,而无需spray便少了很多冲突的可能性。build.sbt文件如下:

代码语言:javascript
复制
import scala.util.Properties

val gtVersion = "1.1.1"
val scalaV = "2.11.8"
val sparkV = "2.1.0"
val hadoopV = "2.7.1"
val akkaActorVersion = "2.4.17"
val akkaHttpVersion  = "10.0.3"

name := "GeoTrellis-SJZX"
scalaVersion := Properties.propOrElse("scala.version", scalaV)
crossScalaVersions := Seq("2.11.8", "2.10.6")
organization := "com.sjzx"
licenses := Seq("Apache-2.0" -> url("http://www.apache.org/licenses/LICENSE-2.0.html"))
scalacOptions ++= Seq(
  "-deprecation",
  "-unchecked",
  "-Yinline-warnings",
  "-language:implicitConversions",
  "-language:reflectiveCalls",
  "-language:higherKinds",
  "-language:postfixOps",
  "-language:existentials",
  "-feature")
publishMavenStyle := true
publishArtifact in Test := false
pomIncludeRepository := { _ => false }

val geotrellis = Seq(
  "org.locationtech.geotrellis" %% "geotrellis-accumulo" % gtVersion,
  "org.locationtech.geotrellis" %% "geotrellis-hbase" % gtVersion,
  "org.locationtech.geotrellis" %% "geotrellis-cassandra" % gtVersion,
  "org.locationtech.geotrellis" %% "geotrellis-s3" % gtVersion,
  "org.locationtech.geotrellis" %% "geotrellis-spark" % gtVersion,
  "org.locationtech.geotrellis" %% "geotrellis-spark-etl" % gtVersion,
  "org.locationtech.geotrellis" %% "geotrellis-shapefile" % gtVersion
)

val akka = Seq(
  "com.typesafe.akka" %% "akka-actor" % akkaActorVersion,
  "com.typesafe.akka" %% "akka-http-core" % akkaHttpVersion,
  "com.typesafe.akka" %% "akka-http" % akkaHttpVersion,
  "com.typesafe.akka" %% "akka-http-spray-json" % akkaHttpVersion
)


val cluster = Seq(
  "org.apache.spark" %% "spark-core" % sparkV,
  "org.apache.hadoop" % "hadoop-client" % hadoopV
)

val library = geotrellis ++ akka ++ cluster

libraryDependencies ++= library

ivyScala := ivyScala.value map {
  _.copy(overrideScalaVersion = true)
}

test in assembly := {}

assemblyMergeStrategy in assembly := {
  case "reference.conf" => MergeStrategy.concat
  case "application.conf" => MergeStrategy.concat
  case "META-INF/MANIFEST.MF" => MergeStrategy.discard
  case "META-INF\\MANIFEST.MF" => MergeStrategy.discard
  case "META-INF/ECLIPSEF.RSA" => MergeStrategy.discard
  case "META-INF/ECLIPSEF.SF" => MergeStrategy.discard
  case _ => MergeStrategy.first
}

       发布服务语句如下:

代码语言:javascript
复制
import akka.http.scaladsl.Http
Http().bindAndHandle(routes, host, port)

       其中host为本机ip,port为服务端口,而routes则为你定义的路由规则。定义方式如下:

代码语言:javascript
复制
import akka.http.scaladsl.model.{ContentType, HttpEntity, HttpResponse, MediaTypes}
def routes = pathPrefix(IntNumber / IntNumber / IntNumber) { (zoom, x, y) =>
    parameters(
      'names,
      'mask ? ""
    ) { (names, maskz) =>

      complete {
        Future {
          val result = ...
          HttpResponse(entity = HttpEntity(ContentType(MediaTypes.`image/png`), result))
        }
      }
    }
  }

       可以看出基本与spray版本相同,只是此处引用的包均为akka的。不同的地方在于http的响应方式有变化,变为:

代码语言:javascript
复制
HttpResponse(entity = HttpEntity(ContentType(MediaTypes.`image/png`), result))

       其中result为瓦片的字节数组。

       具体可以参考官方示例https://github.com/geotrellis/geotrellis-chatta-demo

2.2 增加CollectionLayerReader查询瓦片方式

       如果需要根据范围或其他条件来查询瓦片集,之前版本只能通过LayerReader的方式,现增加了CollectionLayerReader的方式。其使用方式基本与LayerReader相同,唯一不同的是返回结果不再是RDD集合,而是Seq集合。从这一点也能看出CollectionLayerReader不再使用Spark调用瓦片,而是直接调用Accumulo或其他数据库中的瓦片数据,所以返回的不再是RDD集合。究竟两种方式哪种更好,我并未做大量的实验来进行测试,个人感觉CollectionLayerReader的方式可能更自由,速度也要稍微快些。以Accumulo为例,其创建方式如下:

代码语言:javascript
复制
val instance = AccumuloInstance(
  config.getString("accumulo.instance"),
  config.getString("accumulo.zookeepers"),
  config.getString("accumulo.user"),
  new PasswordToken(config.getString("accumulo.password"))
)

val collectionLayerReader = AccumuloCollectionLayerReader(instance)

三、总结

       本文并未包含过多的知识点,算是代码状态的一个回归吧。虽然部署OpenStack等运维层面的工作以及单片机、嵌入式等硬件层面的工作我都很喜欢,成功后都会给我带来深深的享受之感,其实我更喜欢写代码,一行行优美的如同艺术品的代码从大脑经过指尖展示在显示屏上,而后便能看到所有的事情全部按照自己预想的方式运行,这种快感是无法言表的。

       半年内也有很多人咨询我关于geotrelis的相关问题,有些我耐心的回答了,有些问的问题明显就是没有经过大脑的,用宝玉的话说:懒怠回答,只说几个字去看我的博客。有些人说看了我的博客之后学到很多,也有些人说没有讲清楚,所以我感觉可能是我真的表达的不太清楚,于是我后续可能再写一系列的博客针对geotrellis的各个部分或者功能来进行详细讲解,而不是像现在这样结合具体业务来进行分析,当然结合具体业务进行分析的方式也会继续进行。敬请期待!

Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-07-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 一、前言
  • 二、升级过程
    • 2.1 废弃spray,改用akka发布http服务
      • 2.2 增加CollectionLayerReader查询瓦片方式
      • 三、总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档