Apache spark 通过Spark RDDs向Cassandra编写SimpleFeature

Apache spark 通过Spark RDDs向Cassandra编写SimpleFeature,apache-spark,geomesa,Apache Spark,Geomesa,我想知道是否有可能在Spark上下文中为Cassandra编写一个SimpleFeature?我试图将数据的SimpleFeatures映射到Spark RDD中,但遇到了一些问题。以下被调用的createFeature函数在独立单元测试中运行良好,我有另一个单元测试调用它,并成功地通过GeoMesa api将其生成的SimpleFeature写入Cassandra: import org.locationtech.geomesa.spark.GeoMesaSparkKryoRegistrato

我想知道是否有可能在Spark上下文中为Cassandra编写一个SimpleFeature?我试图将数据的SimpleFeatures映射到Spark RDD中,但遇到了一些问题。以下被调用的createFeature函数在独立单元测试中运行良好,我有另一个单元测试调用它,并成功地通过GeoMesa api将其生成的SimpleFeature写入Cassandra:

import org.locationtech.geomesa.spark.GeoMesaSparkKryoRegistrator

. . .

private val sparkConf = new SparkConf(true).set("spark.cassandra.connection.host","localhost").set("spark.serializer","org.apache.spark.serializer.KryoSerializer").set("spark.kryo.registrator",classOf[GeoMesaSparkKryoRegistrator].getName).setAppName(appName).setMaster(master)

. . .                                            

val rowsRDD = processedRDD.map(r => {

...

println("** NAME VALUE MAP **")

for ((k,v) <- featureNamesValues) printf("key: %s, value: %s\n", k, v)

val feature = MyGeoMesaManager.createFeature(featureTypeConfig.asJava,featureNamesValues.asJava)
feature
})

rowsRDD.print()
好的,然后我添加了geomesa spark core页面上提到的kyro依赖项以缓解这种情况,但是现在我在执行map函数时在geomesa SparkKryOreRegistrator类上得到一个NoClassDefFoundError,但是正如您所看到的,geomesa spark core依赖项存在于类路径上,我可以导入该类:

18/02/12 08:08:37 ERROR Executor: Exception in task 0.0 in stage 26.0 (TID 
11)
java.lang.NoClassDefFoundError: Could not initialize class org.locationtech.geomesa.spark.GeoMesaSparkKryoRegistrator$
at org.locationtech.geomesa.spark.GeoMesaSparkKryoRegistrator$$anon$1.write(GeoMesaSparkKryoRegistrator.scala:36)
at org.locationtech.geomesa.spark.GeoMesaSparkKryoRegistrator$$anon$1.write(GeoMesaSparkKryoRegistrator.scala:32)
at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:568)
at com.esotericsoftware.kryo.serializers.DefaultArraySerializers$ObjectArraySerializer.write(DefaultArraySerializers.java:318)
at com.esotericsoftware.kryo.serializers.DefaultArraySerializers$ObjectArraySerializer.write(DefaultArraySerializers.java:293)
at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:568)
at org.apache.spark.serializer.KryoSerializerInstance.serialize(KryoSerializer.scala:315)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:383)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
最后,我尝试将com.esotericsoftware.kryo依赖项添加到类路径中,但得到了相同的错误


我想用GeoMesa、Spark和Cassandra做的事情有可能做到吗?感觉就像我站在一码线上,但我不能很好地插入它。

设置类路径的最简单方法是使用maven和maven shade插件。添加对geomesa cassandra数据存储和geomesa spark geotools模块的依赖关系:

<dependency>
  <groupId>org.locationtech.geomesa</groupId>
  <artifactId>geomesa-cassandra-datastore_2.11</artifactId>
</dependency>
<dependency>
  <groupId>org.locationtech.geomesa</groupId>
  <artifactId>geomesa-spark-geotools_2.11</artifactId>
</dependency>

然后添加一个maven shade插件,类似于Accumulo的插件。使用着色jar提交spark作业,类路径应该包含所需的所有内容。

好的,是的,我在类路径上有这两个依赖项,尽管我没有使用着色jar。包含正确的依赖项是否足以序列化对象并使其通过GeoMesa api正确写入Cassandra,或者我是否也需要GeoMesa spark对象来获取空间RDDProvider,如GeoMesa spark核心页面所述?我在github上查看了代码,我认为没有针对Cassandra的SpatialRDDProvider。因此,这是我最大的担忧——是否有可能用Cassandra和Spark,而不是Accumulo和SparkIt,来做我想做的ie——似乎你计划从Spark内部使用常规Cassandra数据存储,这应该可以正常工作。geomesa spark模块的加入主要是为了获得序列化位。或者,尽管没有针对Cassandra的优化SpatialRDDProvider,但您可以使用通用地理工具SpatialRDDProvider。我仍然建议创建一个带阴影的jar来设置类路径。好的,谢谢你的回复和指导。是的,这就是我目前正在做的,在我的单元测试中,它似乎工作得很好,不包括Spark上下文。为了达到这一点,我做了大量的工作,我只是希望序列化/kyro依赖性问题是目前阻止我写信给Cassandra的唯一原因。好的,我不太了解带阴影的罐子,但我会研究它。再次感谢埃米利奥。如果成功,我将发回。环境中似乎没有设置任何内容,因为第43行(OptionSparkEnv.get.foreach)中失败的是对GeomesParkKryOreRegistratorEndpoint.init的调用{当GeomesaSparkRyOreRegistrator尝试加载时。我只是不知道SparkEnv.get失败的原因。是否需要设置其他spark或GeomesaKyro系统属性?我看到GeomesaSparkRyOreRegistratorEndpoint内部有一个对spark.geomesa.kryo.rpc.enable的引用。感谢我尝试在单元测试中运行此操作比如Spark集成测试,我不是为了测试而提交作业。这就是为什么我希望解决单元测试环境中的依赖性问题,这样我就不必多次提交Spark作业。我还有许多其他类似的测试连接到我的本地Spark,我已经通过GeoMesa通过其中一个t这些测试,所以我的设置对于所有其他测试都是正确的。只是Spark GeoMesa的依赖关系似乎导致了这个单元测试的问题,我正在尝试创建一个sf RDD
<dependency>
  <groupId>org.locationtech.geomesa</groupId>
  <artifactId>geomesa-cassandra-datastore_2.11</artifactId>
</dependency>
<dependency>
  <groupId>org.locationtech.geomesa</groupId>
  <artifactId>geomesa-spark-geotools_2.11</artifactId>
</dependency>