目录

  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文件如下:

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版的更多相关文章

  1. FreeSql (二十九)Lambda 表达式

    FreeSql 支持功能丰富的表达式函数解析,方便程序员在不了解数据库函数的情况下编写代码.这是 FreeSql 非常特色的功能之一,深入细化函数解析尽量做到满意,所支持的类型基本都可以使用对应的表达 ...

  2. Bootstrap <基础二十九>面板(Panels)

    Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...

  3. Web 开发人员和设计师必读文章推荐【系列二十九】

    <Web 前端开发精华文章推荐>2014年第8期(总第29期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  4. WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]

    原文:WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载] 我们有两种典型的WCF调用方式:通过SvcUtil.exe(或者添加Web引用)导入发布的服务元数据生成服务代理相关的代码 ...

  5. VMwarevSphere 服务器虚拟化之二十九 桌面虚拟化之安装View副本服务器

    VMwarevSphere 服务器虚拟化之二十九  桌面虚拟化之安装View副本服务器 VMware View中高可用性可是一个必须要考虑的问题.在整个虚拟桌面环境中View Connection S ...

  6. Bootstrap入门(二十九)JS插件6:弹出框

    Bootstrap入门(二十九)JS插件6:弹出框 加入小覆盖的内容,像在iPad上,用于存放非主要信息 弹出框是依赖于工具提示插件的,那它也和工具提示是一样的,是需要初始化才能够使用的 首先我们引入 ...

  7. mysql进阶(二十九)常用函数

    mysql进阶(二十九)常用函数 一.数学函数 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x) 返回大于x的最小整数值 EXP ...

  8. JAVA之旅(二十九)——文件递归,File结束练习,Properties,Properties存取配置文件,load,Properties的小练习

    JAVA之旅(二十九)--文件递归,File结束练习,Properties,Properties存取配置文件,load,Properties的小练习 我们继续学习File 一.文件递归 我们可以来实现 ...

  9. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】原创教程连载导读【连载完成,共二十九章】

    前言: 无数昼夜的来回轮替以后,这本<驱动篇I>终于编辑完毕了,笔者真的感动到连鼻涕也流下来.所谓驱动就是认识硬件,还有前期建模.虽然<驱动篇I>的硬件都是我们熟悉的老友记,例 ...

  10. 第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理—用户代理和ip代理结合应用

    第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理 使用IP代理 ProxyHandler()格式化IP,第一个参数,请求目标可能是http或者https,对应设置build_opener ...

随机推荐

  1. Ultimus BPM 制药与医疗行业应用解决方案

    Ultimus BPM 制药与医疗行业应用解决方案 行业应用需求 制药与医疗行业客户特点有企业总资产高.员工规模大,销售网络往往遍及全国,乃至全球市场:拥有复杂的制药生产或医疗服务组织机构,并均有严格 ...

  2. 多线程编程-- part 3 多线程同步->synchronized关键字

    多线程同时访问一个资源,可以会产生不可预料的结果,所以为这个资源加锁,访问资源的第一个线程为其加锁后,其他线程便不能在使用那个资源,直到锁被解除. 举个例子: 存款1000元,能取出800的时候我就取 ...

  3. 使用cnpm搭建私有NPM仓库 发布npm包

    关于如何使用cnpm搭建私有的npm仓库看这里→ http://blog.fens.me/nodejs-cnpm-npm/ 我本人还没有机会真正实践操作过,公司的npm仓库是我老大搭建的,我这里仅仅记 ...

  4. #415 Div2 C

    #415 Div2 C 题意 给定一个数字集合,找到所有子集合最大值与最小值之差的和. 分析 列式子,找规律. $ (a_2 - a_1) * 2^0 + (a_3 - a_1) * 2^1 + .. ...

  5. 一天搞定CSS: 清除浮动(float)--13

    上一节已经说明了为什么要清除浮动了.这里我们就来解决浮动产生的各种问题. 为什么要清楚浮动? 地址:http://blog.csdn.net/baidu_37107022/article/detail ...

  6. 【2017-06-06】Ajax完整结构、三级联动的制作

    一.Ajax完整结构 $.ajax({ url:"Main.ashx", data:{}, dataType:"json", type:"post&q ...

  7. javacpp-opencv图像处理系列:国内车辆牌照检测识别系统(万份测试车牌识别准确率99.7%以上,单次平均耗时39ms)

    javaCV图像处理系列: 一.javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 二.javaCV图像处理之2:实时视频添 ...

  8. java封装FFmpeg命令,支持原生ffmpeg全部命令,实现FFmpeg多进程处理与多线程输出控制(开启、关闭、查询),rtsp/rtmp推流、拉流

    前言: 之前已经对FFmpeg命令进行了封装http://blog.csdn.net/eguid_1/article/details/51787646,但是当时没有考虑到扩展性,所以总体设计不是太好, ...

  9. 使用hashCode()和equals()方法 - Java

    在这篇文章中,我将指出我对hashCode()和equals()方法的理解.我将讨论它们的默认实现以及如何正确地覆盖它们.我还将使用Apache Commons包中的实用工具类来实现这些方法. has ...

  10. Log4PHP 配置和使用

    Log4PHP2.3.0使用解释 1. 什么是Log4PHP Log4php它为apche组织维护项目,是Log4xx系列日志组件之一,log4j在JAVA中可算是大名鼎鼎的日志开发包.Log4PHP ...