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

目录

  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.Propertiesval 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 ++ clusterlibraryDependencies ++= libraryivyScala := ivyScala.value map {_.copy(overrideScalaVersion = true)
}test in assembly := {}assemblyMergeStrategy in assembly := {case "reference.conf" => MergeStrategy.concatcase "application.conf" => MergeStrategy.concatcase "META-INF/MANIFEST.MF" => MergeStrategy.discardcase "META-INF\\MANIFEST.MF" => MergeStrategy.discardcase "META-INF/ECLIPSEF.RSA" => MergeStrategy.discardcase "META-INF/ECLIPSEF.SF" => MergeStrategy.discardcase _ => 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

转载于:https://www.cnblogs.com/shoufengwei/p/7144542.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283125.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中的logger模块详细讲解

logger 提供了应用程序可以直接使用的接口handler将(logger创建的)日志记录发送到合适的目的输出filter提供了细度设备来决定输出哪条日志记录formatter决定日志记录的最终输出格式 logging模块介绍 Python的logging模块提供了通用的日志系统,熟练使用logging模块可…

总在用户态调试 C# 程序,终还是搭了一个内核态环境

一:背景 一直在用 WinDbg 调试用户态程序,并没有用它调试过 内核态,毕竟不是做驱动开发,也没有在分析 dump 中需要接触用内核态的需求,但未知的事情总觉得很酷,加上最近在看 《深入解析 Windows 操作系统》…

CentOS搭建Sqoop环境

Sqoop是一个用来将Hadoop(Hive、HBase)和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如:MySQL ,Oracle ,Postgres等)中的数据导入到Hadoop的HDFS中,也可以将HDFS的数据导入到…

bat kafka启动_windows下搭建Kafka,并通过命令窗口收发消息

参考网址:前提条件:windows环境需要安装jdk2.由于Kafka依赖于zookeeper,所以也需要下载zookeeper,可以通过官网下载http://zookeeper.apache.org/3.安装zookeeper将压缩包解压后,到bin目录下,启动zkServer.bat即可注意…

异常处理、socke基于TCP协议编程

一、异常处理 1、错误和异常 1.程序中难免出现错误,而错误分成两种 (1)语法错误(这种错误过不了Python解释器的语法检测,必须在程序执行前改正) #语法错误示范一 if#语法错误示范二 def test:pass#语法错误…

getComputedStyle方法的那些事

一、getComputedStyle是?getComputedStyle是一个可以获取当前元素所有最终使用的CSS属性值。返回的是一个CSS样式声明对象([object CSSStyleDeclaration]),只读。 getComputedStyle() gives the final used values of all the CSS properties of an elem…

maven正确的集成命令-U-B

http://healthandbeauty.iteye.com/blog/1618501 在持续集成服务器上使用怎样的 mvn 命令集成项目,这个问题乍一看答案很显然,不就是 mvn clean install 么?事实上比较好的集成命令会稍微复杂些,下面是一些总结: 不要忘…

如何避免 .NET 中 HttpClient 的 DNS 失效问题?

HttpClient 可以用来发送 HTTP 请求。HttpClient 可以设置为单例并在整个生命周期中重复使用。这是因为,HttpClient 有一个“连接池”来重用连接并减少 TCP 连接的数量。因此,如果您向同一主机发送多个请求,它们将重用相同的连接。这样&#…

POJ 1159 Palindrome(字符串变回文:LCS)

POJ 1159 Palindrome(字符串变回文:LCS) http://poj.org/problem?id1159 题意: 给你一个字符串, 问你做少须要在该字符串中插入几个字符能是的它变成一个回文串. 分析: 首先把原字符串和它的逆串进行匹配, 找出最长公共子序列. 那么最长公共子序列的字符串肯定是一个回文串. 所…

java excutorthread_Java中ThreadPoolExecutor的参数理解

一、使用Executors创建线程池之前创建线程的时候都是用的Executors的newFixedThreadPool(),newSingleThreadExecutor(),newCachedThreadPool()这三个方法。当然Executors也是用不同的参数去new ThreadPoolExecutor1. newFixedThreadPool()创建线程数固定大小的线程池。 由于使用…

yii1.0性能调优之改善并发数

开启YII的APC缓存 在config/main.php components 组件下添加: apccache>array(class>system.caching.CApcCache), 下载php_apc.dll,文件放到php/ext 下,搜索时可能会比较麻烦.... 在php.ini 中添加php_apc扩展: extension…

windows下apache报错The requested operation has failed解决方法

2019独角兽企业重金招聘Python工程师标准>>> Apache报错The requested operation has failed,基本上是因为端口被占用。解决方法如下: 第一步,运行cmd,cd 定位到Apache安装目录的bin目录下,输入httpd.exe -…

stm32 usmart使用

我直接用正点原子给的,步骤如下 先添加三个.c进工程,添加两个头文件的编译路径 #include "usart.h"#include "usmart.h" main函数里添加如下 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2 uart_init(960…

Scylla——开源免费的优秀代理 IP 池:自动验证、JSON API、基于 React 的 Web UI、Docker 支持...

GitHub:github.com/imWildCat/s… 中文文档:scylla.wildcat.io/zh/latest/ 自己是一个爬虫爱好者,有时候爬虫写的太过强大了被目标网站封了(笑)。所以就萌生了用代理 IP 的想法。很可惜很多开源代理 IP 池都是没有持续…

vs2015提示中文

解决方案:1.找到这个目录C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework 进入 \v4.0\zh-Hans的目录,全部复制,覆盖掉\v4.5\zh-Hans就行了

Istio 1.15 发布,支持 arm64 架构处理器

Istio 是基于容器的云原生技术栈的三大核心技术之一,另外两个是 Kubernetes 和 Knative。其中 Kubernetes 和 Knative 早已支持了 arm64 架构,甚至连 Istio 的数据平面 Envoy 早在 1.16 版本 [1] 就已支持 arm64 架构(2020 年 10 月&#xff…

TP框架表单验证 【包含ajax方法】

之前的表单验证都是用js写的,这里也可以使用tp框架的验证。但是两者比较而言还是js验证比较好,因为tp框架验证会运行后台代码,这样运行速度和效率就会下降。  自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创…

Spring 入门学习二之IOC

今天来学习Spring ioc .一、spring jar 包导入 在 spring 官网下载开发包 spring-framework-4.2.4.RELEASE,然后导入需要的 jar 包到项目 /lib/ 目录下。  二、代码开发 新建一个 src/cn/sxt/bean/Hello.java文件 package cn.sxt.bean;/*** Created by kaiyiwang o…

java 物理内存_聊聊Java中的内存

JVM的内存先放一张JVM的内存划分图,总体上可以分为堆和非堆(粗略划分,基于java8)那么一个Java进程最大占用的物理内存为:Max Memory eden survivor old String Constant Pool Code cache compressed class space Metaspace Thread st…

.Net CoreRabbitMQ基本使用

队列模式https://www.rabbitmq.com/getstarted.html对以上几种模式进行简要分类,可以分成如下三类(RPC暂不考虑)简单队列模式,单发单收,一对一模式Worker模式,单发多收(一个消息一个接收者,多个消息多个接收者)&#x…