11.8. 使用Jupyter笔记本部署GeoMesa Spark

Jupyter Notebook 是一个基于Web的应用程序,用于创建包含可运行代码、可视化效果和文本的交互式文档。通过 Apache Toree 内核,Jupyter可以用于在Scala中准备时空分析并将其提交到 Spark 。下面的指南介绍了如何使用Spark配置Jupyter 3.3 和GeoMesa。

备注

GeoMesa对PySpark的支持通过使用Jupyter的内置Python内核的Spark PythonAPI提供对GeoMesa Acumulo数据存储的访问。看见 GeoMesa火花源

11.8.1. 先决条件

Spark 3.3 应该安装,并且环境变量 SPARK_HOME 应该设置。

Python 应安装2.7或3.x,并且建议将Jupyter和Toree安装在Python内部 virtualenv 或在一个 conda 环境。

11.8.2. 安装Jupyter

木星可以通过以下方式安装 pip (适用于Python2.7)或 pip3 (对于Python3.x):

$ pip install --upgrade jupyter

$ pip3 install --upgrade jupyter

11.8.3. 安装Toree内核

$ pip install --upgrade toree

$ pip3 install --upgrade toree

11.8.4. 配置Toree和GeoMesa

如果您在以下位置安装了GeoMesa Acumulo发行版 GEOMESA_ACCUMULO_HOME 如中所述 设置Acumulo命令行工具 ,您可以运行以下示例脚本来配置带有GeoMesa的Toree:

备注

确保您使用的Scala版本与您的Spark版本的Scala版本匹配。

$ export TAG="4.0.2"
$ export VERSION="2.12-${TAG}" # note: 2.12 is the Scala build version
#!/bin/sh

# bundled GeoMesa Accumulo Spark and Spark SQL runtime JAR
# (contains geomesa-accumulo-spark, geomesa-spark-core, geomesa-spark-sql, and dependencies)
jars="file://$GEOMESA_ACCUMULO_HOME/dist/spark/geomesa-accumulo-spark-runtime-accumulo2_$VERSION.jar"

# uncomment to use the converter RDD provider
#jars="$jars,file://$GEOMESA_ACCUMULO_HOME/lib/geomesa-spark-converter_$VERSION.jar"

# uncomment to work with shapefiles (requires $GEOMESA_ACCUMULO_HOME/bin/install-shapefile-dependencies.sh)
#jars="$jars,file://$GEOMESA_ACCUMULO_HOME/lib/jai_codec-1.1.3.jar"
#jars="$jars,file://$GEOMESA_ACCUMULO_HOME/lib/jai_core-1.1.3.jar"
#jars="$jars,file;//$GEOMESA_ACCUMULO_HOME/lib/jai_imageio-1.1.jar"

jupyter toree install \
    --replace \
    --user \
    --kernel_name "GeoMesa Spark $VERSION" \
    --spark_home=${SPARK_HOME} \
    --spark_opts="--master yarn --jars $jars"

备注

指定的罐子将位于各自的 target 如果您从源代码构建GeoMesa,则为源代码分发的每个模块的目录。

备注

你可能想要改变一下 --spark_opts 来指定执行器的数量和配置;否则, $SPARK_HOME/conf/spark-defaults.conf$SPARK_OPTS 将会被使用。

您还可以考虑添加 geomesa-tools_${VERSION}-data.jar 为公开可用的数据源包括预打包的转换器(如中所述 预打包的转换器定义 ), geomesa-spark-jupyter-leaflet_${VERSION}.jar 以包括用于 Leaflet 空间可视化库(请参见 可视化宣传单 ,下文)和/或 geomesa-spark-jupyter-vegas_${VERSION}.jar 要使用 Vegas 数据绘图库(请参见 拉斯维加斯的阴谋 ,下文)。

11.8.5. 奔跑的木星

对于公共笔记本电脑,您应该 configure Jupyter 使用密码并绑定到公共IP地址(默认情况下,Jupyter将只接受来自 localhost )。要使用GeoMesa Spark内核运行Jupyter,请执行以下操作:

$ jupyter notebook

备注

长时间的流程可能应该托管在 screensystemd ,或 supervisord

您的笔记本服务器应该启动并可在http://localhost:8888/(或您将服务器绑定到的地址和端口)访问,这可能需要一个访问令牌,该令牌将显示在服务器输出中。

备注

所有Spark代码将作为运行Jupyter服务器的用户帐户提交。您可能希望查看 JupyterLab 用于多用户Jupyter服务器。

11.8.6. 可视化宣传单

以下示例笔记本显示了如何使用LEAFLE进行数据可视化:

classpath.addRepository("https://repo1.maven.org/maven2")
classpath.addRepository("https://repo.osgeo.org/repository/release")
classpath.addRepository("file:///home/username/.m2/repository")
classpath.add("org.locationtech.geomesa" % "geomesa-accumulo-datastore_2.12" % "4.0.0")
classpath.add("org.locationtech.geomesa" % "geomesa-spark-jupyter-leaflet_2.12" % "4.0.0")
classpath.add("org.locationtech.jts" % "jts-core" % "1.19.0")
classpath.add("org.apache.accumulo" % "accumulo-core" % "2.0.1")

import org.locationtech.geomesa.accumulo.data.AccumuloDataStoreParams._
import org.locationtech.geomesa.jupyter._
import org.locationtech.geomesa.utils.geotools.Conversions._
import scala.collection.JavaConverters._

implicit val displayer: String => Unit = display.html(_)

val params = Map(
        ZookeepersParam.key   -> "ZOOKEEPERS",
        InstanceNameParam.key -> "INSTANCE",
        UserParam.key         -> "USER_NAME",
        PasswordParam.key     -> "USER_PASS",
        CatalogParam.key      -> "CATALOG")

val ds = org.geotools.data.DataStoreFinder.getDataStore(params.asJava)
val ff = org.geotools.factory.CommonFactoryFinder.getFilterFactory2
val fs = ds.getFeatureSource("twitter")

val filt = ff.and(
    ff.between(ff.property("dtg"), ff.literal("2016-01-01"), ff.literal("2016-05-01")),
    ff.bbox("geom", -80, 37, -75, 40, "EPSG:4326"))
val features = fs.getFeatures(filt).features.asScala.take(10).toList

displayer(L.render(Seq(WMSLayer(name="ne_10m_roads",namespace="NAMESPACE"),
                       Circle(-78.0,38.0,1000,  StyleOptions(color="yellow",fillColor="#63A",fillOpacity=0.5)),
                       Circle(-78.0,45.0,100000,StyleOptions(color="#0A5" ,fillColor="#63A",fillOpacity=0.5)),
                       SimpleFeatureLayer(features)
                      )))
../../_images/jupyter-leaflet.png

11.8.6.1. 将图层添加到地图并显示在笔记本中

以下片段是在Jupyter笔记本的传单中呈现数据帧的示例:

implicit val displayer: String => Unit = { s => kernel.display.content("text/html", s) }

val function = """
function(feature) {
  switch (feature.properties.plane_type) {
    case "A388": return {color: "#1c2957"}
    default: return {color: "#cdb87d"}
  }
}
"""

val sftLayer = time { L.DataFrameLayerNonPoint(flights_over_state, "__fid__", L.StyleOptionFunction(function)) }
val apLayer = time { L.DataFrameLayerPoint(flyovers, "origin", L.StyleOptions(color="#1c2957", fillColor="#cdb87d"), 2.5) }
val stLayer = time { L.DataFrameLayerNonPoint(queryOnStates, "ST", L.StyleOptions(color="#1c2957", fillColor="#cdb87d", fillOpacity= 0.45)) }
displayer(L.render(Seq[L.GeoRenderable](sftLayer,stLayer,apLayer),zoom = 1, path = "path/to/files"))
../../_images/jupyter-leaflet-layer.png

11.8.6.2. StyleOptionFunction

这个Case类允许您指定一个执行样式的Java脚本函数。您将传递的匿名函数将一个功能作为参数,并返回一个Java脚本样式的对象。下面提供了一个基于特定特性值的样式设置示例:

function(feature) {
  switch(feature.properties.someProp) {
    case "someValue": return { color: "#ff0000" }
    default         : return { color: "#0000ff" }
  }
}

下表提供了您可能感兴趣的选项:

选择权

类型

描述

颜色

细绳

笔触颜色

重量

笔划宽度(像素)

不透明度

笔划不透明度

填充颜色

细绳

填充颜色

填充不透明度

填充不透明度

注意:选项以逗号分隔(即 { color: "#ff0000", fillColor: "#0000ff" } )

11.8.7. 拉斯维加斯的阴谋

这个 Vegas 库可与木星中的GeoMesa、Spark和Toree一起使用,以绘制定量数据。这个 geomesa-spark-jupyter-vegas 模块构建了一个阴影JAR,其中包含在Jupyter+Toree中运行维加斯所需的所有依赖项。此模块必须从源代码构建,使用 vegas 个人资料:

$ mvn clean install -Pvegas -pl geomesa-spark/geomesa-spark-jupyter-vegas

这将建立 geomesa-spark-jupyter-vegas_${VERSION}.jartarget 目录,并且应该添加到 jupyter toree install 中介绍的命令 配置Toree和GeoMesa

jars="$jars,file:///path/to/geomesa-spark-jupyter-vegas_${VERSION}.jar"
# then continue with "jupyter toree install" as before

要在Jupyter中使用拉斯维加斯,请加载适当的库和一个显示器:

import vegas._
import vegas.render.HTMLRenderer._
import vegas.sparkExt._

implicit val displayer: String => Unit = { s => kernel.display.content("text/html", s) }

然后使用 withDataFrame 方法绘制数据。 DataFrame

Vegas("Simple bar chart").
  withDataFrame(df).
  encodeX("a", Ordinal).
  encodeY("b", Quantitative).
  mark(Bar).
  show(displayer)