SnappyData v.0-5
我的目标是运行snappydata驱动程序以连接到远程服务器中的SnappyData。我写了一个Junit来做这件事。但是,当我运行它时,我得到一个错误,SparkContext被实例化:
.then()
我的pom.xml依赖项是:
resolve()
答案 0 :(得分:2)
SnappyData集群的主要功能是长期运行的Spark执行程序(与数据存储JVM本身相同)。该程序的目的似乎是连接到现有集群,但它将尝试启动一组新的执行程序JVM进行处理,这是Spark正常工作的方式。 SnappyData主管不支持该模式,因为它旨在重用现有数据节点来执行。
Spark中的这个限制是由于群集中只有一个驱动程序已经在SnappyData主导节点中运行,因此无法创建新的驱动程序(我们打算在将来删除此限制)发布)。因此,指向引导节点的"spark://..."
之类的URL将无效。运行Spark作业需要这些可能的部署策略之一(除了使用JDBC / ODBC客户端直接提交SQL)。
注意:对于嵌入式模式,需要snappy-cluster
和snappy-core
个依赖项,而对于其他两个模式,只应添加snappy-core
作为依赖项。
嵌入式模式执行:与JDBC / ODBC客户端一样,此处的执行发生在数据节点本身。这需要通过在活动的主导节点上运行的作业服务器提交作业。程序必须实现SnappySQLJob/JavaSnappySQLJob
并使用REST API(提供的snappy-job.sh
脚本或类似this的内容进行自包含测试)来提交它。详情请见http://snappydatainc.github.io/snappydata/jobs/
public Object runJavaJob(SnappyContext snappyContext, Config config) {
String fileResource = "data.csv";
DataFrame dataFrame = snappyContext.read()
.format("com.databricks.spark.csv").option("header", "true")
.option("inferSchema", "true").load(fileResource);
dataFrame.write().insertInto("example_table_col");
// for debugging
JavaRDD<Row> row = dataFrame.javaRDD();
return row.toDebugString();
// return Boolean.TRUE;
}
public JSparkJobValidation isValidJob(SnappyContext snappyContext,
Config config) {
return new JSparkJobValid();
}
本地拆分模式:在此模式下,执行集群是一个spark local
主服务器,因此与snappydata集群分开。这不会提供良好的性能,因为它必须从大多数查询的数据节点获取大量数据,但它应该最容易用于少量数据的功能测试。使用master作为local
并设置snappydata.store.locators
属性以指向定位器(请参阅http://snappydatainc.github.io/snappydata/connectingToCluster/和之前的链接)
@Test
public void testInsertDataFromCsv() throws Exception {
SparkConf conf = new SparkConf();
conf.setMaster("local[*]");
conf.setAppName("MySparkApp");
// below property can also be fetched with
// io.snappydata.Property.Locators().apply()
conf.set("snappydata.store.locators", "snappy-locator-host:10334");
SparkContext sc = new SparkContext(conf);
SnappyContext snappyContext = new SnappyContext(sc);
String fileResource = "data.csv";
DataFrame dataFrame = snappyContext.read()
.format("com.databricks.spark.csv").option("header", "true")
.option("inferSchema", "true").load(fileResource);
JavaRDD<Row> row = dataFrame.javaRDD();
System.out.println(row.toDebugString());
dataFrame.write().insertInto("example_table_col");
}
拆分模式执行:最后,执行集群可以是普通的Spark / Yarn / Mesos集群,它将作为普通数据存储与snappydata集群通信。这就是其他产品的火花连接器的工作原理(如Cassandra连接器,其中Cassandra与Spark群集分开)。它可以在与snappydata集群相同的节点上运行以获得最佳性能,snappydata将尽力确保执行路由,以便仅提取或插入来自本地表数据的数据。使用来自snappydata发行版本身或Apache Spark 1.6.x(或Apache Spark docs中的Yarn / Mesos集群)中的start-all.sh
启动单独的Spark集群。代码将与上面的本地分割模式相同,master指向Spark / Yarn / Mesos主,而不是snappydata lead。有关更多详细信息,请参阅本地分割模式中的链接。