geotrellis使用(二十九)迁移geotrellis至1.1.1版
目录
一、前言
由于忙着安装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文件如下:
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
}
发布服务语句如下:
import akka.http.scaladsl.Http
Http().bindAndHandle(routes, host, port)
其中host为本机ip,port为服务端口,而routes则为你定义的路由规则。定义方式如下:
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的响应方式有变化,变为:
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为例,其创建方式如下:
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
geotrellis使用(二十九)迁移geotrellis至1.1.1版的更多相关文章
- FreeSql (二十九)Lambda 表达式
		FreeSql 支持功能丰富的表达式函数解析,方便程序员在不了解数据库函数的情况下编写代码.这是 FreeSql 非常特色的功能之一,深入细化函数解析尽量做到满意,所支持的类型基本都可以使用对应的表达 ... 
- Bootstrap <基础二十九>面板(Panels)
		Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ... 
- Web 开发人员和设计师必读文章推荐【系列二十九】
		<Web 前端开发精华文章推荐>2014年第8期(总第29期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ... 
- WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]
		原文:WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载] 我们有两种典型的WCF调用方式:通过SvcUtil.exe(或者添加Web引用)导入发布的服务元数据生成服务代理相关的代码 ... 
- VMwarevSphere 服务器虚拟化之二十九 桌面虚拟化之安装View副本服务器
		VMwarevSphere 服务器虚拟化之二十九 桌面虚拟化之安装View副本服务器 VMware View中高可用性可是一个必须要考虑的问题.在整个虚拟桌面环境中View Connection S ... 
- Bootstrap入门(二十九)JS插件6:弹出框
		Bootstrap入门(二十九)JS插件6:弹出框 加入小覆盖的内容,像在iPad上,用于存放非主要信息 弹出框是依赖于工具提示插件的,那它也和工具提示是一样的,是需要初始化才能够使用的 首先我们引入 ... 
- mysql进阶(二十九)常用函数
		mysql进阶(二十九)常用函数 一.数学函数 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x) 返回大于x的最小整数值 EXP ... 
- JAVA之旅(二十九)——文件递归,File结束练习,Properties,Properties存取配置文件,load,Properties的小练习
		JAVA之旅(二十九)--文件递归,File结束练习,Properties,Properties存取配置文件,load,Properties的小练习 我们继续学习File 一.文件递归 我们可以来实现 ... 
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】原创教程连载导读【连载完成,共二十九章】
		前言: 无数昼夜的来回轮替以后,这本<驱动篇I>终于编辑完毕了,笔者真的感动到连鼻涕也流下来.所谓驱动就是认识硬件,还有前期建模.虽然<驱动篇I>的硬件都是我们熟悉的老友记,例 ... 
- 第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理—用户代理和ip代理结合应用
		第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理 使用IP代理 ProxyHandler()格式化IP,第一个参数,请求目标可能是http或者https,对应设置build_opener ... 
随机推荐
- 使用gzip优化web应用(filter实现)
			相关知识: gzip是http协议中使用的一种加密算法,客户端向web服务器端发出了请求后,通常情况下服务器端会将页面文件和其他资源,返回到客户端,客户端加载后渲染呈现,这种情况文件一般都比较大,如果 ... 
- 《一起》Alpha版软件使用说明
			1.引言 1.1编写目的 本手册是软件工程概论团队项目<一起>的Alpha版使用说明,面向的对象群体为全校师生. 1.2项目背景 本项目由<软件工程概论>课程需求创建,软件由S ... 
- python 字典的常见操作
			字典 字典的增删改查 字典的创建方式: # 创建字典类型 info = { 'name':'李白', ', 'sex':'男' } msg = { 'user01':'Longzeluola', 'u ... 
- storm定时任务【tick】
			一. 简介 storm作为流计算,处理数据通常以数据驱动.即只有当spout发射数据才会进行计算.那么如果想要做定时任务如何处理哪,例如有的bolt需要输出一段时间统计的结果,这里一段时间可 ... 
- WPF中用户控件对比自定义控件(UserControl VS CustomControl)
			接着这篇文章(http://www.cnblogs.com/shiyue/archive/2013/02/02/2889907.html)写: 用户控件(组合) 用于在一个项目中使用多次 自定义控件( ... 
- EF编辑
			//修改推荐的信息 var productRe = db.Shop_ProductRecommends.Single(item => item.Id == model.Id); productR ... 
- 版本控制工具svn的安装与简单使用
			版本控制工具多用于多人协作开发项目中,这不同于个人开发项目,想把自己代码怎样放置都可以,而且删除了代码很难查找. 版本控制工具类似于个人处理钱的过程,放于自己口袋管理类似于个人开发情形,如果自己钱丢了 ... 
- tcp_wrapper 总结
			一. 简介 tcp_wrapper:tcp包装器, 工作于库中的. 访问控制 工具/组件 : 传输层 和 接近于应用层; 仅对使用tcp协议且在开发时调用了libwrap相关的服务程序有效. 二. 判 ... 
- PHPUnit-函数依赖-数据提供-异常-忽略-自动生成
			1. 本文目的 本文目的是收录一些PHPUnit的有用技巧,这些技巧能够为给PHPUnit单元测试带来很多便利.本文将要介绍的技巧如下: 函数依赖测试 数据提供函数 异常测试 跳过忽略测试 自动生成测 ... 
- MongoDB一个基于分布式文件存储的数据库(介于关系数据库和非关系数据库之间的数据库)
			1:MongoDB的官方网址:https://www.mongodb.com MongoDB的中文社区:http://www.mongoing.com/(老外也很看重中国市场啊,知道大家英语不好, ... 
