类别

版本

通过Spark Script访问Hive

火花脚本允许您使用自定义脚本扩展您的流程。在这些脚本中,如果集群端设置允许,你可以直接访问Hive表/视图,并使用HiveQL语法。本节的目的是介绍启用该特性的需求。

在Spark代码中访问Hive是由HiveContext在Spark 1。x(从Spark 1.5开始)和SparkSession在Spark 2.x中。PySpark (Python)和SparkR (R) api具有这些特性。火花脚本Radoop操作符有一个参数叫做启用Hive访问需要显式检查以在脚本中启用这些api。

但是,在Hive仓库和Spark之间共享数据需要在集群上进行适当的安全设置。负责授权访问的组件在这两个组件之间可能不同。本节概述如何解决此问题。从技术上讲,您需要为在集群上运行Spark Script的用户设置对HDFS上的Hive仓库和Hive Metastore的访问权限。

可以通过以下方式判断集群中运行Spark Script作业的用户:

  • 当禁用安全性(Kerberos身份验证)时,它是Hadoop的用户名在Radoop连接中。
  • 启用安全性时,但是用户模拟被禁用,则客户端主要转换为用户的auth_to_local集群规则(hadoop.security.auth_to_local)。
  • 当安全性和用户模拟(在服务器上启用模拟)为启用状态:

    • 在服务器中,它是RapidMiner服务器用户;
    • 在Studio中客户端主要转换为用户的auth_to_local集群规则(hadoop.security.auth_to_local),除非用于本地测试的模拟用户设置(用于测试目的),在这种情况下,用户是在该字段中指定的用户。

为简单起见,我们称其为用户rmuser和它的基团rmgroup贯穿本节。

两个主要要求是:

  1. rmuser(或rmgroup)必须能够访问Hive Metastore;

  2. rmuser(或rmgroup)必须能够访问Hive仓库目录中特定的HDFS文件/目录(这些文件属于脚本中使用的Hive表)。

的集群上Hive基于存储的授权,第二个条件仍然意味着rmuser必须对包含Hive表内容的HDFS文件和文件夹具有读写权限(根据操作不同)。一般来说,要在Spark Script中实现所有类型的操作,用户必须具有所有权限(特权)在HDFS的Hive仓库目录下。

在具有更高级授权组件的集群上,这些需求的设置取决于授权设置。负责授权的组件依赖于特定的Hadoop发行版。你需要配置负责授权的组件(HDFS, Sentry, Ranger…),以允许这种访问。

使用Apache Sentry进行授权时的设置

当使用Apache Sentry进行授权时,则蜂巢user(运行HiveServer2的用户)和group拥有Hive仓库目录,通常没有其他用户可以访问其中的文件。这意味着用户rmuser(运行Spark作业)无法访问HDFS上表的内容。为了正确地允许用户访问这些文件,而不是蜂巢,如果哨兵授权,则需要以下步骤:

  1. 打开哨兵权限和HDFS acl同步,并给予所需的权限rmuserrmgroup无论是在Sentry中还是使用HDFS acl。您可能决定不启用同步,但Cloudera文档不建议这样做。

  2. 该集团rmgroup也需要访问Hive Metastore。如果该访问受到限制,则通过以下步骤授予该访问权限(类似于禁止Hive CLI用户访问Hive metastoreCloudera文档中的步骤):

    1. 在Cloudera Manager管理控制台中选择蜂巢服务。

    2. 在Hive服务页面,单击配置选项卡。

    3. 在搜索字段中,搜索Hive Metastore访问控制和代理用户组覆盖要找到hadoop.proxyuser.hive.groups设置。

    4. 单击加号添加以下组(替换rmgroup包含RapidMiner用户所属的组):rmgroup

    5. 点击保存更改

指定自定义Spark版本

Radoop不依赖于集群上的任何Spark服务。它只需要在HDFS或本地文件系统(所有节点)上安装Spark Assembly (Spark 1.x)或Spark Archive (Spark 2.x)。但是在Spark 1中使用Hive访问时。x (Spark 1.5+)通过HiveContext, Hive jar文件必须添加到作业的类路径中——这是由Radoop自动完成的。为了避免这样的问题,不建议使用自定义Spark Assembly这与Hadoop发行版所提供的不同在Spark 1中使用Hive访问时。x脚本,因为可能会出现兼容性问题。中有显式的设计时警告火花脚本如果类路径上存在不同的Spark版本,则在Studio中使用。