本文介绍如何使用Hive在EMR集群中创建OSS表。

背景信息

  • 在EMR集群中各引擎通常使用集群角色访问其他产品的数据以及服务,例如OSS Bucket数据。在访问之前确定集群角色是否有权限访问对应的产品,即如果集群角色具备相应产品的RAM访问权限,则EMR引擎具备相应的权限。具体操作,请参见角色授权
  • 在EMR集群中使用的Linux账号、LDAP账号、Kerberos身份等信息与您的RAM在无特别说明的情况下,并无对应关系。其他场景(如果开启了数据湖元数据权限,则存在同名映射关系。关于对应组件和服务说明的更多内容,请参见DLF-Auth。),可能存在映射关系。

使用Hive创建OSS库、表以及访问OSS数据

参照如下示例,使用Hive创建OSS数据库以及访问OSS。
CREATE DATABASE test_db location "oss://test_bucket/test_db"; //在OSS指定Bucket路径上创建名为test_db的数据库。test_bucket为示例路径,实际使用时替换成真实的路径。
USE test_db;
CREATE TABLE test_table (id INT, name STRING, age INT);
INSERT INTO test_table values(1,"ab",12);
SELECT * FROM test_table;

CREATE TABLE test_table_1 (id INT, name STRING, age INT) location "oss://test_bucket/test_db/test_table_1"; //在指定的Location上创建名为test_table的数据库。test_bucket为示例路径,实际使用时替换成真实的路径。
OK
1    ab    12
DROP TABLE test_table_1;
DROP DATABASE test_db;

Hive创建表时指定AccessKey

当前各引擎已不支持在建表语句中指定AccessKey。如果指定AccessKey,引擎执行时将会报错。您可以去掉OSS Location中的AccessKey,参见使用Hive创建OSS库、表以及访问OSS数据中的方式创建表。
hive> CREATE TABLE test_table (id INT, name STRING, age INT) location "oss://[accessKeyId]:[accessKeySecret]@test_bucket.oss-cn-hangzhou-internal.aliyuncs.com/test_db/test_table";

FAILED: SemanticException java.lang.IllegalArgumentException: The Filesystem URI contains login details. This authentication mechanism is no longer supported

集群显示指定访问OSS的AccessKey

更改免密配置

  1. EMR集群访问OSS是免密配置的。控制免密访问的配置项是hdfs组件core-site.xmlfs.oss.credentials.provider配置项。如果您想要去掉免密,使用AccessKey访问,需要把这个参数去掉,同时在core-site.xml中添加如下参数。
    <property>
      <name>fs.oss.accessKeyId</name>
      <value>LTAI5tM85Z4scN****</value>
    </property>
    <property>
      <name>fs.oss.accessKeySecret</name>
      <value>HF7P1L8PS6Eqfa****</value>
    </property>
  2. 在控制台执行如下命令,验证是否生效。
    //去掉fs.oss.credentials.provider配置后,通过ls命令,发现无法访问OSS
    hadoop fs -ls oss://test_bucket/test_db
    ls: ERROR: without login secrets configured.
    
    //加上AccessKey配置之后,可以看到能够查看oss文件目录
    hadoop fs -ls oss://test_bucket/test_db
    drwxrwxrwx   - root root          0 2022-11-30 12:51 oss://test_bucket/test_db/student
  3. 重启HiveServer2以及HiveMetaStore相关服务。