1.使用spark创建表不设置逻辑库的时候是默认存储在default库里的;
2.刚刚使用spark创建的表是没法被impala发现的,需要使用impala同步kudu的元数据 在impala中使用INVALIDATE METADATA命令;
3.impala中只是kudu表的映射,删除表需要去kudu里删除表,再接在linux系统里敲命令 kudu table delete 10.152.160.135:7051 testcontext 因为kudu中没有库的概念 我们看到的kudu的库.表名是逻辑库 所以直接写表名就可以了
4.CREATE TABLE my_first_table
( id BIGINT,
name STRING,
PRIMARY KEY(id) )
PARTITION BY HASH PARTITIONS 16
STORED AS KUDU;
5. CREATE TABLE new_table
PRIMARY KEY (ts, name)
PARTITION BY HASH(name) PARTITIONS 8
STORED AS KUDU
AS SELECT ts, name, value FROM old_table;
6.impala+kudu支持insert select插入数据
7.spark2.4.3+kudu1.9
引入依赖
<dependency>
<groupId>org.apache.kudu</groupId>
<artifactId>kudu-spark2_2.11</artifactId>
<version>${kudu.version}</version>
</dependency>
<dependency>
<groupId>org.apache.kudu</groupId>
<artifactId>kudu-spark2-tools_2.11</artifactId>
<version>1.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.kudu</groupId>
<artifactId>kudu-client</artifactId>
<version>1.9.0</version>
</dependency>
需要注意的是 KuduWriteOptions 是spark-kudu-1.9.0中的类,如果再cdh环境中运行,而cdh中的kudu版本过低比如说1.5.0的时候,是会报ClassNotFound的,找不到KuduWriteOptions 类.此时使用upsert和insert因为1.9.0版本中这两个方法必须用到KuduWriteOptions 类,所以在1.5.0环境中无法运行,只能使用
df.write.format("org.apache.kudu.spark.kudu")
.mode("append")
.option("kudu.master", kuduMasters)
.option("kudu.table", tableName)
.save()
才可以兼容1.9.0和1.5.0的kudu版本,程序才可以正常运行.
因为引入的jar包依赖是kudu1.9.0的版本,此版本中的insertRows和upsertRows都会隐式或者显式的使用KuduWriteOptions类
而KuduWriteOptions类和集群环境中的kudu1.5.0版本不兼容,不存在这个类
在集群spark-shell中运行语句kuduContext.insertRows(df,tableName)之所以可以运行是环境中直接引用了kudu1.5.0中的类库,
kudu的这个版本中的insertRows方法不会自动调用KuduWriteOptions类,也就是代码api版本和kudu版本一致,所以不会报错
kuduContext.upsertRows(res, tableName, new KuduWriteOptions(false, true))
kuduContext.insertRows(df,tableName)
8.spark2.4.3+kudu1.9版本代码在cdh5-13中运行kudu版本为1.5.0,当hadoop-yarn将spark写入数据至kudu任务分发至kudu的master所在的机器运行时,会报错hadoop.tracing.TraceUtils.wrapHadoopConf,但是当hadoop-yarn将spark写入数据至kudu任务分发至其他kudu所在slave节点时,不会报错,可以正常运行.原因未知.