我正在尝试从snappydata cli运行jar文件。
我只想在开始时创建一个sparkSession和SnappyData会话。
package io.test
import org.apache.spark.sql.{SnappySession, SparkSession}
object snappyTest {
def main(args: Array[String]) {
val spark: SparkSession = SparkSession
.builder
.appName("SparkApp")
.master("local")
.getOrCreate
val snappy = new SnappySession(spark.sparkContext)
}
}从sbt文件:
name := "SnappyPoc"
version := "0.1"
scalaVersion := "2.11.8"
libraryDependencies += "io.snappydata" % "snappydata-cluster_2.11" % "1.0.0"当我在IDE中调试代码时,它工作得很好,但当我创建一个jar文件并尝试直接在snappy上运行它时,我收到消息:
"message": "Ask timed out on [Actor[akka://SnappyLeadJobServer/user/context-supervisor/snappyContext1508488669865777900#1900831413]] after [10000 ms]",
"errorClass": "akka.pattern.AskTimeoutException",我有Spark Standalone 2.1.1,SnappyData 1.0.0。我向Spark实例添加了依赖项。
你能帮帮我吗?提前感谢。
发布于 2017-10-23 20:00:48
首先需要解释一下“嵌入式”模式和“智能连接器”模式之间的区别。
通常,当您使用spark-submit运行作业时,它会根据配置生成一组新的executor JVM来运行代码。然而,在SnappyData的嵌入式模式中,托管数据的节点本身也托管着长期运行的Spark Executor。这样做是为了最大限度地减少数据移动(即移动执行而不是数据)。对于该模式,您可以提交一个作业(使用snappy-job.sh),该作业将在那些预先存在的执行器上运行代码。替代方法包括用于嵌入式执行的JDBC/ODBC。这也意味着您不能(目前)使用spark-submit来运行嵌入式作业,因为这将产生它自己的JVM。
“智能连接器”模式是其他Spark连接器的正常工作方式,但像所有这些模式一样,它的缺点是必须将所需的数据拉入executor JVM中,因此将比嵌入式模式慢。要进行相同的配置,必须指定"snappydata.connection“属性以指向在SnappyData集群的定位器上运行的thrift服务器。对于用户想要扩展集群的执行能力的许多情况(例如,如果集群的嵌入式执行总是在CPU上饱和),或者对于现有的Spark分发/部署,它都很有用。不用说,spark-submit可以在连接器模式下工作得很好。这种模式的“聪明”之处在于: a)如果托管数据和运行执行器的物理节点很常见,那么分区将被尽可能多地路由到这些执行器,以最小化网络使用;b)将使用优化的SnappyData计划来扫描表、散列聚合、散列连接。
对于这个特定的问题,答案是: runSnappyJob将接收SnappySession对象作为参数,该参数应该使用,而不是创建它。使用SnappySession的身体的其余部分将完全相同。同样,对于基本SparkContext,实现SparkJob可能会更容易,代码也会类似,只是SparkContext将作为应该使用的函数参数提供。原因如上所述:嵌入式模式已经有一个正在运行的SparkContext,它需要用于作业。
发布于 2017-10-20 17:46:56
我认为有缺失的方法isValidJob和runSnappyJob。当我将这些添加到代码中时,它可以工作,但我知道有人知道什么是方法runSnappyJob和方法main的相关主体
两者应该是一样的吗?
https://stackoverflow.com/questions/46845440
复制相似问题