[TOC]html
上一份工做主要负责大数据平台的建设,在这个过程当中积累了一些Hadoop生态组件的搭建和使用笔记,因为时间关系,不打算去修改其中的错别字和排版问题,直接释出原始笔记。
一个hadoop基本集群,牵涉三个组件:java
mr 负责分布式计算node
配置etc/hadoop/hadoop-env.sh、etc/hadoop/hadoop-env.sh、etc/hadoop/yarn-env.sh 这三个脚原本配置三个组件执行的环境变量
固然,机器特定的环境变量能够放在 /etc/profile.d 中linux
最重要的是在上述三个shell脚本的最后,配置JAVA_HOME。
上述三个shell中,有大量环境变量KEY能够配置,他们通常见名知意。可使用一些带OPTS后缀的配置,去覆盖那些特定配置。带OPTS的后缀有web
好比HADOOP_HEAPSIZE_MAX=1g 能够被HADOOP_NAMENODE_OPTS="-Xmx5g" 所覆盖shell
上述环境变量配置好后,就要配置hdfs, yarn, mr三者的进程,即程序执行的行为属性。其分别对应的配置文件为apache
hdfs的配置bootstrap
yarn的配置api
能够针hdfs,mr,yarn三个组件的各角色进行启动。浏览器
其中Hdfs的各角色,可使用etc/hadoop/workers
配置,经过$HADOOP_HOME/sbin/start-dfs.sh
批量启动。
具体启停看文档
Hadoop Rack Awareness,启用该特性,让Hadoop集群感知物理存储拓扑,从而更好的提升数据分片性能,具体看文档
能够指定一些监控nodeManager状态的脚本给NodeManager, NodeManager会周期性的调用,检查本身的状态,yarn则会收集该状态,而后不会将程序分发到这些异常NodeManager上执行
文档地址:https://hadoop.apache.org/doc...
若是hadoop操做的是hdfs,那么下面两种命令格式等效
bin/hadoop fs <args>
hdfs dfs <args>
hadoop fs的相关命令支持多种文件系统
hadoop fs命令通常操做的文件系统路径格式URI为scheme://authority/path
,好比hdfs举例hdfs://namenodehost/parent/child
将本地单个文件或多个文件,或则本机的标准输入中的内容,拷贝到目标文件系统
用法:hadoop fs -appendToFile <localsrc> ... <dst>
hadoop fs -appendToFile localfile /user/hadoop/hadoopfile hadoop fs -appendToFile localfile1 localfile2 /user/hadoop/hadoopfile hadoop fs -appendToFile localfile hdfs://nn.example.com/hadoop/hadoopfile hadoop fs -appendToFile - hdfs://nn.example.com/hadoop/hadoopfile Reads the input from stdin.
Returns 0 on success and 1 on error.
将文件系统中指定文件内容输出到终端
用法:hadoop fs -cat [-ignoreCrc] URI [URI ...]
hadoop fs -cat hdfs://nn1.example.com/file1 hdfs://nn2.example.com/file2 hadoop fs -cat file:///file3 /user/hadoop/file4
Returns 0 on success and -1 on error
对指定文件生成checksum值
用法:hadoop fs -checksum URI
hadoop fs -checksum hdfs://nn1.example.com/file1 hadoop fs -checksum file:///etc/hosts
改变文件的组
用法:hadoop fs -chgrp [-R] GROUP URI [URI ...]
改变文件的读写执行模式
用法: hadoop fs -chmod [-R] <MODE[,MODE]... | OCTALMODE> URI [URI ...]
todo:具体mod详情,须要再查阅
改变文件的拥有者
用法:hadoop fs -chown [-R] [OWNER][:[GROUP]] URI [URI ]
将当前机器本地文件,拷贝到分布式文件系统
用法: hadoop fs -copyFromLocal [args] <localsrc> URI
其中命令参数有如下几个,都是可选
._COPYING_
格式的文件将分布式文件系统中的文件拷贝到本地
同进指定路径的文件、文件夹个数、当前文件占用量大小、指定路径容许建立的文件、文件夹个数,以及容许的最大文件、文件容量
用法:hadoop fs -count [-q] [-h] [-v] [-x] [-t [<storage type>]] [-u] [-e] <paths>
若是只用quota,而不加任何如下且与参数,则输出的统计项有
DIR_COUNT(当前路径的文件夹个数), FILE_COUNT(文件个数), CONTENT_SIZE(容量占用大小), PATHNAME(当前统计的路径)
QUOTA(总的name quota的大小), REMAINING_QUOTA(还剩name quota的大小), SPACE_QUOTA(space quota的大小), REMAINING_SPACE_QUOTA(还剩的space quota的大小), DIR_COUNT, FILE_COUNT, CONTENT_SIZE, PATHNAME
QUOTA, REMAINING_QUOTA, SPACE_QUOTA, REMAINING_SPACE_QUOTA, PATHNAME
demo举例
hadoop fs -count hdfs://nn1.example.com/file1 hdfs://nn2.example.com/file2 hadoop fs -count -q hdfs://nn1.example.com/file1 hadoop fs -count -q -h hdfs://nn1.example.com/file1 hadoop fs -count -q -h -v hdfs://nn1.example.com/file1 hadoop fs -count -u hdfs://nn1.example.com/file1 hadoop fs -count -u -h hdfs://nn1.example.com/file1 hadoop fs -count -u -h -v hdfs://nn1.example.com/file1 hadoop fs -count -e hdfs://nn1.example.com/file1
对于quota(配额)的说明:
使用hadoop fs -count -q
命令查询配合时,若是配额没有设置,会显示none
或inf
可使用hdfs dfsadmin
命令对某个指定路径设置配额
将一个文件或多个文件拷贝到另外一个地方。
拷贝当个文件时,目的地能够是另外一个文件,也能够是文件夹
拷贝多个文件时,目的地必须是文件夹
用法:hadoop fs -cp [-f] [-p | -p[topax]] URI [URI ...] <dest>
查询某个指定路径的剩余容量
用法:hadoop fs -df [-h] URI [URI ...]
df是看的整个文件系统的使用状况和可用空间
而-count是计算指定目录的空间占用状况,以及管理员给分配的配合使用状况
查看指定路径的文件和文件夹大小汇总
查找指定路径下,名字知足表达式的文件,并打印到终端
hadoop fs -find / -name test -print
-name 对文件名大小写敏感
-iname 文件名大小写不敏感
将hdfs中的文件拷贝到本地
返回文件的访问控制列表
将指定文件夹中的全部文件合并后,生成到目标文件中
用法:hadoop fs -getmerge [-nl] <src> <localdst>
hadoop fs -getmerge -nl /src /opt/output.txt //将src文件夹下的全部文件合并到output.txt hadoop fs -getmerge -nl /src/file1.txt /src/file2.txt /output.txt//将file1.txt和file2.txt合并到output.txt
将指定文件头一千行数据输出到终端
hadoop fs -head pathname
将指定文件尾部一千行数据输出到终端
hadoop fs -tail [-f] URI
hadoop fs -help
全部fs命令的帮助手册
hadoop fs -usage command 查看单个命令的使用手册
删减指定文件的指定行数
建立一个文件,就像Linux的touch命令
hadoop fs -touchz pathname
不存在则建立文件,存在则更新文件的更新时间
以文本形式输出一个指定文件
测试指定路径是否存在,是不是文件或文件夹
设置文件或文件夹的副本数。若是是文件夹,则会将该文件夹下的全部文件副本数一并设置
hadoop fs -setrep -w 3 /user/hadoop/dir1
-w表示命令是否等待全部操做完成
对指定文件设置附加属性。一个文件固有的属性有其Permission,和modifytime。用户能够选择添加一些附加属性
设置指定文件或文件夹的访问控制列表
hadoop fs -rmdir /user/hadoop/emptydir
删除一个指定文件。若是回收垃圾桶功能有的话,删除操做会将将文件移动到垃圾桶trash
hadoop fs -rm hdfs://nn.example.com/file /user/hadoop/emptydir
将本地的一个或多个文件复制到分布式文件系统中的指定路径
hadoop fs -put localfile /user/hadoop/hadoopfile hadoop fs -put -f localfile1 localfile2 /user/hadoop/hadoopdir hadoop fs -put -d localfile hdfs://nn.example.com/hadoop/hadoopfile hadoop fs -put - hdfs://nn.example.com/hadoop/hadoopfile Reads the input from stdin.
将本地文件移动到文件系统,注意是移动,移动后,本地文件将被删除
hadoop fs -moveFromLocal <localsrc> <dst>
文件移动,要是移动多个文件的话,目的地必须为一个文件夹
hadoop fs -mv /user/hadoop/file1 /user/hadoop/file2 hadoop fs -mv hdfs://nn.example.com/file1 hdfs://nn.example.com/file2 hdfs://nn.example.com/file3 hdfs://nn.example.com/dir1
建立文件夹
用法:hadoop fs -mkdir [-p] <paths>
hadoop fs -mkdir /user/hadoop/dir1 /user/hadoop/dir2 hadoop fs -mkdir hdfs://nn1.example.com/user/hadoop/dir hdfs://nn2.example.com/user/hadoop/dir
用法:hadoop fs -ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] <args>
参数列表以下
-C: Display the paths of files and directories only. -d: Directories are listed as plain files. -h: Format file sizes in a human-readable fashion (eg 64.0m instead of 67108864). -q: Print ? instead of non-printable characters. -R: Recursively list subdirectories encountered. -t: Sort output by modification time (most recent first). -S: Sort output by file size. -r: Reverse the sort order. -u: Use access time rather than modification time for display and sorting. -e: Display the erasure coding policy of files and directories only.
HDFS是一个分布式文件系统。其中有两种类型的组件
HDFS Snapshots用来作数据备份,或者灾难恢复。
HDFS Snapshots建立的耗时很低,几乎是瞬间建立。
之因此快的缘由是,集群没有数据移动。
Snapshots建立后,只记录其对应真实文件路径下发生的变化。
当你要恢复数据时,hdfs是经过当前的数据减去Snapshots记录的至snapshot建立以来,发生变化的数据,就等于snapshot备份初始时,对应的数据状态。
这个思想很棒,建立备份很快的同时,备份所要求的存储空间也不多
一个文件夹想要使用Snapshots备份,首先该文件夹须要被设置成snapshottable(可备份)
hdfs dfsadmin -allowSnapshot <path>
而后对该文件夹建立备份
hdfs dfs -createSnapshot <path> [<snapshotName>]
's'yyyyMMdd-HHmmss.SSS
格式的命名建立备份后,备份自己放在在备份文件夹下的.snapshot
文件夹内
好比如今有个文件夹/foo/bar
我对foo文件夹建立一个备份s0, 那么该备份的路径为/foo/.snapshot/s0
我要查看全部foo的全部备份
hdfs dfs -ls /foo/.snapshot
查找备份中的文件
hdfs dfs -ls /foo/.snapshot/s0
将备份中的文件恢复到某个目录
hdfs dfs -cp -ptopax /foo/.snapshot/s0/bar /tmp
hdfs中存储的文件都很大,因此一个大文件,会被拆分红不少block. 而为了保证数据的可靠性,这些block会被以副本形式存放在多个data node.
该图上半部分,显示的是文件在Namenode中存储的元数据信息,其中包含了(以第一行为例)
/users/sameerp/data/part-0
该图下半部分,则是上半部分描述的两个文件,在datanode中的实际存储状况,能够看到第二个文件有三个快,而且每一个块有三个副本
一个大的HDFS集群,每每跨多个机架的服务器。若是副本放一个机架,那这个机架挂了,数据就全没法访问。若是副本分散到多个机架,那么每次写数据会很慢,而且会占用大量跨机架的带宽,且通常跨机架带宽,没有机架内的带宽大。
因此副本策略须要权衡上述两点,实现数据的可靠性存储的同时,能保证读写性能。
namenode经过Hadoop Rack Awareness机制,去获知每一个datanode 对应的机架。
若是副本为3的话,且有多个机架的话,hdfs的会将两个副本放在同一个机架上,另外一个放在另一个机架。这样保证多数副本处于同一机架,提升读写速度。而单独放置一个机架的副本,能保证前一个机架挂掉后,集群的高可用
若是副本超过4个的话,hdfs会随机的找另外的机架来放,最终保证每一个机架上的副本小于等于(replicas - 1) / racks + 2)
hdfs不会容许一个block的多个副本放在同一个datanode
hdfs会采用就近原则,来保证读取的高效性。就近是指看跟读取客户端相近
hdfs刚启动时,出于安全模式,在该模式下,集群不会发生数据复制的行为。namenode会接收,datanode发送来的数据block的状况(这被称为block report,由datanode主动上报),并进行检查。当一个在多个datanode上的同一个bock副本存活数,达到指定的最小副本数时,该block才被认为是安全可用的。当整个集群的可用block数达到必定百分比时,HDFS才认为集群可用,退出安全模式,并把安全检查过程当中发现的不安全的block,replication其副本到其它可用的datanode ,从而实现集群总体的高可用。
dfs.namenode.checkpoint.period
,或者EditLog积累了指定的变动事务数dfs.namenode.checkpoint.txns
。当合并后,editLog将被删除hdfs节点间通讯协议是架设在tcp/ip上的,namenode只响应客户端或datanode发送的请求,namenode不会主动的发起任何请求
namenode会基于datanode上报的心跳,blockreport去及时的把不可用的datanode下线,并有必要的增长将副本数不足的block副本
hdfs中将文件默认拆分为 128 MB的block
当像hdfs中写一个需副本文件时,namenode首选选取一组datanode给到客户端,客户端将数据写第一个datanode, 第一个datanode写完后,将该数据分发给第二个datanode ,依次类推,像一个链式管道
支持以命令、api、web浏览器的方式访问hdfs文件系统
如下两种回收方式,都是有必定延迟的,不是操做后,就能看到多出的空间。
若是垃圾桶功能开启后,删除的文件会先到/user/<username>/.Trash
,每一个用户都有一个本身的垃圾桶。
用户最近删除的文件在/user/<username>/.Trash/Current
中
当到了必定时间后,垃圾桶中的文件会被完全删除。这个时候,hdfs会真正回收这部分空间
将副本个数减小,也会促使集群回收对应文件的空间
https://hadoop.apache.org/doc...
namenode存储了整个分布式文件系统的信息,它一旦数据丢失,那么整个hdfs至关于文件丢失。
而namenode的文件系统实际存储,依赖editLog和fsImage两个文件,因此保证namenode的数据不丢失,关键就是要保证editLog和fsImage两个文件的不丢失。下述三种Node,就是在作这个事情
前面讲namenode的editLog和fsImage的合并,只会在namenode启动时进行。这样到namenode下次启动时,可能editlog已经很是大了,合并会很耗时。Secondary NameNode就是用来去name node上拉取editLog和fsImage,而后进行合并。而后对namenode文件系统查询,会路由到secondary NameNode上
dfs.namenode.checkpoint.period
dfs.namenode.checkpoint.txns
固然Secondary NameNode,只是作editLog和FsImage的合并,并提供查询副本,他不并不能彻底替代namenode工做。也即在Namenode挂后,集群是不可用的
同Checkpoint Node功能相似,要去namenode上拉取,editlog和fsImage ,只是checkpoint node会将合并后的内容,上传至Namenode。这样Namenode 不至于去查checkpoint node
同Secondary NameNode和Checkpoint Node不同,他不会用每次都去namenode拉取editLog和fsImage。其自己就会以物理落盘的方式,存储editLog和fsImage。因为这个特色,nameNode在启动时,可使用-importCheckpoint 选项,是的Namenode自己不存储editLog和fsImage,转而将全部将全部的存储,代理给backup node
若是editLog和fsImage实在丢失了,请用Recovery Mode
前面的Secondary NameNode、Checkpoint Node,Backup Node,都只是为了以某种形式备份editLog和fsImage数据。真正NameNode挂了后,集群仍是须要人工干预。
这里介绍整个NameNode的高可用方式。(再次强调Secondary NameNode并非HA,这个命名让人容易误解)
正在的高可用HA须要实现两个方面
两种HA模式在namenode实例高可用上,都依赖zookeeper实现。只是在保证editLog和fsImage的高可用和一致性上有差别
使用上述HA中的任意一种,咱们均可以再也不配置Secondary NameNode、Checkpoint Node,Backup Node
如下主要介绍基于Quorum Journal Manager的高可用
从上能够看到。为了保证fsImage和Editlog的高可用。每次namenode在发生文件系统变动时,会将其写到Journal Manager(后续简称JM),JM想Zookeeper同样,会部署奇数个节点,只有想JM半数以上的节点写editLog和fsImage成功后,才算成功。
使用zookeeper保证主namenode挂后,standby的namenode可以快速成为主namenode.
zookeeper自己在写数据时,也是半数成功才算成功,为何不用用zookeeper一并代理JM 来存储editLog和fsImage呢。由于editLog和fsImage的文件可能很大,zookeeper自己适合作轻量级的元数据管理,不适合作这个
如下各类组件部署,最好使用不一样的linux用户。hadoop官方推荐的用户跟Hadoop组件的对应关系为
主要配置
hdfs-site.xml
若是将多个Namenode总体看作一个分布式服务的话,首先要给这个service取个名字
<property> <name>dfs.nameservices</name> <value>mycluster</value> </property>
将其对应的一组namenode的声明id
<property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2, nn3</value> </property>
配置namenode id对应的具体机器端口信息
<property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>machine1.example.com:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>machine2.example.com:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn3</name> <value>machine3.example.com:8020</value> </property>
配置这组namenode,对应的http地址、端口信息
<property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>machine1.example.com:9870</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>machine2.example.com:9870</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn3</name> <value>machine3.example.com:9870</value> </property>
配置journalnode存储editLog和fsImage文件的路径
<property> <name>dfs.journalnode.edits.dir</name> <value>/path/to/journal/node/local/data</value> </property>
配置多台JournalNode组成的服务链接地址,他们至关于组成了一个分布式的文件目录
<property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</value> </property>
为了防止脑裂导致多个Namenode都在写数据,能够配置一些当出现脑裂时,去杀死Namenode进程的命令,若是默认不指定命令,也须要作shell(/bin/true)。他的实现原理是,standby的namenode,准备成为active时,先经过ssh登陆到原来的active namenode 的机器上,尝试以命令的形式杀死原来的namenode进程,保证本身启动起来不出现脑裂。因此这一步的关键配置是多个namenode以前,要实现ssh免密登陆。ssh免密登陆的配置参考:https://www.cnblogs.com/nices...
<property> <name>dfs.ha.fencing.methods</name> <value>sshfence shell(/bin/true)</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/vagrant/.ssh/id_rsa</value> </property> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property>
还能够配置客户端链接namenode时,出现故障的转移策略
<property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property>
上述全部配置,能保证editLog和fsImage文件不丢。但nameNode挂后,仍是须要经过haadmin
命令手动干预去启动新备选nameNode。
下面的一系列配置用来使用zookeeper实现namenode的自动故障转移
首先启动自动转移开关
在hdfs-site.xml 中配置
<property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property>
在core-site.xml 配置zk的连接信息
<property> <name>ha.zookeeper.quorum</name> <value>zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181</value> </property>
<property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property>
先启动全部的JournalNodes
./hdfs --daemon start journalnode
初始化主namenode
//若是集群是新集群 hdfs namenode -format //若是是对已经存在好久的集群,进行高可用改造,下面的命令,是把已经存在的editLog和fsImage数据同步到journalnode hdfs namenode -initializeSharedEdits
启动主namenode
./hdfs --daemon start namenode
初始化从namenode
hdfs namenode -bootstrapStandby
启动从namenode
sbin/hadoop-daemon.sh start namenode
在namenode所在机器,执行下述命令,初始化其在zk的节点信息
$HADOOP_HOME/bin/hdfs zkfc -formatZK
在全部namenode所在机器上启动zkfc进程
$HADOOP_HOME/bin/hdfs --daemon start zkfc
上述全部的这些命令中的初始化动做,只在第一次配置HA时须要。后续经过 start-dfs.sh 就能够直接启动全部相关实例
https://hadoop.apache.org/doc...
https://hadoop.apache.org/doc...
是一些列配置,是的hadoop集群可以感知到当前集群的机架状况,从而应用到副本分布策略中,以提升数据的高可用。
须要在hadoop的xml中配置基于域名或ip查找机架id的实现类。实现类必须继承org.apache.hadoop.net.DNSToSwitchMapping
接口。
实现类经过net.topology.node.switch.mapping.impl
进行配置,默认的实现为org.apache.hadoop.net.ScriptBasedMapping
ScriptBasedMapping会去调用脚本,来获取所在集群的机架信息,具体的所调的脚本经过net.topology.script.file.name
来配置,该配置没有默认值。
hadoop文档中有实现样例,可参考
https://hadoop.apache.org/doc...
参考资料
https://hadoop.apache.org/doc...
建议的安装方式,zookeeper三个节点分别放Namenode、standyNamenode、ResourceManager这三台机器上。
zookeeper本身的文件目录所在磁盘,同hdfs namenode所在磁盘分开
hdfs自己由多个组件组成,且有些组件还有多个节点,好比journalnode, datanode,一次启动去到多个机器上执行是件很繁琐的事情。hadoop发型包,提供了sbin/start-dfs.sh
和 sbin/stop-dfs.sh
两个脚本去启停hdfs相关的全部组件:好比namenode、datanode、journalnode, zkfc 。
他实现的原理是,基于hadoop安装包中的/opt/hadoop-3.2.1/etc/hadoop/workers文件,去登陆到相应的机器,完成组件的执行。workers中定义了全部datanode的机器host。 登陆方式是基于SSH的免密登陆方式,具体配置参见:https://www.cnblogs.com/nices...
若是发起脚本执行的机器,自己也须要部署一个datanode。那么他须要配置本身对本身的SSH免密登陆
经过core-site.xml和hdfs-site.xml , 脚本已经能够知道namenode, Journalnode,Zkfc的组件机器。因此workers文件中,只须要设置全部的datanode的机器host。
hdfs的权限模型,同linux相似,只是去掉了setuid和setgid两位。也支持acl,stickybit位。但同linux不一样的是,hdfs自己只管理文件的权限控制。并无帐号体系,好比像linux同样有/etc/passwd存储全部的用户列表。也即hdfs只提供文件权限控制。并不提供用户管理和认证管理,这二者都交由外部系统来实现。linux权限模型参考资料
https://www.cnblogs.com/nices...
谁启动的namenode ,那启动namenode进程的用户,就是namenode 的管理员。因此namenode的管理员是会变化的,下次换个linux用户启动,就会致使变化
经过hadoop.security.authentication
配置,操做用户识别机制,有如下两种
使用发起操做的宿主机中,当前发起操做的用户,做为本次请求hdfs的用户。好比当前发起hdfs dfs -ls
命令的是linux的ops用户,那么hdfs后续的权限控制都会基于ops用户去判断。判断其是否有指定路径的读权限
在kerberos的配置文件中配置,auth_to_local是一个principal访问某个service时,这个service虽然知道这个Principal是KDC认证过的合法用户
但受权怎么作,该Principal具备什么样的权限?这个须要service本身来作。
通常linux本身的受权控制是经过posix模式,加ACL的方式进行的。本质来说,都是针对当前linux自己的用户进行受权。
好比owner,group,others,分别定义他们能作什么和不能作什么。
因此部署在Linux上的service,每每须要将请求过来的principal映射成本地的用户,而后对本地的用户进行受权检测。这么一看,auth_to_local这个命名仍是比较直白的
auth_to_local = {
RULE:[2:$1](johndoe)s/^.*$/guest/ RULE:[2:$1;$2](^.*;admin$)s/;admin$// RULE:[2:$2](^.*;root)s/^.*$/root/ DEFAULT } }
上述这个demo配置,其实就是将johndoe/ 形式的principal会被映射成本地的guest用户,而形如/admin@TEST.COM 的principal会被映射成本地的admin帐号
https://ssimo.org/blog/id_016...
上述方式只是找到操做对应的用户。若是操做的用户不是对应文件、文件夹的owner, 那么须要判断该用户是否拥有指定文件、文件夹的组权限。
那首先,咱们要知道该用户的有哪些组,以便让hdfs知道,该用户是否在文件所属组中,若是文件所属组,在用户的组列表中,说明该用户拥有文件的组权限。
那么怎么找到用户所属的组列表呢?
配置hadoop.security.group.mapping
具体的mapping来找,能够配置的mapping有
具体每一个mapping的mapping策略,可看文档和具体的hadoop源码实现:https://hadoop.apache.org/doc...
还能够经过 hadoop.user.group.static.mapping.overrides
来静态指定一个用户对应的group list。 若是一个用户在静态mapping中找到对应的组,就不会走上述的动态mapping
采用kerberos做为hadoop各组件之间的权限认证。首先在部署的时候,将hadoop的各组件采用不一样的linux用户和组进行部署。
hdfs文件系统,推荐的posix权限限制
配置整个集群启用kerberos权限认证。其中auth_to_local表示,当有其它组件请求当前服务时,如何将其映射成为本地的用户某个用户。一个demo配置为
<property> <name>hadoop.security.auth_to_local</name> <value> RULE:[2:$1/$2@$0]([ndj]n/.*@REALM.\TLD)s/.*/hdfs/ RULE:[2:$1/$2@$0]([rn]m/.*@REALM\.TLD)s/.*/yarn/ RULE:[2:$1/$2@$0](jhs/.*@REALM\.TLD)s/.*/mapred/ DEFAULT </value> </property>
其中,来至于namenode、datanode、journal node的请求,会被映射成为hdfs用户
来至于resource manger、node manager的请求,会被映射成本地的yarn用户
来至于job history server的请求,会被映射成为mapred用户
文档前面有提到,有哪几种基于用户找到分组的方式。通常配安全集群,都会跟公司的LDAP整合起来,这里就以使用LDAP来找组为例看配置
<property> <name>hadoop.security.group.mapping.ldap.url</name> <value>ldap://server1,ldap://server2,ldap://server3</value> <description> The URL of the LDAP server(s) to use for resolving user groups when using the LdapGroupsMapping user to group mapping. Supports configuring multiple LDAP servers via a comma-separated list. </description> </property> <property> <name>hadoop.security.group.mapping.ldap.num.attempts</name> <value>6</value> <description> This property is the number of attempts to be made for LDAP operations. If this limit is exceeded, LdapGroupsMapping will return an empty group list. </description> </property> <property> <name>hadoop.security.group.mapping.ldap.num.attempts.before.failover</name> <value>2</value> <description> This property is the number of attempts to be made for LDAP operations using a single LDAP instance. If multiple LDAP servers are configured and this number of failed operations is reached, we will switch to the next LDAP server. The configuration for the overall number of attempts will still be respected, failover will thus be performed only if this property is less than hadoop.security.group.mapping.ldap.num.attempts. </description> </property>
前面是配置整个集群服务,再接受到请求后,怎么辨别这个请求是哪一个用户的,该用户属于哪一个组的。而这里的配置,主要用来指定该组件本身的凭证文件也即kerberos的keytab存在什么地方,以及使用其中哪一个principal做为当前组件的principal(一个keytab文件中,能够存储多个principal的认证信息)
下面以namenode为例,看其须要的配置
其他各组件的相关配置大致相似。参考连接:
https://hadoop.apache.org/doc...
kerberos只是提供集群互访的认证,具体到认证用户的受权,又得单独配置。hadoop本身支持在 $HADOOP_CONF_DIR下配置hadoop-policy.xml文件来指定访问控制列表,实现受权控制。 而咱们准备使用ranger来作受权控制,因此这里再也不对这种方式赘述
在某台机器上,以命令行查询文件系统是报错-ls: java.net.UnknownHostException: 具体的集群名称
这个错误是因为对应的机器上的hdfs-site.xml高可用配置没有配置链接namenode失败后的失败策略。
解决办法是在该机器的hdfs-site.xml中加入对应配置
<property> <name>dfs.client.failover.proxy.provider.haixue-hadoop</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property>
重启该机器的组件,若是该机器只有datanode,那重启datanode便可
update-alternatives --install \ /usr/bin/hdfs \ hdfs \ /opt/hadoop-3.2.1/bin/hdfs \ 100
能够将指定datanode进行下线,维护
https://hadoop.apache.org/doc...
有些冷门的数据,存三个副本,有些浪费
https://hadoop.apache.org/doc...
https://hadoop.apache.org/doc...
数据写入内存,再异步写磁盘,有丢数据的风险
https://hadoop.apache.org/doc...
让datanode缓存部分热数据,来提高数据读取速度
https://hadoop.apache.org/doc...
hadoop的文档左侧,有一个configuration 列表,其中有全部配置项对应的xml,以及其默认值和释义
https://hadoop.apache.org/doc...
https://data-flair.training/b...
欢迎关注个人我的公众号"西北偏北UP",记录代码人生,行业思考,科技评论