访问Hive数据源
AnalyticDB MySQL湖仓版(3.0)支持访问Hive数据源。本文以E-MapReduce集群的Hive服务为例,介绍使访问Hive数据的方法。
前提条件
已创建AnalyticDB MySQL湖仓版(3.0)集群。具体操作,请参见创建湖仓版(3.0)集群。
已创建数据库账号。
如果您是通过阿里云账号访问,只需创建高权限账号。具体操作,请参见创建高权限账号。
如果是通过RAM用户访问,需要创建高权限账号和普通账号并且将RAM用户绑定到普通账号上。具体操作,请参见创建数据库账号和绑定RAM用户与数据库账号。
已创建Job型资源组。具体操作,请参见新建资源组。
已创建与AnalyticDB MySQL湖仓版(3.0)集群同地域的E-MapReduce集群。E-MapReduce集群业务场景为新增数据湖,需具有Hadoop-Common、HDFS、YARN和Hive服务,且元数据为自建 RDS或内置 MySQL。具体操作,请参见创建集群。或已自建与AnalyticDB MySQL湖仓版(3.0)集群同地域的Hive集群。
重要元数据类型为DLF 统一元数据的集群暂不支持使用AnalyticDB MySQL湖仓版(3.0)Spark通过ENI网络访问Hive数据。
操作步骤
下载AnalyticDB MySQL Spark访问Hive依赖的Jar包。下载链接,请参见mysql-connector-java.jar。
(条件必选)如果服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,请登录集群的Master节点,在
/opt/apps/HIVE/hive-current/lib
路径中,下载所有的Jar包。如何登录集群的Master节点,请参见登录集群。编写访问Hive的示例程序(即Spark作业依赖的Jar包),并进行编译打包。本文生成的Jar包名称为
hive_test.jar
。示例代码如下:package com.aliyun.spark import org.apache.spark.sql.SparkSession object SparkHive { def main(args: Array[String]): Unit = { val sparkSession = SparkSession .builder() .appName("Spark HIVE TEST") .enableHiveSupport() .getOrCreate() val welcome = "hello, adb-spark" //Hive表名。 val tableName = args(0) import sparkSession.implicits._ //将只有一行一列数据的DataFrame: df存入Hive, 表名为用户传进来的tableName, 列名为welcome_col。 val df = Seq(welcome).toDF("welcome_col") df.write.format("hive").mode("overwrite").saveAsTable(tableName) //从Hive中读取表tableName。 val dfFromHive = sparkSession.sql( s""" |select * from $tableName |""".stripMargin) dfFromHive.show(10) } }
将步骤1~3中Spark作业依赖的Jar包上传至OSS中。具体操作,请参见简单上传。
登录云原生数据仓库AnalyticDB MySQL控制台,在页面左上角,选择集群所在地域。在左侧导航栏,单击集群列表,在湖仓版(3.0)页签下,单击目标集群ID。在左侧导航栏,单击作业开发>Spark Jar开发。
在编辑器窗口上方,选择Job型资源组和Batch作业类型。
编写Spark作业。
支持通过不同协议方式连接Hive Metastore或RDS元数据库。
通过Thrift协议连接Hive Metastore
{ "args": [ "hello_adb" ], "jars": [ # AnalyticDB MySQL Spark访问Hive依赖的Jar包。 "oss://<bucket_name>/mysql-connector-java.jar", # 服务端Hive依赖的Jar包。 "oss://<bucket_name>/hive_lib/*" ], "file": "oss://<bucket_name>/hive_test.jar" , "name": "spark-on-hive", "className": "com.aliyun.spark.SparkHive", "conf": { "spark.adb.eni.enabled": "true", "spark.adb.eni.adbHostAlias.enabled": "true", "spark.adb.eni.vswitchId": "vsw-bp1mbnyrjtf3ih1****", "spark.adb.eni.securityGroupId": "sg-bp180fryne3qle****", "spark.driver.resourceSpec": "medium", "spark.executor.instances": 1, "spark.executor.resourceSpec": "medium", "spark.hadoop.hive.metastore.uris":"thrift://master-1-1.c-9c9b32****.cn-hangzhou.emr.aliyuncs.com:9083", "spark.adb.eni.extraHosts":"172.24.xx.xx master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com", # 仅E-MapReduce集群为高可用集群时,需配置以下参数。 "spark.hadoop.dfs.nameservices":"<dfs.nameservices名称>", "spark.hadoop.dfs.client.failover.proxy.provider.<dfs.nameservices名称>":"org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider", "spark.hadoop.dfs.ha.namenodes.<dfs.nameservices名称>":"<namenode名称>", "spark.hadoop.dfs.namenode.rpc-address.<dfs.nameservices名称>.<NameNode名称>":"master-1-1.c-9c9b322****.cn-hangzhou.emr.aliyuncs.com:9000", # 服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,自定义Hive版本的配置项。 "spark.sql.hive.metastore.jars": "path", "spark.sql.hive.metastore.version": "<实际的Hive版本>", "spark.sql.hive.metastore.jars.path": "/tmp/*/*.jar" } }
说明表格中的参数是否必填仅针对本文档的操作场景。
参数
是否必填
说明
args
是
请根据业务需求,填写使用Jar包时需要的参数。多个参数之间以英文逗号(,)分隔。
name
是
Spark作业名称。
className
是
Java或者Scala程序入口类名称。Python不需要指定入口类。
jars
是
Spark作业依赖的Jar包所在的OSS路径。
file
是
示例程序
hive_test.jar
所在的OSS路径。spark.adb.eni.enabled
是
开启ENI访问的开关。配置为true表示开启ENI访问。
spark.adb.eni.adbHostAlias.enabled
是
开启Spark解析Hive表位置域名信息的开关,需要配置为true。
spark.adb.eni.vswitchId
是
E-MapReduce集群所在专有网络的交换机ID。
登录专有网络页面,在目标专有网络的资源管理页签查看交换机ID。
spark.adb.eni.securityGroupId
是
安全组ID。在目标E-MapReduce集群基础信息页面获取安全组ID。
spark.adb.eni.extraHosts
否
Spark解析Hive表位置时,需要额外传入IP和表格存储节点Host的映射关系,以便Spark能正确解析表位置的域名信息。
获取域名:在自建集群的<Hive_CONF_DIR>/core-site.xml文件中查看fs.defaultFS获取域名。例如,fs.defaultFs的值为: hdfs://master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com:9000,则域名为master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com。
获取IP:登录自建集群的Master节点,在/etc/hosts中查看IP和域名的对应关系,获取IP。
说明当集群为自建Hive集群,且遇到域名无法解析时,此参数必填。如果是E-MapReduce集群,DNS服务可以解析该域名,此参数非必填。
IP和域名之间用空格隔开。多个IP和域名用英文逗号(,)隔开,如 "ip0 master0, ip1 master1"。
spark.hadoop.hive.metastore.uris
是
配置访问Hive Metastore的URI。
登录EMR on ECS控制台,在集群服务页面的Hive配置中查看hive.metastore.uris对应的配置值。
spark.hadoop.dfs.nameservices
否
HDFS服务的名称。
登录EMR on ECS控制台,在集群服务页面的HDFS配置中查看dfs.nameservices对应的配置值。
说明当E-MapReduce集群为高可用集群时,此参数必填。
spark.hadoop.dfs.client.failover.proxy.provider.<dfs.nameservices名称>
否
指定Client连接NameNode的Provider。
登录EMR on ECS控制台,在集群服务页面的HDFS配置中查看dfs.client.failover.proxy.provider.<nameservices名称>对应的配置值。默认值为org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider。
说明当E-MapReduce集群为高可用集群时,此参数必填。
spark.hadoop.dfs.ha.namenodes.<dfs.nameservices名称>
否
NameNode的名称。
登录EMR on ECS控制台,在集群服务页面的HDFS配置中查看hdfs-site.xml中的dfs.ha.namenodes.<dfs.nameservices名称>对应的配置值。
说明当E-MapReduce集群为高可用集群时,此参数必填。
spark.hadoop.dfs.namenode.rpc-address.<dfs.nameservices名称>.<namenode名称>
否
指定NameNode的RPC地址信息。
登录EMR on ECS控制台,在集群服务页面的HDFS配置中查看dfs.namenode.rpc-address.<dfs.nameservices名称>.<namenode名称>对应的配置值。
说明当E-MapReduce集群为高可用集群时,此参数必填。
spark.sql.hive.metastore.jars
否
固定取值为path。
说明当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。
spark.sql.hive.metastore.version
否
服务端Hive版本号。
说明当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。
spark.sql.hive.metastore.jars.path
否
固定取值为/tmp/*/*.jar。
说明当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。
conf
其他参数是
与开源Spark中的配置项基本一致,参数格式为
key:value
形式,多个参数之间以英文逗号(,)分隔。更多conf
参数,请参见Conf配置参数。通过JDBC协议连接RDS元数据库
{ "args": [ "hello_adb" ], "name": "spark-on-hive", "className": "com.aliyun.spark.SparkHive", "jars": [ # AnalyticDB MySQL Spark访问Hive依赖的Jar包。 "oss://<bucket_name>/mysql-connector-java.jar", # 服务端Hive依赖的Jar包。 "oss://<bucket_name>/hive_lib/*" ], "file": "oss://<bucket_name>/hive_test.jar" , "conf": { "spark.adb.eni.enabled": "true", "spark.adb.eni.vswitchId": "vsw-bp1mbnyrjtf3ih1****", "spark.adb.eni.securityGroupId": "sg-bp180fryne3qle****", "spark.adb.eni.adbHostAlias.enabled": "true", "spark.adb.eni.extraHosts":"172.24.xx.xx master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com", "spark.driver.resourceSpec": "medium", "spark.executor.instances": 1, "spark.executor.resourceSpec": "medium", "spark.sql.catalogImplementation": "hive", "spark.hadoop.javax.jdo.option.ConnectionDriverName": "com.mysql.jdbc.Driver", "spark.hadoop.javax.jdo.option.ConnectionUserName": "<hive_username>", "spark.hadoop.javax.jdo.option.ConnectionPassword": "<hive_password>", "spark.hadoop.javax.jdo.option.ConnectionURL": "jdbc:mysql://rm-bp1h5d11r8qtm****.mysql.rds.aliyuncs.com/<数据库名称>", # 服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,自定义Hive版本的配置项。 "spark.sql.hive.metastore.jars": "path", "spark.sql.hive.metastore.version": "<实际的Hive版本>", "spark.sql.hive.metastore.jars.path": "/tmp/*/*.jar" } }
说明表格中的参数是否必填仅针对本文档的操作场景。
参数
是否必填
说明
args
是
请根据业务需求,填写使用Jar包时需要的参数。多个参数之间以英文逗号(,)分隔。
name
是
Spark作业名称。
className
是
Java或者Scala程序入口类名称。Python不需要指定入口类。
jars
是
Spark作业依赖的Jar包所在的OSS路径。
file
是
示例程序
hive_test.jar
所在的OSS路径。spark.adb.eni.enabled
是
开启ENI访问的开关。配置为true表示开启ENI访问。
spark.adb.eni.vswitchId
是
E-MapReduce集群所在专有网络的交换机ID。
登录专有网络页面,在目标专有网络的资源管理页签查看交换机ID。
spark.adb.eni.securityGroupId
是
安全组ID。
在目标Hive集群基础信息页面获取安全组ID。
spark.adb.eni.adbHostAlias.enabled
是
开启Spark解析Hive表位置域名信息的开关,需要配置为true。
spark.adb.eni.extraHosts
否
Spark解析Hive表位置时,需要额外传入IP和表格存储节点Host的映射关系,以便Spark能正确解析表位置的域名信息。
获取域名:在自建集群的<Hive_CONF_DIR>/core-site.xml文件中查看fs.defaultFS获取域名。例如,fs.defaultFs的值为: hdfs://master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com:9000,则域名为master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com。
获取IP:登录自建集群的Master节点,在/etc/hosts中查看IP和域名的对应关系,获取IP。
说明当集群为自建Hive集群,且遇到域名无法解析时,此参数必填。如果是E-MapReduce集群,DNS服务可以解析该域名,此参数非必填。
IP和域名之间用空格隔开。多个IP和域名用英文逗号(,)隔开,如 "ip0 master0, ip1 master1"。
spark.hadoop.javax.jdo.option.ConnectionDriverName
是
连接驱动程序名称。
登录EMR on ECS控制台,在集群服务页面的Hive配置中查看hivemetastore-site.xml中的javax.jdo.option.ConnectionDriverName对应的配置值。
spark.hadoop.javax.jdo.option.ConnectionUserName
是
自建RDS或内置MySQL数据库账号名称。
登录EMR on ECS控制台,在集群服务页面的Hive配置中查看hivemetastore-site.xml中的javax.jdo.option.ConnectionUserName对应的配置值。
spark.hadoop.javax.jdo.option.ConnectionPassword
是
数据库账号对应的密码。
登录EMR on ECS控制台,在集群服务页面的Hive配置中查看hivemetastore-site.xml中的javax.jdo.option.ConnectionPassword对应的配置值。
spark.hadoop.javax.jdo.option.ConnectionURL
是
数据库访问地址和库名。
填写格式为
jdbc:mysql://rm-xxxxxx.mysql.rds.aliyuncs.com/<数据库名称>
。登录EMR on ECS控制台,在集群服务页面的Hive配置中查看hivemetastore-site.xml中的javax.jdo.option.ConnectionURL对应的配置值。
spark.sql.hive.metastore.jars
否
固定取值为path。
说明当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。
spark.sql.hive.metastore.version
否
服务端Hive版本号。
说明当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。
spark.sql.hive.metastore.jars.path
否
固定取值为/tmp/*/*.jar。
说明当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。
conf
其他参数是
与开源Spark中的配置项基本一致,参数格式为
key:value
形式,多个参数之间以英文逗号(,)分隔。更多conf
参数,请参见Conf配置参数。单击立即执行。