spark 连接 inceptor 的方法

  第三方对接
内容纲要

概要描述


Spark 应用迁移到 TDH 集群后会有对接问题,本文档介提供几种 spark 连接 inceptor 的方法以及示例代码;

详细说明


  1. JDBC方式
    1. LDAP
    2. Kerberos
  2. Spark程序schema走jdbc,数据不走jdbc的方式访问Inceptor:

操作以及实例代码

JDBC方式
Inceptor 开启 LDAP 认证方式

1、export SPARK_CONF_DIR=/etc/discover1/conf/spark
2、cd /usr/lib/discover/bin
进入spark-shell中执行下列命令:

import org.apache.spark.sql.SparkSession
//初始化SparkSession
val spark = SparkSession.builder().master("yarn").appName("discover test").getOrCreate()
//创建jdbc连接,配置项分别为 inceptor节点ip,是否启用Kerberos,是否hiveServer2模式,inceptor用户名,inceptor用户密码,库名
val jdbc=io.transwarp.discover.source.InceptorJDBC.getInceptorJDBC("172.22.24.66",false,true,"discover","123456","default")
//获取table数据
//text
val table = jdbc.getDataTable("SELECT * FROM emp_text",spark)
//varchar,默认不能读取varchar类型数据,需要使用类型转换函数(比如:to_char()函数)转换成其他类型
val table = jdbc.getDataTable("SELECT to_char(address) FROM emp_varchar LIMIT 10",spark)
//orc-transaction
val table = jdbc.getDataTable("SELECT * FROM emp_torc LIMIT 10",spark)
//view
val table = jdbc.getDataTable("SELECT * FROM emp_v LIMIT 10",spark)

//查看数据
val df = table.dataFrame
df.collect()
df.show()

备注:默认不能读取varchar类型数据,需要使用类型转换函数(比如:to_char()函数)转换成其他类型

Inceptor 开启 Kerberos 认证方式

1、export SPARK_CONF_DIR=/etc/discover1/conf/spark
2、export INCEPTOR_KEYTAB="/etc/discover1/conf/discover.keytab"
3、export RUSER="discover"
4、cd /usr/lib/discover/bin

进入spark-shell中执行下列命令:

import org.apache.spark.sql.SparkSession
//初始化SparkSession
val spark = SparkSession.builder().master("yarn").appName("discover test").getOrCreate()
//创建jdbc连接,配置项分别为 inceptor节点ip,是否启用Kerberos,是否hiveServer2模式,inceptor用户名,inceptor用户密码,库名;当使用kerberos 认证时,Inceptor用户名和Inceptor用户面可以使用空字符串;
val jdbc=io.transwarp.discover.source.InceptorJDBC.getInceptorJDBC("172.22.24.66",true,true,"","","default")
//获取table数据
//text
val table = jdbc.getDataTable("SELECT * FROM emp_text",spark)
//varchar,默认不能读取varchar类型数据,需要使用类型转换函数(比如:to_char()函数)转换成其他类型
val table = jdbc.getDataTable("SELECT to_char(address) FROM emp_varchar LIMIT 10",spark)
//orc-transaction
val table = jdbc.getDataTable("SELECT * FROM emp_torc LIMIT 10",spark)
//view
val table = jdbc.getDataTable("SELECT * FROM emp_v LIMIT 10",spark)

//查看数据
val df = table.dataFrame
df.collect()
df.show()

备注:默认不能读取varchar类型数据,需要使用类型转换函数(比如:to_char()函数)转换成其他类型

Spark程序schema走jdbc,数据不走jdbc的方式访问Inceptor
//导入所需包
import org.apache.spark.sql.SQLContext
//初始化sqlcontext
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
//创建jdbc连接,配置项根据自身修改,以下面为例:inceptor数据库地址与数据库名,inceptor驱动,读取的表名,inceptor用户名,inceptor用户密码。

val jdbcDF = sqlContext.read.format("jdbc").options(Map("url" -> "jdbc:hive2://172.22.24.66:10000/default", "driver" -> "org.apache.hive.jdbc.HiveDriver", "dbtable" -> " emp_table ", "user" -> "admin", "password" -> "123456")).load()
jdbcDF.collect()

val jdbcDF = sqlContext.read.format("jdbc").options(Map("url" -> "jdbc:hive2://172.22.24.66:10000/default", "driver" -> "org.apache.hive.jdbc.HiveDriver", "dbtable" -> " emp_table ", "user" -> "admin", "password" -> "123456")).load()
jdbcDF.collect()

//查看数据
jdbcDF.show()

常见问题:

  1. kerberos 认证需要指定两个环境变量,export INCEPTOR_KEYTAB="/etc/discover1/conf/discover.keytab" export RUSER="discover"

  2. 当使用的是普通用户认证的时候,需要有 Inceptor 的 discover 数据库的 select 和 create 权限;

    20/07/15 08:42:48 ERROR io.transwarp.discover.source.InceptorJDBC: COMPILE FAILED: 
    Internal error HiveAccessControlException: [Error 20388] Permission denied: 
    Principal [name=discover, type=USER] does not have following privileges for operation CREATETABLE_AS_SELECT [[CREATE] on Object [type=DATABASE, name=discover]]
  3. JDBC 方式默认不能读取varchar类型数据,需要使用类型转换函数(比如:to_char()函数)转换成其他类型;

    20/07/15 08:53:45 ERROR io.transwarp.discover.source.InceptorJDBC: org.apache.spark.sql.catalyst.parser.ParseException:
    DataType varchar is not supported.(line 1, pos 0)
    == SQL ==
    varchar
    ^^^
  4. spark-shell 或者 spark-submit 提交的应用可以在 /var/log/discover1/spark.log 里面查看运行情况,根据具体报错查找具体原因。

这篇文章对您有帮助吗?

平均评分 5 / 5. 次数: 1

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。