Kerberos安全认证-连载8-Hadoop Kerberos安全配置

目录

1. 安装libcrypto.so库

2. 创建HDFS服务用户

3. 配置各服务用户两两节点免密

4. 修改本地目录权限

5. 创建各服务Princial主体

6. 修改Hadoop配置文件

6.1 配置core-site.xml

6.2 配置hdfs-site.xml

​​​​​​​​​​​​​​6.3 配置Yarn-site.xml

​​​​​​​7. 配置Hadoop Https访问

​​​​​​​8. Yarn配置LinuxContainerExecutor

​​​​​​​​​​​​​​9. 启动安全认证的Hadoop集群

​​​​​​10. 修改HDFS路径访问权限


技术连载系列,前面内容请参考前面连载7内容:https://blog.csdn.net/qq_32020645/article/details/131081567

1. 安装libcrypto.so库

当使用Kerberos对Hadoop进行数据安全管理时,需要使用LinuxContainerExecutor,该类型Executor只支持在GNU / Linux操作系统上运行,并且可以提供更好的容器级别的安全性控制,例如通过在容器内运行应用程序的用户和组进行身份验证,此外,LinuxContainerExecutor还可以确保容器内的本地文件和目录仅能被应用程序所有者和NodeManager访问,这可以提高系统的安全性。

使用LinuxContainerExecutor时,会检测本地是否有libcrypto.so.1.1库,可以通过命令“find / -name "libcrypto.so.1.1"”来确定该库是否存在,目前这里使用的Centos7系统中默认没有该库,这里需要在node1~node5各个节点上进行安装,安装步骤如下。

1) 下载openssl源码包进行编译获取libcrypto.so.1.1库

在node1节点上下载openssl源码包,进行编译,步骤如下:

openssl-1.1.1k.tar.gz下载地址:https://download.csdn.net/download/qq_32020645/87873944

#下载openssl源码包,该源码也可以在资料中获取,名为:openssl-1.1.1k.tar.gz

[root@node1 ~]# cd /software && wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz --no-check-certificate



#安装编译源码所需依赖

[root@node1 openssl-1.1.1k]# yum -y install gcc+ gcc-c++ zlib-devel



#解压并编译

[root@node1 software]# tar -zxvf openssl-1.1.1k.tar.gz

[root@node1 software]# cd openssl-1.1.1k

[root@node1 openssl-1.1.1k]# ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib

[root@node1 openssl-1.1.1k]# make

[root@node1 openssl-1.1.1k]# make install

经过以上步骤已经获取了libcrypto.so.1.1库,位于/software/openssl-1.1.1k目录下。

2) 同步openssl安装包到其他节点

这里同步编译好的openssl安装包到node2~node5节点:

[root@node1 ~]# cd /software/

[root@node1 software]# scp -r openssl-1.1.1k node2:/software/

[root@node1 software]# scp -r openssl-1.1.1k node3:/software/

[root@node1 software]# scp -r openssl-1.1.1k node4:/software/

[root@node1 software]# scp -r openssl-1.1.1k node5:/software/

3) 各个节点创建libcrypto.so.1.1软链接

#在node1~node5节点执行如下命令,创建软链接

ln /software/openssl-1.1.1k/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

2. 创建HDFS服务用户

企业Hadoop中一般由不同的用户来控制不同的服务,这些用户分为hdfs、yarn和mapred用户,多用户的目的是为了实现权限控制和管理,不同的用户只能访问其需要的资源和操作,从而提高整个Hadoop集群的安全性和稳定性。

官方对于以上三种用户、所属组及管理的服务如下:

User:Group

Daemons

hdfs:hadoop

NameNode, Secondary NameNode, JournalNode, DataNode

yarn:hadoop

ResourceManager, NodeManager

mapred:hadoop

MapReduce JobHistory Server

按照如下步骤在所有节点上创建以上用户组、用户及设置密码:

1) 创建hadoop用户组

#node1~node5所有节点执行如下命令,创建hadoop用户组

groupadd hadoop

2) 创建用户

#node1~node5所有节点执行如下命令,创建各用户并指定所属hadoop组

useradd hdfs -g hadoop

useradd yarn -g hadoop

useradd mapred -g hadoop

3) 设置各个用户密码

#node1~node5所有节点上设置以上用户密码,这里设置为123456

passwd hdfs

passwd yarn

passwd mapred

​​​​​​​3. 配置各服务用户两两节点免密

每个用户控制不同服务会涉及到各个节点之间通信,这时需要设置各个用户之间的免密通信,按照如下步骤实现。

1) 设置hdfs用户两两节点之间免密

#所有节点切换成hdfs用户

su hdfs

cd ~



#node1~node5所有节点生成SSH密钥

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa



#node1~node5所有节点公钥复制到node1节点上,这个过程需要输入yes和密码

ssh-copy-id node1



#将node1 authorized_keys文件分发到node1~node5各节点,这个过程需要输入密码

[hdfs@node1 ~]$ cd ~/.ssh/

[hdfs@node1 .ssh]$ scp authorized_keys node2:`pwd`

[hdfs@node1 .ssh]$ scp authorized_keys node3:`pwd`

[hdfs@node1 .ssh]$ scp authorized_keys node4:`pwd`

[hdfs@node1 .ssh]$ scp authorized_keys node5:`pwd`



#两两节点进行ssh测试,这一步骤必须做,然后node1~node5节点退出当前hdfs用户

exit

2) 设置yarn用户两两节点之间免密

#所有节点切换成yarn用户

su yarn

cd ~



#node1~node5所有节点生成SSH密钥

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa



#node1~node5所有节点公钥复制到node1节点上,这个过程需要输入yes和密码

ssh-copy-id node1



#将node1 authorized_keys文件分发到node1~node5各节点,这个过程需要输入密码

[yarn@node1 ~]$ cd ~/.ssh/

[yarn@node1 .ssh]$ scp authorized_keys node2:`pwd`

[yarn@node1 .ssh]$ scp authorized_keys node3:`pwd`

[yarn@node1 .ssh]$ scp authorized_keys node4:`pwd`

[yarn@node1 .ssh]$ scp authorized_keys node5:`pwd`



#两两节点进行ssh测试,这一步骤必须做,然后node1~node5节点退出当前yarn用户

exit

3) 设置mapred用户两两节点之间免密

#所有节点切换成mapred用户

su mapred

cd ~



#node1~node5所有节点生成SSH密钥

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa



#node1~node5所有节点公钥复制到node1节点上,这个过程需要输入yes和密码

ssh-copy-id node1



#将node1 authorized_keys文件分发到node1~node5各节点,这个过程需要输入密码

[mapred@node1 ~]$ cd ~/.ssh/

[mapred@node1 .ssh]$ scp authorized_keys node2:`pwd`

[mapred@node1 .ssh]$ scp authorized_keys node3:`pwd`

[mapred@node1 .ssh]$ scp authorized_keys node4:`pwd`

[mapred@node1 .ssh]$ scp authorized_keys node5:`pwd`



#两两节点进行ssh测试,这一步骤必须做,然后node1~node5节点退出当前mapred用户

exit

​​​​​​​​​​​​​​4. 修改本地目录权限

Hadoop中不同的用户对不同目录拥有不同权限,下面是Hadoop官方给出的不同Hadoop相关目录对应的权限,这里需要按照该权限进行设置。

Filesystem

Path

User:Group

Permissions

local

dfs.namenode.name.dir

hdfs:hadoop

drwx------

local

dfs.datanode.data.dir

hdfs:hadoop

drwx------

local

$HADOOP_LOG_DIR

hdfs:hadoop

drwxrwxr-x

local

$YARN_LOG_DIR

yarn:hadoop

drwxrwxr-x

local

yarn.nodemanager.local-dirs

yarn:hadoop

drwxr-xr-x

local

yarn.nodemanager.log-dirs

yarn:hadoop

drwxr-xr-x

local

dfs.journalnode.edits.dir

hdfs:hadoop

drwx------

对于以上目录的解释如下:

  • dfs.namenode.name.dir

该配置项用于指定NameNode的数据存储目录,NameNode将所有的文件、目录和块信息存储在该目录下。该配置项配置在hdfs-site.xml中,默认值为file://${hadoop.tmp.dir}/dfs/name,${hadoop.tmp.dir}配置于core-site.xml中,默认为/opt/data/hadoop。这里我们需要修改/opt/data/hadoop/dfs/name路径的所有者和组为hdfs:hadoop,访问权限为700。

  • dfs.datanode.data.dir

该配置项用于指定DataNode的数据存储目录,DataNode将块数据存储在该目录下。在hdfs-site.xml中配置,默认值为file://${hadoop.tmp.dir}/dfs/data,这里我们需要修改/opt/data/hadoop/dfs/data路径的所有者和组为hdfs:hadoop,访问权限为700。

  • $HADOOP_LOG_DIR & $YARN_LOG_DIR

$HADOOP_LOG_DIR为Hadoop各组件的日志目录,$YARN_LOG_DIR为YARN各组件的日志目录,两者默认日志路径为HADOOP_HOME/logs。这里我们需要修改/software/hadoop-3.3.4/logs/路径的所有者和组为hdfs:hadoop,访问权限为775。

  • yarn.nodemanager.local-dirs

该配置指定指定NodeManager的本地工作目录。在yarn-site.xml中配置,默认值为file://${hadoop.tmp.dir}/nm-local-dir。这里我们修改/opt/data/hadoop/nm-local-dir路径的所有者和组为yarn:hadoop,访问权限为755。

  • yarn.nodemanager.log-dirs

该配置项指定NodeManager的日志目录。在yarn-site.xml中配置,默认值为 HADOOP_LOG_DIR/userlogs。这里我们修改/software/hadoop-3.3.4/logs/userlogs/路径的所有者和组为yarn:hadoop,访问权限为755。

  • dfs.journalnode.edits.dir

该配置项指定JournalNode的edits存储目录。在hdfs-site.xml中配置,默认值为/tmp/hadoop/dfs/journalnode/。这里我们配置的路径为/opt/data/journal/node/local/data,所以这里修改该路径的所有者和组为hdfs:hadoop,访问权限为700。

下面在node1~node5各个节点上执行如下命令进行以上用户和组、权限设置:

#在node1~node2 NameNode节点执行

chown -R hdfs:hadoop /opt/data/hadoop/dfs/name

chmod 700 /opt/data/hadoop/dfs/name



#在node3~node5 DataNode节点执行

chown -R hdfs:hadoop /opt/data/hadoop/dfs/data

chmod 700 /opt/data/hadoop/dfs/data



#在node1~node5所有节点执行

chown hdfs:hadoop /software/hadoop-3.3.4/logs/

chmod 775 /software/hadoop-3.3.4/logs/



#在node3~node5 NodeManager、JournalNode节点执行

chown -R yarn:hadoop /opt/data/hadoop/nm-local-dir

chmod -R 755 /opt/data/hadoop/nm-local-dir

chown yarn:hadoop /software/hadoop-3.3.4/logs/userlogs/

chmod 755 /software/hadoop-3.3.4/logs/userlogs/

chown -R hdfs:hadoop /opt/data/journal/node/local/data

chmod 700 /opt/data/journal/node/local/data

​​​​​​​5. 创建各服务Princial主体

Hadoop配置Kerberos安全认证后,为了让Hadoop集群中的服务能够相互通信并在集群中安全地进行数据交换,需要为每个服务实例配置其Kerberos主体,这样,各个服务实例就能够以其Kerberos主体身份进行身份验证,并获得访问Hadoop集群中的数据和资源所需的授权,Hadoop服务主体格式如下:ServiceName/HostName@REAL。

根据Hadoop集群各个节点服务分布,在Hadoop中创建的Kerbreos服务主体如下:

服务

主机

Principal主体

NameNode

node1

nn/node1

node2

nn/node2

DataNode

node3

dn/node3

node4

dn/node4

node5

dn/node5

JournalNode

node3

jn/node3

node4

jn/node4

node5

jn/node5

ResourceManager

node1

rm/node1

node2

rm/node2

NodeManager

node3

nm/node3

node4

nm/node4

node5

nm/node5

HTTP

node1

HTTP/node1

node2

HTTP/node2

node3

HTTP/node3

node4

HTTP/node4

node5

HTTP/node5

注意:以上HTTP服务主体用于Hadoop的Web控制台向Kerberos验证身份。

按照如下步骤在Kerberos服务端创建各个Hadoop服务主体并指定密码为123456。

#在Kerberos服务端node1节点执行如下命令

kadmin.local -q "addprinc -pw 123456 nn/node1"

kadmin.local -q "addprinc -pw 123456 nn/node2"

kadmin.local -q "addprinc -pw 123456 dn/node3"

kadmin.local -q "addprinc -pw 123456 dn/node4"

kadmin.local -q "addprinc -pw 123456 dn/node5"

kadmin.local -q "addprinc -pw 123456 jn/node3"

kadmin.local -q "addprinc -pw 123456 jn/node4"

kadmin.local -q "addprinc -pw 123456 jn/node5"

kadmin.local -q "addprinc -pw 123456 rm/node1"

kadmin.local -q "addprinc -pw 123456 rm/node2"

kadmin.local -q "addprinc -pw 123456 nm/node3"

kadmin.local -q "addprinc -pw 123456 nm/node4"

kadmin.local -q "addprinc -pw 123456 nm/node5"

kadmin.local -q "addprinc -pw 123456 HTTP/node1"

kadmin.local -q "addprinc -pw 123456 HTTP/node2"

kadmin.local -q "addprinc -pw 123456 HTTP/node3"

kadmin.local -q "addprinc -pw 123456 HTTP/node4"

kadmin.local -q "addprinc -pw 123456 HTTP/node5"

注意:以上命令也可以在客户端执行类似“kadmin -p test/admin -w 123456 -q "addprinc -pw 123456 xx/xx"”这种命令来创建Hadoop各服务主体。

创建好Hadoop各服务主体后,可以将这些主体写入不同的Keytab密钥文件,然后将这些文件分发到Hadoop各个节点上,当Hadoop各服务之间通信认证时可以通过keytab密钥文件进行认证,按照如下步骤来完成keytab文件生成以及赋权:

1) 创建存储keytab文件的路径

在node1~node5所有节点创建keytab文件路径,命令如下:

#node1~node5各节点执行如下命令

mkdir -p /home/keytabs

2) 将Hadoop服务主体写入到keytab文件

在Kerberos服务端node1节点上,执行如下命令将Hadoop各服务主体写入到keytab文件。

#node1 节点执行如下命令

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/nn.service.keytab nn/node1@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/nn.service.keytab nn/node2@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/dn.service.keytab dn/node3@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/dn.service.keytab dn/node4@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/dn.service.keytab dn/node5@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/jn.service.keytab jn/node3@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/jn.service.keytab jn/node4@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/jn.service.keytab jn/node5@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/rm.service.keytab rm/node1@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/rm.service.keytab rm/node2@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/nm.service.keytab nm/node3@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/nm.service.keytab nm/node4@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/nm.service.keytab nm/node5@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/spnego.service.keytab HTTP/node1@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/spnego.service.keytab HTTP/node2@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/spnego.service.keytab HTTP/node3@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/spnego.service.keytab HTTP/node4@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/spnego.service.keytab HTTP/node5@EXAMPLE.COM"

以上命令执行之后,可以在node1节点/home/keytabs路径下看到创建的各个keytab文件。

[root@node1 ~]# ls /home/keytabs/

dn.service.keytab  nm.service.keytab  rm.service.keytab

jn.service.keytab  nn.service.keytab  spnego.service.keytab

3) 发送keytab文件到其他节点

将在node1 kerberos服务端生成的keytab文件发送到Hadoop各个节点。

#node1节点执行如下命令

[root@node1 ~]# scp -r /home/keytabs/* node2:/home/keytabs/

[root@node1 ~]# scp -r /home/keytabs/* node3:/home/keytabs/

[root@node1 ~]# scp -r /home/keytabs/* node4:/home/keytabs/

[root@node1 ~]# scp -r /home/keytabs/* node5:/home/keytabs/

4) 修改keytab文件权限

这里修改各个节点的keytab文件访问权限目的是为了保证hdfs、yarn、mapred各个用户能访问到这些keytab文件。

#node1~node5各节点执行如下命令

chown -R root:hadoop /home/keytabs

chmod 770 /home/keytabs/*

chmod 770 /home/keytabs/

​​​​​​​6. 修改Hadoop配置文件

这里分别需要对Hadoop各个节点core-site.xml、hdfs-site.xml、yarn-site.xm配置kerberos安全认证。

​​​​​​​​​​​​​​6.1 配置core-site.xml

在node1~node5各个节点上配置core-site.xml,追加如下配置:

    <!-- 启用Kerberos安全认证 -->

    <property>

      <name>hadoop.security.authentication</name>

      <value>kerberos</value>

    </property>

    

    <!-- 启用Hadoop集群授权管理 -->

    <property>

      <name>hadoop.security.authorization</name>

      <value>true</value>

    </property>



    <!-- 外部系统用户身份映射到Hadoop用户的机制 -->

    <property>

      <name>hadoop.security.auth_to_local.mechanism</name>

      <value>MIT</value>

    </property>



    <!-- Kerberos主体到Hadoop用户的具体映射规则 -->

    <property>

      <name>hadoop.security.auth_to_local</name>

      <value>

        RULE:[2:$1/$2@$0]([ndj]n\/.*@EXAMPLE\.COM)s/.*/hdfs/

        RULE:[2:$1/$2@$0]([rn]m\/.*@EXAMPLE\.COM)s/.*/yarn/

        RULE:[2:$1/$2@$0](jhs\/.*@EXAMPLE\.COM)s/.*/mapred/

        DEFAULT

      </value>

    </property>

以上关于 “hadoop.security.auth_to_local”配置项中的value解释如下,规则 RULE:[2:$1/$2@$0]([ndj]n\/.*@EXAMPLE\.COM)s/.*/hdfs/ 表示对于 Kerberos 主体中以 nn/、dn/、jn/ 开头的名称,在 EXAMPLE.COM 域中使用正则表达式 .* 进行匹配,将其映射为 Hadoop 中的 hdfs 用户名。其中,$0 表示 Kerberos 主体中的域名部分,$1 和 $2 表示其他两个部分。​​​​​​​

6.2 配置hdfs-site.xml

在node1~node5各个节点上配置hdfs-site.xml,追加如下配置:

    <!-- 开启访问DataNode数据块需Kerberos认证 -->

    <property>

      <name>dfs.block.access.token.enable</name>

      <value>true</value>

    </property>

    

    <!-- NameNode服务的Kerberos主体 -->

    <property>

      <name>dfs.namenode.kerberos.principal</name>

      <value>nn/_HOST@EXAMPLE.COM</value>

    </property>

    

    <!-- NameNode服务的keytab密钥文件路径 -->

    <property>

      <name>dfs.namenode.keytab.file</name>

      <value>/home/keytabs/nn.service.keytab</value>

    </property>

    

    <!-- DataNode服务的Kerberos主体 -->

    <property>

      <name>dfs.datanode.kerberos.principal</name>

      <value>dn/_HOST@EXAMPLE.COM</value>

    </property>

    

    <!-- DataNode服务的keytab密钥文件路径 -->

    <property>

      <name>dfs.datanode.keytab.file</name>

      <value>/home/keytabs/dn.service.keytab</value>

    </property>

    

    <!-- JournalNode服务的Kerberos主体 -->

    <property>

      <name>dfs.journalnode.kerberos.principal</name>

      <value>jn/_HOST@EXAMPLE.COM</value>

    </property>

    

    <!-- JournalNode服务的keytab密钥文件路径 -->

    <property>

      <name>dfs.journalnode.keytab.file</name>

      <value>/home/keytabs/jn.service.keytab</value>

    </property>

    

    <!-- 配置HDFS支持HTTPS协议 -->

    <property>

      <name>dfs.http.policy</name>

      <value>HTTPS_ONLY</value>

    </property>

    

    <!-- 配置DataNode数据传输保护策略为仅认证模式 -->

    <property>

      <name>dfs.data.transfer.protection</name>

      <value>authentication</value>

    </property>

    

    <!-- HDFS WebUI服务认证主体 -->

    <property>

      <name>dfs.web.authentication.kerberos.principal</name>

      <value>HTTP/_HOST@EXAMPLE.COM</value>

    </property>

    

    <!-- HDFS WebUI服务keytab密钥文件路径 -->

    <property>

      <name>dfs.web.authentication.kerberos.keytab</name>

      <value>/home/keytabs/spnego.service.keytab</value>

    </property>

    

    <!-- NameNode WebUI 服务认证主体 -->

    <property>

      <name>dfs.namenode.kerberos.internal.spnego.principal</name>

      <value>HTTP/_HOST@EXAMPLE.COM</value>

    </property>

    

    <!-- JournalNode WebUI 服务认证主体 -->

    <property>

      <name>dfs.journalnode.kerberos.internal.spnego.principal</name>

      <value>HTTP/_HOST@EXAMPLE.COM</value>

    </property>

注意:以上配置中"_HOST" 将被替换为运行 Web 服务的实际主机名。

此外,还需要修改hdfs-site.xml中如下属性为hdfs用户下的rsa私钥文件,否则在节点之间HA切换时不能正常切换。

<property>

        <name>dfs.ha.fencing.ssh.private-key-files</name>

        <value>/home/hdfs/.ssh/id_rsa</value>

    </property>

​​​​​​​​​​​​​​6.3 配置Yarn-site.xml

在node1~node5各个节点上配置yarn-site.xml,追加如下配置:

    <!-- ResourceManager 服务主体 -->

    <property>

      <name>yarn.resourcemanager.principal</name>

      <value>rm/_HOST@EXAMPLE.COM</value>

    </property>

    

    <!-- ResourceManager 服务keytab密钥文件 -->

    <property>

      <name>yarn.resourcemanager.keytab</name>

      <value>/home/keytabs/rm.service.keytab</value>

    </property>

    

    <!-- NodeManager 服务主体-->

    <property>

      <name>yarn.nodemanager.principal</name>

      <value>nm/_HOST@EXAMPLE.COM</value>

    </property>

    

    <!-- NodeManager 服务keytab密钥文件 -->

    <property>

      <name>yarn.nodemanager.keytab</name>

      <value>/home/keytabs/nm.service.keytab</value>

    </property>

​​​​​​​7. 配置Hadoop Https访问

HTTP的全称是Hypertext Transfer Protocol Vertion (超文本传输协议),HTTPS的全称是Secure Hypertext Transfer Protocol(安全超文本传输协议),HTTPS基于HTTP开发,使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版,HTTPS = HTTP+SSL。

SSL(Secure Sockets Layer)是一种加密通信协议,它使用公钥加密和私钥解密的方式来确保数据传输的安全性。Hadoop配置Kerberos对Hadoop访问进行认证时,官方建议对Hadoop采用HTTPS访问方式保证数据安全传输,防止在数据传输过程中被窃听、篡改或伪造等攻击,提高数据的保密性、完整性和可靠性。按照如下步骤对Hadoop设置HTTPS访问。

1) 生成私钥和证书文件

在node1节点执行如下命令生成私钥和证书文件:

#执行如下命令需要输入密码,这里设置密码为123456

[root@node1 ~]# openssl req -new -x509 -keyout /root/hdfs_ca_key -out /root/hdfs_ca_cert -days 36500 -subj '/C=CN/ST=beijing/L=haidian/O=devA/OU=devB/CN=devC'

以上命令使用 OpenSSL 工具生成一个自签名的 X.509 证书,执行完成后,会在/root目录下生成私钥文件hdfs_ca_key和证书文件hdfs_ca_cert。

2) 将证书文件和私钥文件发送到其他节点

这里将证书文件和私钥文件发送到node2~node5节点上,后续各节点需要基于两个文件生成SSL认证文件。

[root@node1 ~]# scp ./hdfs_ca_cert ./hdfs_ca_key node2:/root/

[root@node1 ~]# scp ./hdfs_ca_cert ./hdfs_ca_key node3:/root/

[root@node1 ~]# scp ./hdfs_ca_cert ./hdfs_ca_key node4:/root/

[root@node1 ~]# scp ./hdfs_ca_cert ./hdfs_ca_key node5:/root/

3) 生成keystore文件

keystore文件存储了SSL握手所涉及的私钥以及证书链信息,在node1~node5各节点执行如下命令,各个节点对应--alise不同且CN不同,这里的CN虽说是组织名随意取名,但是在后续配置中建议配置为各节点的hostname,这样不会出现验证出错。

[root@node1 ~]# keytool -keystore /root/keystore -alias node1 -genkey -keyalg RSA -dname "CN=node1, OU=dev, O=dev, L=dev, ST=dev, C=CN"

[root@node2 ~]# keytool -keystore /root/keystore -alias node2 -genkey -keyalg RSA -dname "CN=node2, OU=dev, O=dev, L=dev, ST=dev, C=CN"

[root@node3 ~]# keytool -keystore /root/keystore -alias node3 -genkey -keyalg RSA -dname "CN=node3, OU=dev, O=dev, L=dev, ST=dev, C=CN"

[root@node4 ~]# keytool -keystore /root/keystore -alias node4 -genkey -keyalg RSA -dname "CN=node4, OU=dev, O=dev, L=dev, ST=dev, C=CN"

[root@node5 ~]# keytool -keystore /root/keystore -alias node5 -genkey -keyalg RSA -dname "CN=node5, OU=dev, O=dev, L=dev, ST=dev, C=CN"

以上命令执行时需要密钥库口令,这里设置为123456,执行完成后会在/root目录下产生keystore文件。关于该命令每个选项和参数解释如下:

  • keytool:Java密钥和证书管理工具的命令行实用程序。
  • -keystore /home/keystore:指定密钥库的位置和名称,这里为“/home/keystore”。
  • -alias jetty:指定别名,这里为各节点hostname,用于标识存储在密钥库中的密钥对。
  • -genkey:指定将生成新密钥对的操作。
  • -keyalg RSA:指定密钥算法,这里为RSA。
  • -dname "CN=dev1, OU=dev2, O=dev3, L=dev4, ST=dev5, C=CN":指定用于生成证书请求的“主题可分辨名称”,包含以下信息:
    • CN(Common Name):指定通用名称,这里建议配置为各hostname。
    • OU(Organizational Unit):指定组织单位。
    • O(Organization):指定组织名称。
    • L(Locality):指定所在城市或地点。
    • ST(State or Province):指定所在省份或州。
    • C(Country):指定所在国家或地区,这里为“CN”(中国)。

4) 生成truststore文件

truststore文件存储了可信任的根证书,用于验证服务器证书链中的证书是否可信,在node1~node5各个节点执行如下命令生成truststore文件。

keytool -keystore /root/truststore -alias CARoot -import -file /root/hdfs_ca_cert

以上命令使用 Java 工具 keytool 将之前生成的自签名 CA 证书 hdfs_ca_cert 导入到指定的 truststore 文件中,并将其命名为 CARoot。命令执行后会在各个节点/root目录下生成truststore文件。

5) 从 keystore 中导出 cert

在各个节点上执行命令,从对应的keystore文件中提取证书请求并保存在cert文件中。

#各节点-alias不同,需要输入口令,这里设置为123456

[root@node1 ~]# keytool -certreq -alias node1 -keystore /root/keystore -file /root/cert

[root@node2 ~]# keytool -certreq -alias node2 -keystore /root/keystore -file /root/cert

[root@node3 ~]# keytool -certreq -alias node3 -keystore /root/keystore -file /root/cert

[root@node4 ~]# keytool -certreq -alias node4 -keystore /root/keystore -file /root/cert

[root@node5 ~]# keytool -certreq -alias node5 -keystore /root/keystore -file /root/cert

注意:--alias 需要与各节点生成keystore指定的别名一致。命令执行后,在各个节点上会生成/root/cert文件。

6) 生成自签名证书

这里使用最开始生成的hdfs_ca_cert证书文件和hdfs_ca_key密钥文件对cert进行签名,生成自签名证书。在node1~node5各节点执行如下命令,命令执行后会在/root下生成cert_signed文件。

#执行如下命令需要输入CA证书文件口令,默认123456

openssl x509 -req -CA /root/hdfs_ca_cert -CAkey /root/hdfs_ca_key -in /root/cert -out /root/cert_signed -days 36500 -CAcreateserial

7) 将CA证书导入到keystore

在node1~node5各个节点上执行如下命令,将之前生成的hdfs_ca_cert证书文件导入到keystore中。

#执行如下命令,需要输入keystore口令,默认123456

keytool -keystore /root/keystore -alias CARoot -import -file /root/hdfs_ca_cert

8) 将自签名证书导入到keystore

在node1~node5各个节点上执行如下命令,将生成的cert_signed自签名证书导入到keystore中。

#各个节点 alias不同。执行如下命令,需要输入keystore口令,默认123456

[root@node1 ~]# keytool -keystore /root/keystore -alias node1 -import -file /root/cert_signed

[root@node2 ~]# keytool -keystore /root/keystore -alias node2 -import -file /root/cert_signed

[root@node3 ~]# keytool -keystore /root/keystore -alias node3 -import -file /root/cert_signed

[root@node4 ~]# keytool -keystore /root/keystore -alias node4 -import -file /root/cert_signed

[root@node5 ~]# keytool -keystore /root/keystore -alias node5 -import -file /root/cert_signed

9) 将keystore和trustores存入/home目录

将目前在/root目录下生成的keystore和trustores文件复制到/home目录下,并修改访问权限。

#在node1~node5所有节点执行如下命令

cp keystore truststore /home/

chown -R root:hadoop /home/keystore

chown -R root:hadoop /home/truststore

chmod 770 /home/keystore

chmod 770 /home/truststore

10) 配置ssl-server.xml文件

ssl-server.xml位于HADOOP_HOME/etc/hadoop/目录下,包含了Hadoop服务器端(如NameNode和DataNode)用于配置SSL/TLS连接的参数。在node1~node5所有节点中都需要配置ssl-server.xml文件。

#node1~node5所有节点执行

cd /software/hadoop-3.3.4/etc/hadoop/

mv ssl-server.xml.example ssl-server.xml



#配置的ssl-server.xml文件内容如下:

<configuration>



<property>

  <name>ssl.server.truststore.location</name>

  <value>/home/truststore</value>

  <description>Truststore to be used by NN and DN. Must be specified.

  </description>

</property>



<property>

  <name>ssl.server.truststore.password</name>

  <value>123456</value>

  <description>Optional. Default value is "".

  </description>

</property>



<property>

  <name>ssl.server.truststore.type</name>

  <value>jks</value>

  <description>Optional. The keystore file format, default value is "jks".

  </description>

</property>



<property>

  <name>ssl.server.truststore.reload.interval</name>

  <value>10000</value>

  <description>Truststore reload check interval, in milliseconds.

  Default value is 10000 (10 seconds).

  </description>

</property>



<property>

  <name>ssl.server.keystore.location</name>

  <value>/home/keystore</value>

  <description>Keystore to be used by NN and DN. Must be specified.

  </description>

</property>



<property>

  <name>ssl.server.keystore.password</name>

  <value>123456</value>

  <description>Must be specified.

  </description>

</property>



<property>

  <name>ssl.server.keystore.keypassword</name>

  <value>123456</value>

  <description>Must be specified.

  </description>

</property>



<property>

  <name>ssl.server.keystore.type</name>

  <value>jks</value>

  <description>Optional. The keystore file format, default value is "jks".

  </description>

</property>



<property>

  <name>ssl.server.exclude.cipher.list</name>

  <value>TLS_ECDHE_RSA_WITH_RC4_128_SHA,SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,

  SSL_RSA_WITH_DES_CBC_SHA,SSL_DHE_RSA_WITH_DES_CBC_SHA,

  SSL_RSA_EXPORT_WITH_RC4_40_MD5,SSL_RSA_EXPORT_WITH_DES40_CBC_SHA,

  SSL_RSA_WITH_RC4_128_MD5</value>

  <description>Optional. The weak security cipher suites that you want excluded

  from SSL communication.</description>

</property>



</configuration>

11) 配置ssl-client.xml文件

ssl-client.xml位于HADOOP_HOME/etc/hadoop/目录下,包含了Hadoop客户端端(如HDFS客户端和YARN客户端)用于配置SSL/TLS连接的参数。在node1~node5所有节点中都需要配置ssl-client.xml文件。

#node1~node5所有节点执行

cd /software/hadoop-3.3.4/etc/hadoop/

mv ssl-client.xml.example ssl-client.xml



#配置的ssl-client.xml文件内容如下:

<configuration>



<property>

  <name>ssl.client.truststore.location</name>

  <value>/home/truststore</value>

  <description>Truststore to be used by clients like distcp. Must be

  specified.

  </description>

</property>



<property>

  <name>ssl.client.truststore.password</name>

  <value>123456</value>

  <description>Optional. Default value is "".

  </description>

</property>



<property>

  <name>ssl.client.truststore.type</name>

  <value>jks</value>

  <description>Optional. The keystore file format, default value is "jks".

  </description>

</property>



<property>

  <name>ssl.client.truststore.reload.interval</name>

  <value>10000</value>

  <description>Truststore reload check interval, in milliseconds.

  Default value is 10000 (10 seconds).

  </description>

</property>



<property>

  <name>ssl.client.keystore.location</name>

  <value>/home/keystore</value>

  <description>Keystore to be used by clients like distcp. Must be

  specified.

  </description>

</property>



<property>

  <name>ssl.client.keystore.password</name>

  <value>123456</value>

  <description>Optional. Default value is "".

  </description>

</property>



<property>

  <name>ssl.client.keystore.keypassword</name>

  <value>123456</value>

  <description>Optional. Default value is "".

  </description>

</property>



<property>

  <name>ssl.client.keystore.type</name>

  <value>jks</value>

  <description>Optional. The keystore file format, default value is "jks".

  </description>

</property>



</configuration>

 

注意:以上ssl-server.xml和ssl-client.xml也可以先在node1节点配置完成后,然后分发到node2~node5节点:


[root@node1 hadoop]# scp ./ssl-server.xml ./ssl-client.xml node2:`pwd`

[root@node1 hadoop]# scp ./ssl-server.xml ./ssl-client.xml node3:`pwd`

[root@node1 hadoop]# scp ./ssl-server.xml ./ssl-client.xml node4:`pwd`

[root@node1 hadoop]# scp ./ssl-server.xml ./ssl-client.xml node5:`pwd`

​​​​​​​8. Yarn配置LinuxContainerExecutor

LinuxContainerExecutor(LCE)是Hadoop用于管理容器的一种执行器,它可以创建、启动和停止应用程序容器,并且能够隔离和限制容器内的资源使用,例如内存、CPU、网络和磁盘等资源。在使用Kerberos进行身份验证和安全通信时,需要使用LCE作为容器的执行器。可以按照如下步骤进行配置。

1) 修改container-executor所有者和权限

container-executor位于HADOOP_HOME/bin目录中,该文件是LinuxContainerExecutor的可执行脚本文件,该文件所有者和权限如下:

#node1~node5所有节点执行

chown root:hadoop /software/hadoop-3.3.4/bin/container-executor

chmod 6050 /software/hadoop-3.3.4/bin/container-executor

2) 配置container-executor.cfg文件

container-executor.cfg文件位于HADOOP_HOME/etc/hadoop/中,该文件是Hadoop中LinuxContainerExecutor(LCE)使用的配置文件,它定义了LCE如何运行容器,以及如何设置容器的用户和组映射。

在node1~node5所有节点上修改HADOOP_HOME/etc/hadoop/container-executor.cfg文件配置,内容如下:


#在node1~node5所有节点配置container-executor.cfg

#vim /software/hadoop-3.3.4/etc/hadoop/container-executor.cfg

yarn.nodemanager.linux-container-executor.group=hadoop

banned.users=hdfs,yarn,mapred

min.user.id=1000

allowed.system.users=foo,bar

feature.tc.enabled=false

3) 修改container-executor.cfg所有者和权限

container-executor.cfg文件所有者和权限设置如下:

#node1~node5所有节点执行

chown root:hadoop /software/hadoop-3.3.4/etc/hadoop/container-executor.cfg

chown root:hadoop /software/hadoop-3.3.4/etc/hadoop

chown root:hadoop /software/hadoop-3.3.4/etc

chown root:hadoop /software/hadoop-3.3.4

chown root:hadoop /software

chmod 400 /software/hadoop-3.3.4/etc/hadoop/container-executor.cfg

4) 配置yarn-site.xml

需要在hadoop各个节点上配置yarn-site.xml配置文件,指定使用LinuxContainerExecutor。这里在node1~node5各个节点上向yarn-site.xml追加如下内容。

#在node1~node5所有节点向yarn-site.xml中追加如下内容

#vim /software/hadoop-3.3.4/etc/hadoop/yarn-site.xml

    <!-- 配置NodeManager使用LinuxContainerExecutor管理Container -->

    <property>

      <name>yarn.nodemanager.container-executor.class</name>

      <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>

    </property>

    

    <!-- 配置NodeManager的启动用户的所属组 -->

    <property>

      <name>yarn.nodemanager.linux-container-executor.group</name>

      <value>hadoop</value>

    </property>

    

    <!-- LinuxContainerExecutor脚本路径 -->

    <property>

      <name>yarn.nodemanager.linux-container-executor.path</name>

      <value>/software/hadoop-3.3.4/bin/container-executor</value>

    </property>

​​​​​​​​​​​​​​9. 启动安全认证的Hadoop集群

这里首先需要配置HADOOP_HOME/sbin/目录中的start-dfs.sh、stop-dfs.sh、start-yarn.sh、stop-yarn.sh启动脚本中不同服务对应用户信息。配置如下:

1) 配置dfs启停脚本

在node1节点上配置start-dfs.sh && stop-dfs.sh,两文件中修改如下配置:

# 在两个文件中加入如下配置

HDFS_DATANODE_USER=hdfs

HDFS_DATANODE_SECURE_USER=hdfs

HDFS_NAMENODE_USER=hdfs

HDFS_JOURNALNODE_USER=hdfs

HDFS_ZKFC_USER=hdfs

2) 配置yarn启停脚本

在node1 节点上配置start-yarn.sh && stop-yarn.sh,两文件中修改如下配置:

#在两个文件中加入如下配置

YARN_RESOURCEMANAGER_USER=yarn

YARN_NODEMANAGER_USER=yarn

3) 分发到所有hadoop节点

将以上配置文件分发到node2~node5所有节点上。

#node1节点执行,分发到其他节点

[root@node1 ~]# cd /software/hadoop-3.3.4/sbin/

[root@node1 sbin]# scp ./start-dfs.sh stop-dfs.sh start-yarn.sh stop-yarn.sh  node2:`pwd`

[root@node1 sbin]# scp ./start-dfs.sh stop-dfs.sh start-yarn.sh stop-yarn.sh  node3:`pwd`

[root@node1 sbin]# scp ./start-dfs.sh stop-dfs.sh start-yarn.sh stop-yarn.sh  node4:`pwd`

[root@node1 sbin]# scp ./start-dfs.sh stop-dfs.sh start-yarn.sh stop-yarn.sh  node5:`pwd`

以上配置完成后,在node1节点启动Kerberos认证的HDFS集群,命令如下:

#在node1节点执行如下命令启动Hadoop集群

[root@node1 ~]# start-dfs.sh

[root@node1 ~]# start-yarn.sh

注意启动HDFS后,由于开启的SSL配置,HDFS默认的WEBUI访问端口为9871。HDFS访问URL为https://node1:9871,Yarn访问URL为https://node1:8088。

​​​​​​10. 修改HDFS路径访问权限

Hadoop启动后,不同的用户对于HDFS中的目录访问权限不同,以下是官方建议的HDFS目录访问用户、组、权限。启动HDFS后按照如下权限进行设置。

Filesystem

Path

User:Group

Permissions

hdfs

/

hdfs:hadoop

drwxr-xr-x

hdfs

/tmp

hdfs:hadoop

drwxrwxrwxt

hdfs

/user

hdfs:hadoop

drwxr-xr-x

hdfs

yarn.nodemanager.remote-app-log-dir

yarn:hadoop

drwxrwxrwxt

hdfs

mapreduce.jobhistory.intermediate-done-dir

mapred:hadoop

drwxrwxrwxt

hdfs

mapreduce.jobhistory.done-dir

mapred:hadoop

drwxr-x---

  • yarn.nodemanager.remote-app-log-dir

该参数指定NodeManager在HDFS上存储应用程序日志的目录,在yarn-site.xml中配置,默认是/tmp/logs,目前在HDFS中没有该目录,需要先创建,然后进行用户及组、访问权限设置。

  • mapreduce.jobhistory.intermediate-done-dir

该参数指定JobHistory Server在任务完成后将中间数据保存到的目录,在mapred-site.xml中配置,默认为/tmp/hadoop-yarn/staging/history/done_intermediate,目前在HDFS中没有该目录,需要先创建,然后进行用户及组、访问权限设置。

  • mapreduce.jobhistory.done-dir

该参数指定JobHistory Server在任务完成后将最终结果保存到的目录,在mapred-site.xml中配置,默认为/tmp/hadoop-yarn/staging/history/done,该目录不存在,需要先创建,然后进行用户及组、访问权限设置。

下面对以上HDFS中的目录进行用户组和权限设置。

1) 创建hdfs Principal用户主体

创建hdfs用户主体进行目录权限设置。

#在node1 kerberos 服务节点执行

[root@node1 ~]# kadmin.local -q "addprinc -pw 123456 hdfs"



#在node1~node5任意一节点进行认证hdfs用户主体,这里在node1节点认证

[root@node1 ~]# kinit hdfs

Password for hdfs@EXAMPLE.COM: 123456



#查看认证结果

[root@node1 ~]# klist

Ticket cache: FILE:/tmp/krb5cc_0

Default principal: hdfs@EXAMPLE.COM

2) 登录HDFS创建缺失目录

​
#在node1登录hdfs,设置HDFS对应目录权限

[root@node1 ~]# hadoop fs -chown hdfs:hadoop / /tmp /user

[root@node1 ~]# hadoop fs -chmod 755 /

[root@node1 ~]# hadoop fs -chmod 777 /tmp

[root@node1 ~]# hadoop fs -chmod 755 /user



[root@node1 ~]# hadoop fs -chown yarn:hadoop /tmp/logs

[root@node1 ~]# hadoop fs -chmod 777 /tmp/logs



[root@node1 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/history/done_intermediate

[root@node1 ~]# hadoop fs -chmod 777 /tmp/hadoop-yarn/staging/history/done_intermediate



[root@node1 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/history/

[root@node1 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/

[root@node1 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/



[root@node1 ~]# hadoop fs -chmod 770 /tmp/hadoop-yarn/staging/history/

[root@node1 ~]# hadoop fs -chmod 770 /tmp/hadoop-yarn/staging/

[root@node1 ~]# hadoop fs -chmod 770 /tmp/hadoop-yarn/



[root@node1 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/history/done

[root@node1 ~]# hadoop fs -chmod 777 /tmp/hadoop-yarn/staging/history/done

​

3) 设置对应目录用户、所属组及权限

#在node1登录hdfs,设置HDFS对应目录权限

[root@node1 ~]# hadoop fs -chown hdfs:hadoop / /tmp /user

[root@node1 ~]# hadoop fs -chmod 755 /

[root@node1 ~]# hadoop fs -chmod 777 /tmp

[root@node1 ~]# hadoop fs -chmod 755 /user



[root@node1 ~]# hadoop fs -chown yarn:hadoop /tmp/logs

[root@node1 ~]# hadoop fs -chmod 777 /tmp/logs



[root@node1 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/history/done_intermediate

[root@node1 ~]# hadoop fs -chmod 777 /tmp/hadoop-yarn/staging/history/done_intermediate



[root@node1 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/history/

[root@node1 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/

[root@node1 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/



[root@node1 ~]# hadoop fs -chmod 770 /tmp/hadoop-yarn/staging/history/

[root@node1 ~]# hadoop fs -chmod 770 /tmp/hadoop-yarn/staging/

[root@node1 ~]# hadoop fs -chmod 770 /tmp/hadoop-yarn/



[root@node1 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/history/done

[root@node1 ~]# hadoop fs -chmod 777 /tmp/hadoop-yarn/staging/history/done

欢迎点赞、评论、收藏,关注IT贫道,获取IT技术知识!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 您好, 如果您的服务器有kerberos安全认证,那么在使用spark-sql操作hdfs文件时,需要进行以下步骤: 1. 配置kerberos认证信息:在spark的配置文件中,需要配置kerberos认证信息,包括krb5.conf文件路径、keytab文件路径、principal等信息。 2. 启用kerberos认证:在spark-submit或spark-shell命令中,需要添加--principal和--keytab参数,指定使用哪个principal和keytab文件进行认证。 3. 配置hdfs认证信息:在hdfs-site.xml文件中,需要配置hadoop.security.authentication为kerberos,并配置hadoop.security.authorization为true。 4. 配置hdfs权限:在hdfs中,需要为spark用户授权,使其能够访问hdfs文件。 完成以上步骤后,您就可以使用spark-sql操作hdfs文件了。如果您还有其他问题,请随时联系我。 ### 回答2: Spark SQL是一种可以结合HDFS文件进行操作的处理引擎,它可以很好地支持Kerberos认证,在保证数据安全的同时,可以使用HDFS文件进行处理和分析。 首先,如果服务器上安装了Kerberos安全认证,那么我们需要先在Spark SQL中配置Kerberos认证,以保证Spark SQL能够正常访问HDFS文件。具体的配置步骤如下: 1. 在Spark的conf目录下找到spark-defaults.conf文件,添加以下配置: spark.hadoop.fs.defaultFS hdfs://namenode:8020 spark.hadoop.hadoop.security.authentication kerberos spark.hadoop.hadoop.security.authorization true spark.hadoop.hadoop.security.auth_to_local "DEFAULT" spark.hadoop.hadoop.security.auth_to_local.rules "RULE:[1:$1@$0](.*@MYREALM.COM)s/@.*//DEFAULT\nRULE:[2:$1@$0](.*@MYREALM.COM)s/@.*//DEFAULT" 2.将Kerberos配置文件krb5.conf放到Spark conf目录下,并且保持与Hadoop配置文件相同。 3.将spark-submit命令添加以下参数: --jars $KRB5_LIB_PATH/krb5-1.13.2.jar,$KRB5_LIB_PATH/javax.security.auth.jar \ --principal ${kinit-user}@${REALM} --keytab ${keytab-file}.keytab 其中,$KRB5_LIB_PATH是Kerberos安装路径,${kinit-user}是Kerberos用户,${REALM}是域名称,${keytab-file}是keytab文件名称。 以上配置完成后,就可以使用Spark SQL对HDFS文件进行处理和分析了。具体的操作步骤如下: 1.创建SparkSession连接: val spark = SparkSession .builder() .appName("Spark SQL Kerberos Demo") .config("spark.sql.warehouse.dir", "$HIVE_HOME/warehouse") .enableHiveSupport() .getOrCreate() 2.加载HDFS文件: val data = spark.read.format("csv") .option("header", "true") .option("inferSchema", "true") .load("hdfs://namenode:8020/user/data/file.csv") 其中,文件路径为HDFS的绝对路径。 3.对数据进行处理: data.createOrReplaceTempView("temp_table") val result = spark.sql("SELECT COUNT(*) FROM temp_table") 其中,将数据加载到临时表中,使用SQL语句对数据进行统计处理。 4.输出结果: result.show() 以上就是使用Spark SQL操作HDFS文件的步骤和方法,并且在Kerberos认证的环境下实现数据的安全处理。通过以上的配置和步骤,我们可以很好地利用Spark SQL来分析和处理大数据,提高数据分析的效率和精度。 ### 回答3: Apache Spark是一种大数据处理框架,它可以快速高效地处理数据,包括从hdfs文件中读取和写入数据。在使用Spark进行数据处理时,很可能需要在kerberos安全认证的服务器上访问hdfs文件,因此需要进行相应的操作。 首先,要在Spark中配置kerberos认证信息。这可以通过在spark-env.sh文件中设置相关的环境变量来实现。以下是一个示例: export HADOOP_CONF_DIR=/etc/hadoop/conf export KRB5_CONF=/etc/krb5.conf export SPARK_OPTS="--driver-java-options=-Djava.security.auth.login.config=/etc/hadoop/conf/kafka_client_jaas.conf" 这里,HADOOP_CONF_DIR指定了hadoop配置文件的路径,KRB5_CONF指定了krb5.conf的路径,SPARK_OPTS指定了Java选项的设置,通过这些设置,Spark将可以访问kerberos下的hdfs文件。 接下来,可以使用Spark SQL来读取和写入hdfs文件。在Spark中,可以使用SparkSession创建一个SQLContext对象,该对象允许使用Spark SQL来查询和处理数据。以下是一个简单的例子: from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("Read and Write from kerberos") \ .getOrCreate() # 读取hdfs文件 data = spark.read.parquet("hdfs://<namenode>/<file-path>") # 进行数据处理和转换 # 写入hdfs文件 data.write.parquet("hdfs://<namenode>/<file-path>") 这里,`SparkSession.builder`用于创建一个SparkSession对象,并指定应用程序名称。使用`spark.read`方法可以让SparkSQL从hdfs中读取数据,使用`data.write`方法可以将处理后的数据写回到hdfs中。 总的来说,通过Spark SQL,我们可以方便地操作hdfs文件,而通过设置kerberos认证信息,我们可以在安全的环境下进行数据处理和存储。这使得Spark在大数据处理方面具有非常广泛的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT贫道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值