1、Hadoop的部分属性
2、Hadoop的安全性
1、委任和解除节点
Hadoop集群的管理员经常需要向集群中添加节点或从集群中移除节点。例如,为了扩大存储容量,需要委任节点;相反的,如果想要缩小集群规模或节点表现反常,例如故障率过高或者性能过低,则需要解除该节点。
委任新节点
include文件说明:允许连接到namenode的所有datanode放在一个文件中,文件名称有dfs.hosts属性指定。该文件放在namenode的本地文件系统中,每行对应一个datanode的网络地址,如果需要为一个datanode指定多个网络地址,可将多个网络地址放在一行,由空格隔开;类似的,连接到资源管理器的各个节点管理器也在同一个文件中指定,该文件的名称由yarn.resourcemanager.nodes.include-path属性指定。通常情况下,由于集群中的节点同时运行datanode和节点管理器守护进程,dfs.hosts和yarn.resourcemanager.nodes.include-path会同时指向一个文件,即include文件。
向集群添加新节点的步骤如下:
(1) 将新节点的网络地址添加到include文件中
(2) 运行 %hdfs dfsadmin -refreshNodes 指令,将审核过的一系列datanode集合更新至namenode信息
(3) 运行 %yarn rmadmin -refreshNodes 指令,将审核过的一系列节点管理器信息更新至资源管理器
(4) 将新节点更新slaves文件中,这样的话,Hadoop控制脚本会将新节点包括在文件操作之中
(5) 启动新的datanode和节点管理器
(6) 检查新的datanode和节点管理器是否都出现在网页界面中
同时,HDFS不会自动将块从旧的datanode移到新的datanode以平衡集群,用户需要自行运行均衡器。
解除旧节点
解除节点的过程由exclude文件控制,对于HDFS来说,文件由dfs.hosts.exclude属性设置;对于YARN来说,文件由yarn.resourcemanager.nodes.exclude-path属性设置。这些文件列出若干未被允许连接到集群的节点,通常,这两个属性指向同一个文件。
从集群中移除节点的步骤如下:
(1) 将待解除节点的网络地址添加到exclude文件中,不更新include文件
(2) 运行 %hdfs dfsadmin -refreshNodes 指令,将审核过的一系列datanode集合更新至namenode信息
(3) 运行 %yarn rmadmin -refreshNodes 指令,将审核过的一系列节点管理器信息更新至资源管理器
(4) 转到网页界面,查看待解除datanode的管理状态是否已经变为“正在解除”(Decommission In Progress),因为此时相关的datanode正在被解除过程之中。这些datanode会把它们的块复制到其他的datanode中
(5) 当所有datanode的状态变为“解除完毕”(Decommissioned)时,表明所有块都已经复制完毕。关闭已经解除的节点
(6) 从include文件中移除这些节点,并运行以下命令:%hdfs dfsadmin -refreshNodes;%yarn rmadmin -refreshNodes
(7) 从slaves文件中移除节点
2、缓冲区大小
Hadoop使用一个4kb的缓冲区辅助I/O操作,而增大缓冲区容量会显著提高性能,可以通过core-site.xml文件中的io.file.buffer.size属性来设置缓冲区大小(以字节为单位)
3、HDFS块大小
在默认情况下,HDFS块大小是128MB,而提高块大小可以降低namenode的内存压力,并向mapper传输更多数据。可以通过hdfs-site.xml文件中的dfs.blocksize属性设置块大小(以字节为单位)
4、保留的存储空间
默认情况下,datanode能够使用存储目录上的所有闲置空间,如果计划将部分空间留给其他应用程序,则需要设置dfs.datanode.du.reserved属性来指定待保留的空间大小(以字节为单位)
5、回收站
Hadoop文件系统也有回收站设施,被删除的文件未被真正删除,仅只转移到回收站(一个特定文件夹中)。回收站中的文件在被永久删除之前仍会至少保留一段时间,该信息由core-site.xml文件中的fs.trash.interval属性(以分钟为单位)设置。默认情况下,该属性的值是0,表示回收站特性无效。当回收站被启用时,每个用户都有独立的回收站目录,即home目录下的.Trash目录,恢复文件也很简易:在.Trash的子目录中找到文件,并将其移出.Trash目录。
6、作业调度
在针对多用户的设置中,可以考虑升级作业调度器队列配置,以反映在组织方面的需求。Yarn中有三种调度器可供使用:FIFO调度器(FIFO Scheduler),容量调度器(Capacity Scheduler)和公平调度器(Fair Scheduler)。
上图描述了三种调度器之间的差异性,由图中所知,当使用FIFO调度器时,小作业一直被阻塞,直到大作业完成;使用容量调度器时,一个独立的专门队列保证小作业一提交就可以启动,由于队列容量是为那个队列有所保留的,因此这种策略是以整个集群的利用率为代价的;使用公平调度器,不需要预留一定量的资源,因为调度器会在所有运行的作业之间动态平衡资源。第一个作业启动时,它是唯一的作业,因而获得集群中的所有资源;当第二个作业启动时,它被分配到集群的一半资源,这样每个作业都能公平共享资源。
FIFO调度器的优点是,简单易懂,不需要任何配置,但是不适合共享集群。大的应用会占用集群中的所有资源,所以每个应用必须等待直到轮到自己执行;在一个共享集群中,更适合使用的是容量调度器和公平调度器。
7、慢启动reduce
在默认情况下,调度器将会一直等待,直到该作业的5%的map任务已经结束才会调度reduce任务。对于大型作业来说,这可能会降低集群的利用率,因为在等待map任务执行完毕的过程中,占用了reduce容器;可以将mapreduce.job.reduce.slowstart.completedmaps的值设的更大,例如0.8(80%),能够提升吞吐率。
8、短回路本地读
当从HDFS读取文件时,客户端联系datanode,然后数据通过TCP连接发送给客户端。如果正在读取的数据块和客户端在同一节点上,那么客户端绕过网络从磁盘上直接读取数据效率会更高,这又称作“短回路本地读”,这种方式能够让应用程序如Hbase执行效率更高。将属性dfs.client.read.shortcircuit设置为true,即可启用短回路本地读。该读操作基于Unix域套接字实现,在客户端和datanode之间的通信中使用了一个本地路径;该路径使用属性dfs.domain.socker.path进行设置,且必须是一条仅有datanode用户或root用户能够创建的路径,例如/var/run/hadoop-hdfs/dn_socket。
1、Kerberos和Hadoop
使用Kerberos时,一个客户端要经过三个步骤才可以获得服务,在各个步骤,客户端需要和一个服务器交换报文,整个过程如下图所示
1、认证;客户端向认证服务器发送一条报文,并获取一个含时间戳的票据授予票据(Ticket-Granting Ticket,TGT)
2、授权;客户端使用TGT向票据授予服务器(Ticket-Granting Server,TGS)请求一个服务票据
3、服务请求;客户端向服务端出示服务票据,以证实自己的合法性。该服务器提供客户端所需服务,在Hadoop应用中,服务请可以是namenode或者资源管理器
授权和服务请求步骤并非用户级别的行为:客户端系统会代替用户来执行这些步骤;但是认证步骤通常需要由用户调用kinit命令来执行,该过程会提示用户输入密码;并不是每次运行一个作业或访问HDFS的时候都需要输入密码,TGT具备一定的有效期,默认值是10个小时;或者采用自动认证,在登录操作系统时自动执行认证操作,从而只需单次登录Hadoop。如果用户不希望被提示输入密码,则可以使用ktutil命令创建一个Kerberos的keytab文件,该文件保存了用户密码并且可以通过-t选项应用于kinit命令。
2、委托令牌
用户在执行kinit命令登录后,Hadoop使用委托令牌来支持后续访问,避免多个访问KDC;委托令牌由服务器(指代namenode)创建,可以视为客户端和服务器之间共享的一个密文。当客户端首次通过RPC访问namenode时,客户端并没有委托令牌,因而需要利用Kerberos进行人认证后,客户端从namenode取得一个委托令牌,在后续的RPC调用中,客户端只需出示委托令牌,namenode就能验证委托令牌的真伪,并因此向服务器认证客户端的身份。
客户端需要使用一种特殊类型的委托令牌来执行HDFS块操作,称为“块访问令牌”(block access token);当客户端向namenode发出元数据请求时,namenode创建相应的块访问令牌并发送回客户端。客户端使用块访问令牌向datanode认证自己的访问权限。由于namenode会和datanode分享创建块访问令牌时用的密钥(通过心跳信息传送),datanode也能验证这些块访问令牌;仅当客户端已经从namenode获取了针对某一个HDFS块的块访问令牌,才可以访问该块。
在MapReduce中,application master 共享HDFS中的作业资源和元数据(例如JAR文件,输入分片,配置文件),在作业运行过程中,通过使用委托令牌访问HDFS;作业结束,委托令牌失效。
默认的HDFS实例会自动获得委托令牌,但若一个作业试图访问其他HDFS集群,则用户必须将mapreduce.job.hdfs-servers作业属性设置为一个由逗号隔开的HDFS URI列表,才能获取相应的委托令牌。
3、其他安全性
分享大数据学习历程,坚持一周一篇原创,欢迎一起关注学习
我现在坚持一定会有收获