hadoop怎么查看每个目录的路径

hadoop怎么查看每个目录的路径,第1张

hadoop查看每个目录的路径需要验证数据。
1、点击shell命令,hadoopfscountq目录ps,查看目录下总的大小。
2、dfscount目录ps,一样的,hadoopfsdu目录ps,查看目录下每个子目录的路径。

1Hadoop 分布式 文件系统。特点:性能高、效率高、速度快
2可以在廉价的机器上运行的 可容错 文件系统。
当集群中有机器挂掉时,HDFS会自动将挂掉的机器上的任务分配给正常的机器,使任务继续保持正常工作。

2HDFS处理更加容易。当对一个大型文件进行写 *** 作时,如果将该文件整个写入一个节点,那么该节点的负载便会急剧增加,这样就丧失了分布式文件系统的意义。所以,应该利用HDFS将文件拆分成不同的块,然后将不同的块分配到不同的节点上去,此时,DFS就需要管理者确定文件如何进行拆分,以及每一个块应该分配到哪一个节点。对文件进行 *** 作时,在单机情况下,首先需要知道文件被拆分成多少块,每一个块被放在了哪一个节点上,以及块之间的顺序(文件的粘连)。而HDFS的出现,使得分布式文件集群不再需要人进行管理,利用HDFS读取文件时,我们不需要关心文件如何拆分,分配,粘连。只用告诉HDFS文件的路径即可。

HDFS的指令类似于linux下的指令。
查看文件:hdfs dfs -ls /查询的文件目录
删除文件:hdfs dfs -rm r /删除的文件
创建文件夹:hdfs dfs -mkdir /文件夹名称
上传文件至HDFS:hdfs dfs -put 需要上传的文件 /上传的文件路径

为什么需要学习HDFS结构?
1面试中,能够运用于所有分布式文件系统设计。
既然分布式系统下是多节点运行,那么节点之间是否通信?slave节点只接受来自master节点的命令,向master节点发送心跳指令,slave节点之间不会主动通信。
aMaster slaver 模式:
1High consistency:一致性。当文件中的一个数据块写入slave节点时,当且仅当数据块被成功写入到所有备份的slave节点,slave节点向client反馈写入 *** 作成功,否则,重传写入;
2Simple design:易设计:不需要考虑子节点如何通信。只需要考虑主节点的工作;
3单master节点不具有鲁棒性。
bPeer peer 模式:
1所有的读写 *** 作均匀分布在每一个节点上,每一个节点的负载不会很高;
2任意一个节点挂掉不会影响其他节点;
3低一致性。没有数据的复制步骤。
2更好的理解hadoop生态系统

amaster节点会传输数据吗?
不会,master节点只接收client的请求,决定哪一个slave节点进行读写 *** 作,然后,client直接与slave节点进行通信。如果数据从master节点传输,那么master节点就会成为影响数据传输的瓶颈。
bslave节点如何存储数据?
整个大文件?小的文件块?。HDFS借鉴GFS的设计理念,以block为传输单位,将大文件拆分成一个一个小文件,而一个小文件就是block。block的大小可以由Configuration定义,默认大小是128M。
c谁来决定将文件拆分成块?
masterslave。两者都不是,由HDFS client决定将大文件拆分成block(块)。HDFS的目的是将所有的节点包装起来,可以理解成将所有的节点放在一个黑箱里,我们不需要知道黑箱里到底发生了什么,只需要告诉黑箱需要做什么工作,这里的HDFS client相当于HDFS与user通信的中间媒介。HDFS client相当于一个软件包(api),可以存放在master或者slave或者额外的一个新节点上。

写入in memory失败(ACK出现问题)时,master会重新选择3个新的slave节点。

HDFS Permissions Guide

HDFS 实现了文件和目录的权限模型,很多跟POSIX模型共享。 每个文件、目录都关联到用户、组。文件、目录对于拥有者、组中的其他用户、其他用户有着不同的权限设置。对于文件,读取需要 r 权限,写入/追加需要 w 权限。对于目录,列出目录内容需要 r 权限,创建、删除文件或目录需要 w 权限,访问目录子项需要 x 权限。

与POSIX模型不同,因为没有可执行文件,所以文件没有 setuid or setgid bits。对于目录,也没有 setuid or setgid bits作为简化。粘滞位 sticky bit 可以被作用于目录,放置除superuser、目录所有者、文件所有者之外的任何用户删除、移动目录内的文件。粘滞位 sticky bit 对于文件不生效。 文件或目录的权限我们称为 mod 。一般来说,mdoe的展示使用Unix风格,比如描述的8进制数使用。当创建一个文件/目录后,它的所有者即为客户端进程的用户,它的组是父目录的组(BSD规则)。

HDFS 还支持POSIX ACLs (Access Control Lists),给指定用户、组配置更新颗粒度的规则来加强权限管理。ACLs稍后会详细介绍。

每个访问HDFS的客户端进程身份都有两部分组成:用户名,组列表。无论什么时候,HDFS都必须会客户端进程访问的文件或目录foo做权限检查,

如果权限校验失败,客户端 *** 作失败。

自 Hadoop 022 起,Hadoop 支持两种不同的 *** 作模式来判断用户的身份,通过 hadoopsecurityauthentication 属性指定:

不管是哪种模式,用户身份机制都是HDFS的外部机制。HDFS中没有用于创建用户、建立组、处理用户凭据的规定。

一旦username被判定,如上,groups list将由group mapping service 判断,配置在 hadoopsecuritygroupmapping 属性。参见 Hadoop Groups Mapping 获取更多内容。

每次HDFS *** 作都需要用户拥有指定权限(读,写,执行的组合),通过文件的 ownership,group membership or 其他权限进行授权。 一个 *** 作会进行路径多个组件的权限检查,而不仅是最后一个组件。另外,一些 *** 作依赖于路径owner的检查。

所有的 *** 作都需要遍历访问(traversal access)。遍历访问需要对路径上的所有存在的组件拥有执行权限,最终路径组件除外。比如,任一访问 /foo/bar/baz 的 *** 作,调用者需要拥有 /, /foo and /foo/bar 的可执行权限。

[1] 如果调用使用overwrite配置,并且该路径已经存在文件,那么 create *** 作只需要对最终路径组件拥有写权限即可。

[2] 如果设置了 sticky bit ,对父目录写权限的检查 *** 作,同样也会检查ownership。

[3] 调用 setOwner 来改变文件的拥有着需要 HDFS super-user 访问权限。变更组不需要HDFS super-user 访问权限,但是调用者必须是文件的拥有者并且是指定组的成员。

每个文件、目录 *** 作都会将完全路径发送给NameNode,对每个 *** 作都会沿着path进行权限检查。客户端框架隐式的将用户身份与到NameNode的连接关联,减少对现有客户端API的改动的需求。常见一种情况,当某文件的一个 *** 作已经成功完成了,再 *** 作的时候会失败,因为该路径上的文件、目录已经不存在了。举个例子,当客户端第一次开始读取一个文件,它向NameNode发出第一个请求,以发现文件的第一个块的位置。第二个请求查找其他的块可能会失败。另一方面,删除一个文件并不会撤回客户端对该文件的访问,该客户端已经知道该文件的块。通过添加权限,客户端对文件的访问可以在请求之间被撤回。同样,变更权限不会撤回客户端的访问,该客户端已经知道文件的块。

如果权限检查失败,所有使用路径参数的方法都会抛出 AccessControlException 。
新方法:

新文件、目录的mode受umask设置限制,umask设置是配置项。
当使用现有方法 create(path, …) (不带权限参数),新文件的 mode 是 0666 & ^umask 。
当使用新方法 create(path, permission, …) (带权限参数 P) ,新文件的 mode 是 P & ^umask & 0666 。
当使用现有方法 mkdirs(path) (不带权限参数)创建一个新目录, 新目录的 mode 是 0777 & ^umask 。
当使用新方法 mkdirs(path, permission) (带权限参数 P), 新目录的 mode 是 P & ^umask & 0777 。

新 *** 作:

谁启动NameNode,谁就是super-user。 super-user可以执行任意 *** 作,权限校验从不失败。HDFS super-user 不必是NameNode 主机上的super-user,也不是说集群内的说有主机都需要有这个super-user。
如果在个人电脑上实验运行HDFS,为方便起见无须任何配置该用户即成为安装的super-user。

另外,管理员还可以通过配置参数标识一个特定组。该组内的成员也是super-users。

默认,web server的身份是一个可配置项。即,NameNode不知道真实用户的身份,但是web server以管理员选定的用户的身份(用户/组)行动。 除非选择的身份匹配super-user,部分命名空间是不可以被web server访问的。

除了传统的POSIX权限模型,HDFS还支持POSIX ACLs (Access Control Lists)。ACLs 对于实现区分用户、组的自然组织层次结构的权限需求非常有用。ACL提供了一个方法,可以给指定用户、组设置不同的权限,而不仅仅是文件的拥有着和所属组。

默认,ACLs的支持是关闭的,并且NameNode不允许创建ACLs。要开启ACLs的支持,在NameNode配置内设置 dfsnamenodeaclsenabled 为 true。

一个ACL由一系列ACL entries组成。每条ACL entry 命名了特定用户/组,并授于/拒绝 读、写、执行 权限。比如:

ACL entries 由 type ,可选的 name permission 组成。为了便于展示,‘:’ 用作分隔符。 在这个范例内,文件的owner有read-write权限,文件的group有read-execute权限,others有读取权限。因此,等同于设置文件的权限为654。

另外,有2个扩展ACL entries给用户 bruce 和组 sales,并全部赋予所有权限。 mask 是一个特殊的ACL entry,过滤给所有命名的user entries 和命名的group entries 以及非命名的group entry的权限。 在范例内, mask 仅有写权限,并且我们可以看到几个ACL entries的有效权限被相应的过滤了。

每个ACL都必要要有一个 mask 。如果在设置ACL的时候用户没有提供 mask ,那么会通过计算来自动插入,计算将被过滤的所有entries的权限的并集。

在拥有ACL的文件上运行 chmod 实际上改变了 mask 的权限。既然 mask 作为过滤器,这有效的约束了所有扩展ACLs的权限,而不仅是变更group entry并且可能会丢失其他扩展ACL entries。

模型还有效区分了 “access ACL” 和 “default ACL” 。
“access ACL” ,定义权限检查期间强制执行的规则; “default ACL” ,定义新子文件或子目录创建期间自动接受的规则。
比如:

只有目录可以拥有默认 ACL。当一个新文件或者子目录创建,它会自动的拷贝父级的默认ACL作为自己的ACL。新子目录还将其作为默认 ACL。这样,当新目录创建时,默认 ACL 会被复制到该文件系统数的任意深度层。

新子级的ACL的确切权限值将由mode参数进行过滤。考虑到默认umask 是 022,则新目录是755,新文件是644。mode参数给unnamed user (file owner), the mask and other过滤过滤拷贝过来的权限值。 使用这个特定范例ACL,并创建一个mod 755的子目录,该mode过滤器对最终结果没有影响。但是,如果我们考虑创建一个mode 644 的文件,mode过滤器会导致新文件的ACL接受unnamed user(file owner)的读写权限,mask的读权限,以及其他的读权限。 该mask意味着named user bruce 和 named group sales 的有效权限是只读。

注意,拷贝发生在创建新文件或子目录的时候。对父级默认ACL的后续修改不会影响存在的子级。

默认 ACL 必须拥有所有必要的ACL entries,包括unnamed user (file owner), unnamed group (file group) and other entries。当设置默认ACL的时候,如果用户没有指定其中某个entry,那么entries会自动插入,通过拷贝访问ACL相应的权限、如果没有访问ACL则拷贝permission bits来实现。默认ACL必须拥有mask。如上所属,如果没有指定会自动插入一个计算的值。

对拥有ACL的文件,权限的检查算法变更为:

最佳实践依赖传统的权限位来实现大多数权限需求,并定义较少数量的ACL来加强,用一些异常规则来扩充权限位。与只有权限位的文件相比,具有ACL的文件在NameNode中会增加内存开销。

新方法:
public void modifyAclEntries(Path path, List<AclEntry> aclSpec) throws IOException;
public void removeAclEntries(Path path, List<AclEntry> aclSpec) throws IOException;
public void public void removeDefaultAcl(Path path) throws IOException;
public void removeAcl(Path path) throws IOException;
public void setAcl(Path path, List<AclEntry> aclSpec) throws IOException;
public AclStatus getAclStatus(Path path) throws IOException;

参考 File System Shell 文档获取命令的全部内容。

如果是,则使用这里描述的权限系统。如果否,关闭权限检查,但是其他行为不变。从一个参数值切换到其他值不会改变mode、文件或目录的owner or group。无论权限是开还是关, chmod 、 chgrp 、 chown and setfacl 总是会检查权限。 这些功能仅在权限上下文有用,因此不存在向后兼容问题。此外,这允许管理员可靠的设置所有者和权限,在打开常规权限检查前。

web server使用的用户名。设置为super-user允许所有客户端看到任何内容。改为其他未使用的身份允许web客户端仅可以查看"other"权限可见的内容。其他将其他组添加到逗号分隔列表内。

super-users 的组。

当创建文件和目录时使用的 umask 。对于配置文件,可以使用十进制值 18。

集群的管理员被配置为ACL。这控制谁可以访问HDFS默认的servlets 等。

设置为true,开启HDFS ACLs (Access Control Lists)的支持。默认,ACLs是关闭的。当ACLs关闭的时候,NameNode拒绝所有设置ACL的企图。

设置为true,开启 POSIX风格的ACL继承。默认开启。当它被启动时,并且create请求来自于兼容客户端,NameNode会从父目录应用默认ACL来创建mode并忽视客户端umask。如果没有默认ACL,它将应用客户端umask。

1、简单介绍下hadoop吧?

    广义上hadoop是指与hadoop相关的大数据生态圈。包含hive、spark、hbase等。

    狭义上hadoop指的是apache的开源框架。有三个核心组件:

----hdfs:分布式文件存储系统

----yarn:分布式资源管理调度平台

----mr:分布式计算引擎

2、介绍下hdfs

全称为Hadoop Distributed File System。有三个核心组件:

namenode:有三个作用,第一是负责保存集群的元数据信息,第二是负责维护整个集群节点的正常运行。

第三是负责处理客户端的请求。

datanode:负责实际保存数据。实际执行数据块的读写 *** 作。

secondarynamenode:辅助namenode进行元数据的管理。不是namenode的备份。

3、namenode的工作机制?

    namenode在内存中保存着整个内存系统的名称空间和文件数据块的地址映射。整个hdfs可存储的文件数受限于namenode的内存大小。所以hdfs不适合大量小文件的存储。

---namenode有三种元数据存储方式来管理元数据:

    》内存元数据:内存中保存了完整的元数据

    》保存在磁盘上的元数据镜像文件(fsimage):该文件时hdfs存在磁盘中的元数据检查点,里面保存的是最后一次检查点之前的hdfs文件系统中所有目录和文件的序列化信息。

    》数据 *** 作日志文件(edits):用于衔接内存meta data和持久化元数据镜像fsimage之间的 *** 作日志文件。保存了自最后一次检查点之后所有针对hdfs文件系统的 *** 作。如对文件的增删改查。

4、如何查看元数据信息?

    因为edits和fsimage文件是经过序列化的,所以不能直接查看。hadoop20以上提供了查看两种文件的工具。

----命令:hdfs oiv 可以将fsimage文件转换成其他格式,如xml和文本文件。-i 表示输入fsimage文件。-o 输出文件路径,-p 指定输出文件

                hdfs oev可以查看edits文件。同理需要指定相关参数。

详情查看: >如下面这个shell脚本:
#Oracle的连接字符串,其中包含了Oracle的地址,SID,和端口号
CONNECTURL=jdbc:oracle:thin:@201356021:1521:DWRAC2
#使用的用户名
ORACLENAME=kkaa
#使用的密码
ORACLEPASSWORD=kkaa123
#需要从Oracle中导入的表名
oralceTableName=tt
#需要从Oracle中导入的表中的字段名
columns=AREA_ID,TEAM_NAME
#将Oracle中的数据导入到HDFS后的存放路径
hdfsPath=apps/as/hive/$oralceTableName
#执行导入逻辑。将Oracle中的数据导入到HDFS中
sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath --num-mappers 1 --table $oralceTableName --columns $columns --fields-terminated-by '\001'
执行这个脚本之后,导入程序就完成了。

当使用 Java API *** 作 HDFS 时,可以使用 FileSystemlistFiles() 方法来获取文件列表。该方法接受一个 Path 对象,表示要列举文件的目录,并返回一个 RemoteIterator<LocatedFileStatus> 对象,该对象可用于迭代目录中的文件。
例如,下面的代码演示了如何使用 listFiles() 方法来获取 HDFS 上的文件列表:
// 定义 HDFS 连接配置
Configuration conf = new Configuration();
// 获取 HDFS FileSystem 对象
FileSystem fs = FileSystemget(conf);
// 定义要列举文件的目录
Path dirPath = new Path("/user/hadoop");
// 获取文件列表
RemoteIterator<LocatedFileStatus> fileIter = fslistFiles(dirPath, true);
// 遍历文件列表
while (fileIterhasNext()) {
// 获取当前文件信息
LocatedFileStatus fileStatus = fileIternext();
// 输出文件名称和大小
Systemoutprintln(fileStatusgetPath()getName() + " : " + fileStatusgetLen());
}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13392858.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-27
下一篇 2023-07-27

发表评论

登录后才能评论

评论列表(0条)

保存