-
使用Hive客户端 以客户端安装用户,登录安装客户端的节点。 执行以下命令,切换到客户端安装目录。 cd /opt/hadoopclient 执行以下命令配置环境变量。 source bigdata_env 根据集群认证模式,完成Hive客户端登录。 如果当前集群开启了Kerberos认证,则执行以下命令,完成用户认证并登录Hive客户端,用户需具有创建Hive表的权限,例如,该用户属于“hive”、“hadoop”用户组,主组为“hive”。创建用户具体操作请参见创建Hive用户并绑定角色。 认证用户: kinit 组件业务用户 登录Hive客户端: beeline 如果当前集群未开启Kerberos认证,则执行以下命令,登录Hive客户端,如果不指定组件业务用户,则会以当前操作系统用户登录。 beeline -n组件业务用户 执行以下命令创建表,例如“test”: create table test(id int,name string); 执行以下命令向表中插入数据: insert into table test(id,name) values("11","A"); 执行以下命令查询表数据: select * from test; 执行以下命令删除Hive表: drop table test; 执行以下命令退出Hive客户端。 !q 退出beeline客户端时请使用!q命令,不要使用“Ctrl + C”。否则会导致连接生成的临时文件无法删除,长期会累积产生大量的垃圾文件。 在使用beeline客户端时,如果需要在一行中输入多条语句,语句之间以“;”分隔,需要将“entireLineAsCommand”的值设置为“false”。 设置方法:如果未启动beeline,则执行beeline --entireLineAsCommand=false命令;如果已启动beeline,则在beeline中执行!set entireLineAsCommand false命令。 设置完成后,如果语句中含有不是表示语句结束的“;”,需要进行转义,例如select concat_ws('\;', collect_set(col1)) from tbl。
-
创建Hudi表对应的Hive外部表 可在spark-shell或spark-sql中创建Hudi表并插入数据,具体操作请参见使用Spark Shell创建Hudi表或使用spark-sql操作Hudi表。 Hudi表数据在入湖的时候一般会同步到Hive外部表,此时在Beeline中可以直接查询到对应的Hive外部表,如果没有同步到Hive外部表,则可以通过Hudi客户端工具手动同步,具体步骤可参考将Hudi表数据同步到Hive。
-
查询Hudi的Schema演进表对应的Hive外部表 如果该Hudi表为Schema演进表(表的字段执行过修改),则在Hive客户端查询该表时还需额外设置一个参数: set hive.exec.schema.evolution=true; 例如以cow表实时视图的查询举例,其他各个视图的查询都要额外添加该参数: 设置“hive.exec.schema.evolution”为“true”: set hive.exec.schema.evolution=true; 查询Hive外部表: select * from hudicow;
-
约束与限制 不能对Hudi表映射的Hive外部表做增删改操作(即insert、update、delete、load、merge、alter、msck),只支持查询操作(select)。 表授权 不支持修改类权限操作(即update、Alter、write、All)。 备份与恢复 由于ro表和rt表均由同一个Hudi源表映射的,备份其中一张表,另一张也会跟着备份,恢复也是同时恢复的,因此只需备份其中一张表即可。 组件版本 Hive:
FusionInsight _HD_xxx,Hive内核版本3.1.0。 Spark2x:FusionInsight_Spark2x_xxx,Hudi内核版本:0.11.0。
-
Hudi表对应的Hive外部表介绍 Hudi源表对应一份HDFS的数据,通过Spark组件、Flink组件或者Hudi客户端,可以将Hudi表的数据映射为Hive外部表,基于该外部表,Hive可以进行实时视图查询、读优化视图查询以及增量视图查询。 根据Hudi源表的类型的不同,提供不同的视图查询: Hudi源表类型为Copy On Write时,可以映射为Hive的一张外部表,该表可以提供实时视图查询以及增量视图查询。 Hudi源表类型为Merge On Read时,可以映射为Hive的两张外部表(ro表和rt表),ro表提供读优化视图查询,rt表提供实时视图查询以及增量视图查询。
-
使用Hive客户端(
MRS 3.x之前版本) 安装客户端,具体请参考安装客户端章节。 以客户端安装用户,登录安装客户端的节点。 执行以下命令,切换到客户端安装目录。 cd /opt/hadoopclient 执行以下命令配置环境变量。 source bigdata_env 根据集群认证模式,完成Hive客户端登录。 安全模式,则执行以下命令,完成用户认证并登录Hive客户端。 kinit 组件业务用户 beeline 普通模式,则执行以下命令,登录Hive客户端,如果不指定组件业务用户,则会以当前操作系统用户登录。 beeline -n 组件业务用户 进行beeline连接后,可以编写并提交HQL语句执行相关任务。如需执行Catalog客户端命令,需要先执行!q命令退出beeline环境。 使用以下命令,执行HCatalog的客户端命令。 hcat -e "cmd" 其中"cmd"必须为Hive DDL语句,如hcat -e "show tables"。 若要使用HCatalog客户端,必须从“组件管理”页面单击“下载客户端”,下载全部服务的客户端。Beeline客户端不受此限制。 由于权限模型不兼容,使用HCatalog客户端创建的表,在HiveServer客户端中不能访问,但可以使用WebHCat客户端访问。 在普通模式下使用HCatalog客户端,系统将以当前登录操作系统用户来执行DDL命令。 退出beeline客户端时请使用!q命令,不要使用“Ctrl + c”。否则会导致连接生成的临时文件无法删除,长期会累积产生大量的垃圾文件。 在使用beeline客户端时,如果需要在一行中输入多条语句,语句之间以“;”分隔,需要将“entireLineAsCommand”的值设置为“false”。 设置方法:如果未启动beeline,则执行beeline --entireLineAsCommand=false命令;如果已启动beeline,则在beeline中执行!set entireLineAsCommand false命令。 设置完成后,如果语句中含有不是表示语句结束的“;”,需要进行转义,例如select concat_ws('\;', collect_set(col1)) from tbl。
-
操作步骤 以Hive客户端安装用户登录安装客户端的节点。 执行以下命令,切换到客户端安装目录。 cd 客户端安装目录 例如安装目录为“/opt/client”,则执行以下命令: cd /opt/client 执行以下命令配置环境变量。 source bigdata_env 集群是否启用了Kerberos认证。 是,执行以下命令进行用户认证: kinit Hive业务用户 否,执行5。 执行以下命令,将需要关联的关系型数据库驱动Jar包上传到HDFS目录下。 hdfs dfs -put Jar包所在目录 保存Jar包的HDFS目录 例如将“/opt”目录下Oracle驱动Jar包上传到HDFS的“/tmp”目录下,则执行如下命令。 hdfs dfs -put /opt/ojdbc6.jar /tmp 按照如下示例,在Hive客户端创建关联关系型数据库的外表。以下为关联Oracle linux6版本示例: 如果集群开启了Kerberos认证,创建Hive表的用户需要“ADMIN”权限,并设置admin权限: set role admin; 添加连接关系型数据库的驱动Jar包,不同数据库有不同的驱动Jar,且Jar包所在路径请以实际路径为准: ADD JAR hdfs:///tmp/ojdbc6.jar; 执行以下命令创建Hive表,且表的列需比数据库返回结果多一列用于分页查询: CREATE EXTERNAL TABLE ora_test
(id STRING,rownum string)
STORED BY 'com.qubitproducts.hive.storage.jdbc.JdbcStorageHandler'
TBLPROPERTIES (
"qubit.sql.database.type" = "ORACLE",
"qubit.sql.jdbc.url" = "jdbc:oracle:thin:@//10.163.xxx.xxx:1521/mydb",
"qubit.sql.jdbc.driver" = "oracle.jdbc.OracleDriver",
"qubit.sql.query" = "select name from aaa",
"qubit.sql.column.mapping" = "id=name",
"qubit.sql.dbcp.username" = "test",
"qubit.sql.dbcp.password" = "xxx"); 表1 创建Hive表参数说明 参数 参数说明 qubit.sql.database.type 用于设置关联的关系型数据库类型,例如“ORACLE”。 qubit.sql.jdbc.url 通过JDBC连接关系型数据库的URL,不同数据库有不同的URL格式,例如“jdbc:oracle:thin:@//10.163.xxx.xxx:1521/mydb”。 qubit.sql.jdbc.driver 用于配置关系型数据库驱动类名,例如“oracle.jdbc.OracleDriver”。 qubit.sql.query 在关系型数据库中执行的查询SQL语句,结果将返回至Hive表中。 qubit.sql.column.mapping 可选,Hive表的列与关系型数据库表的列进行匹配。 qubit.sql.dbcp.username 连接关系型数据库的用户名。 qubit.sql.dbcp.password 连接关系型数据库的用户密码。 命令中如果携带认证密码信息可能存在安全风险,在执行命令前建议关闭系统的history命令记录功能,避免信息泄露。
-
问题现象 在Hive客户端中使用Spark创建UDF函数时,报出"ERROR 10011","invalid function"的异常,如下: Error: Error while compiling statement: FAILED: SemanticException [Error 10011]: Line 1:7 Invalid function 'test_udf' (state=42000,code=10011) 在多个HiveServer之间使用UDF也存在上述问题。例如,在HiveServer1中使用HiveServer2创建的UDF,如果不及时同步元数据信息,连接HiveServer1的客户端也会提示上述错误信息。
-
处理步骤 调整上层业务,将动态分区数控制在“hive.exec.max.dynamic.partitions”参数值范围内。 执行set hive.exec.max.dynamic.partitions = XXX;命令调大“hive.exec.max.dynamic.partitions”参数值。 SparkSQL中需要设置“spark.hadoop.hive.exec.max.dynamic.partitions”参数。
-
操作步骤 以Hive客户端安装用户登录安装客户端的节点。 执行以下命令,切换到客户端安装目录。 cd 客户端安装目录 例如安装目录为“/opt/client”,则执行以下命令: cd /opt/client 执行以下命令配置环境变量。 source bigdata_env 集群认证模式是否为安全模式。 是,执行以下命令进行用户认证: kinit Hive业务用户 否,执行5。 执行以下命令,将需要关联的关系型数据库驱动Jar包上传到HDFS目录下。 hdfs dfs -put Jar包所在目录 保存Jar包的HDFS目录 例如将“/opt”目录下ORACLE驱动Jar包上传到HDFS的“/tmp”目录下,则执行如下命令。 hdfs dfs -put /opt/ojdbc6.jar /tmp 按照如下示例,在Hive客户端创建关联关系型数据库的外表。 如果是安全模式,建表的用户需要“ADMIN”权限,ADD JAR的路径请以实际路径为准。 -- 关联oracle linux6版本示例-- 如果是安全模式,设置admin权限 set role admin;-- 添加连接关系型数据库的驱动jar包,不同数据库有不同的驱动JARADD JAR hdfs:///tmp/ojdbc6.jar;CREATE EXTERNAL TABLE ora_test-- hive表的列需比数据库返回结果多一列用于分页查询(id STRING,rownum string)STORED BY 'com.qubitproducts.hive.storage.jdbc.JdbcStorageHandler'TBLPROPERTIES (-- 关系型数据库类型"qubit.sql.database.type" = "ORACLE",-- 通过JDBC连接关系型数据库的url(不同数据库有不同的url格式)"qubit.sql.jdbc.url" = "jdbc:oracle:thin:@//10.163.0.1:1521/mydb",-- 关系型数据库驱动类名"qubit.sql.jdbc.driver" = "oracle.jdbc.OracleDriver",-- 在关系型数据库查询的sql语句,结果将返回hive表"qubit.sql.query" = "select name from aaa",-- hive表的列与关系型数据库表的列进行匹配(可忽略)"qubit.sql.column.mapping" = "id=name",-- 关系型数据库用户"qubit.sql.dbcp.username" = "test",-- 关系型数据库密码,命令中如果携带认证密码信息可能存在安全风险,在执行命令前建议关闭系统的history命令记录功能,避免信息泄露。"qubit.sql.dbcp.password" = "xxx");