2

我正在查看 kudu 的文档。

下面是对 kudu-spark 的部分描述。

https://kudu.apache.org/docs/developing.html#_avoid_multiple_kudu_clients_per_cluster

避免每个集群有多个 Kudu 客户端。

一种常见的 Kudu-Spark 编码错误是实例化额外的KuduClient对象。在 kudu-spark 中, aKuduClientKuduContext. Spark 应用程序代码不应创建另一个KuduClient连接到同一个集群。相反,应用程序代码应该使用KuduContext来访问KuduClientusing KuduContext#syncClient

要诊断KuduClientSpark 作业中的多个实例,请在日志中查找 master 被许多GetTableLocationsGetTabletLocations来自不同客户端的请求(通常大约在同一时间)超载的迹象。这种症状在 Spark Streaming 代码中尤为常见,其中创建KuduClient每个任务将导致来自新客户端的周期性主请求波。

这是否意味着我一次只能运行一个 kudu-spark 任务?

如果我有一个始终将数据写入 kudu 的 spark-streaming 程序,我如何使用其他 spark 程序连接到 kudu?

4

2 回答 2

0

在非 Spark 程序中,您使用 KUDU 客户端来访问 KUDU。使用 Spark 应用程序,您可以为该 KUDU 集群使用已经具有此类客户端的 KUDU 上下文。

简单的 JAVA 程序需要使用 JAVA API 和 maven 方法的 KUDU 客户端。

KuduClient kuduClient = new KuduClientBuilder("kudu-master-hostname").build();

http://harshj.com/writing-a-simple-kudu-java-api-program/

Spark / Scala 程序,其中许多程序可以使用 Spark KUDU 集成在同一个集群上同时运行。Snippet 从官方指南借来的,因为很久以前我看过这个。

import org.apache.kudu.client._
import collection.JavaConverters._

// Read a table from Kudu
val df = spark.read
              .options(Map("kudu.master" -> "kudu.master:7051", "kudu.table" -> "kudu_table"))
              .format("kudu").load

// Query using the Spark API...
df.select("id").filter("id >= 5").show()

// ...or register a temporary table and use SQL
df.registerTempTable("kudu_table")
val filteredDF = spark.sql("select id from kudu_table where id >= 5").show()

// Use KuduContext to create, delete, or write to Kudu tables
val kuduContext = new KuduContext("kudu.master:7051", spark.sparkContext)

// Create a new Kudu table from a dataframe schema
// NB: No rows from the dataframe are inserted into the table
kuduContext.createTable("test_table", df.schema, Seq("key"),
                        new CreateTableOptions()
                      .setNumReplicas(1)
                      .addHashPartitions(List("key").asJava, 3))

// Insert data
kuduContext.insertRows(df, "test_table")

https://kudu.apache.org/docs/developing.html

于 2019-06-29T17:36:30.603 回答
0

“避免每个集群使用多个 Kudu 客户端”更明确的说法是“避免每个 Spark 应用程序使用多个 Kudu 客户端”。

相反,应用程序代码应该使用 KuduContext 来使用 KuduContext#syncClient 访问 KuduClient。

于 2019-07-01T01:59:41.350 回答