基于key/value+Hadoop HDFS 设计的存储系统的shell命令接口

本文详细解析了Hadoop HDFS中的各种命令及其操作流程,包括文件的复制、移动、删除、查看等常见操作的具体实现方式。

对于hadoop HDFS 中的全部命令进行解析(当中操作流程是自己的想法有不允许见欢迎大家指正)

接口名称

功能

操作流程

get

将文件拷贝到本地文件系统 。

假设指定了多个源文件,本地目的端必须是一个文件夹。

(1)依照上述机制,在Config server上的存储引擎中逐层读取K-V,直到获得文件名称(或大文件元数据信息);

(2)依据文件名称(或大文件元数据信息)到对应的Data server中获取对应的文件(大文件须要拼接);

(3)将获取的文件写入本地文件系统。

put

从本地文件系统中拷贝文件或文件夹到目标文件系统。

(1)依照上述章节所述,逐层解析<dst>绝对路径,获取目标目录的key/value数据。

(2)依据章节所述规则。结合目标目录的标号和源文件的文件名称生成相应的key/value;

(3)依据步骤(2)生成的key/value上传源文件的相关信息。

(4)上传源文件内容到系统中。

rm

删除指定的文件。仅仅删除非空文件夹和文件。

(1)依据上述章节所述,逐层解析到目标文件所在的位置获取指定文件的key/value。

(2)依据key找到指定的文件或文件夹所在的DataNode上存储的信息;

(3)删除信息。

(4)将删除记录写入edit log。

mkdir

创建文件夹,会创建路径中全部缺失的父文件夹。

(1)依照上述机制,逐层解析找到父文件夹,获取标记。假设父文件夹不存在则递归的创建路径上的文件夹。

(2)将父文件夹的标记作为key的父节点字段部分,创建新文件夹。

appendToFile

加入源文件从本地文件系统到目标文件系统。

(1)依照上述章节所述,逐层解析<dst>绝对路径,获取目标目录的key/value数据;

(2)依据章节所述规则,结合目标目录的标号和源文件的文件名称生成相应的key/value;

(3)依据步骤(2)生成的key/value上传源文件的相关信息;

(4)上传源文件内容到系统中。

cat

将路径指定文件的内容输出到stdout。

(1)依照上述机制,逐层解析path到目标文件,获取文件的key/value。

(2)依据key值在找到文件内容输出到stdout中。

(3)将结果在终端显示出来。

chgrp

改变文件和文件夹的群组。

(1)依照上述机制,在Config server上的存储引擎中逐层读取K-V,直到获得所操作的文件名称/文件夹(或大文件元数据信息);

(2)改动这个K-V中的value的表示群组的字段并又一次插入新的K-V。

chmod

改变文件和文件夹的訪问权限。

(1)依照上述机制,在Config server上的存储引擎中逐层读取K-V,直到获得所操作的文件名称/文件夹(或大文件元数据信息);

(2)改动这个K-V中的value的表示訪问权限的字段并又一次插入新的K-V。

chown

变更文件和文件夹的拥有者。

(1)依照上述机制。在Config server上的存储引擎中逐层读取K-V,直到获得所操作的文件名称/文件夹(或大文件元数据信息)。

(2)改动这个K-V中的value的表示全部者的字段并又一次插入新的K-V。

copyFromLocal

从本地文件系统中拷贝文件,和put命令相似。

操作流程參见put接口。

copToLocal

将文件拷贝到本地文件系统。和get命令类似。

操作流程參见get接口。

count

显示由路径确定的子文件夹的个数,文件个数,使用字节个数。以及全部的文件文件夹名。

(1)解析到目标路径,获取相关的key/value;

(2)获取value中的子文件夹个数,文件个数,使用字符串等相关信息的字段。

cp

将文件从源路径拷贝到目标路径。这个命令同意有多个原路径,此时目标路径必须是一个文件夹。

(1)依据上述章节所述,逐层解析<dest>,获取目标文件的位置信息;

(2)获取源文件的内容;

(3)逐块复制源文件信息到目标文件其中。

du

显示文件大小。假设path是一个文件夹,则显示该文件夹中全部文件的大小。

(1)依照上述机制,在Config server上的存储引擎中逐层读取K-V,直到获得文件名称或文件夹;

(2)假设是文件读取对应的key/value中,读取value中表示文件大小的字段。假设是文件夹则读取标记,递归的查询属于该文件夹下的全部文件。

dus

显示文件的大小,可是当作用于文件夹时,会显示文件大小之和。

(1)依照上述机制,在Config server上的存储引擎中逐层读取K-V,直到获得文件名称或文件夹。

(2)假设是文件读取对应的key/value中。读取value中表示文件大小的字段,假设是文件夹则读取标记,递归的查询属于该文件夹下的全部文件value信息,将value中关于文件大小的字段信息相加取和。

expunge

清空回收站。

(1)依照上述机制,解析到HDFS系统回收站文件夹下(/user/username/.Trash/current);

(2)删除(參考接口rm)。

getfacl

显示文件和文件夹的訪问控制列表

(1)依照上述章节所述。逐层解析,获取目标文件或路径的key/value数据。

(2)获取value中有关的ACL的字段信息。

getmerge

获取由源文件夹指定的全部文件。将它们合并为单个文件并写入本地文件系统中的LOCALDST

(1)依照上述机制。逐层解析,获取源文件夹文件的标记;

(2)依据标记。在config server中寻找文件夹文件下的子文件;

(3)创建目标文件,将子文件的内容依次合并到目标文件其中;

(4)将目标文件写入本地文件系统。

ls

列出文件夹及文件信息。

(1)依照上述机制,逐层解析获取到目标文件或者目录的标记。

(2)依据标记查询子文件夹或者文件相关信息;

(3)列出信息。

lsr

循环列出文件夹。子文件夹及文件信息。

操作流程參见參照ls接口。

moveFromLocal

类似于put,仅仅是本地的源在复制之后会被删除。

1)依照上述章节所述,逐层解析<dst>绝对路径,获取目标目录的key/value数据;

(2)依据章节所述规则,结合目标目录的标号和源文件的文件名称生成相应的key/value;

(3)依据步骤(2)生成的key/value上传源文件的相关信息;

(4)上传源文件内容到系统中;

(5)删除本地源文件。

moveToLocal

于get命令类似。

操作流程參见get接口。

mv

移动文件从源地址到目标地址。

(1)依照上述机制,逐层解析<dest>绝对路径获取目标目录的标号。

(2)逐层解析到源文件获取源文件的key/value数据;

(3)更改源文件里的key值将当中的父节点标号字段改为目标目录的标号。

rmr

递归删除指定文件和文件夹。

(1)依照上述机制。逐层解析到目标文件所在的位置获取指定文件的标记;

(2)採用递归算法依据标记删除指定的文件或文件夹。

setfacl

设置訪问控制列表(acl)的文件和文件夹。

(1)依照上述机制,逐层解析。获取目标文件或路径的key/value数据;

(2)设置value中的ACL。

setrep

改变文件的目标副本系数。

(1)依照上述章节所述,逐层解析。获取目标文件的key/value数据。

(2)改动value中有关副本系数的字段。

stat

显示文件里的统计信息。

(1)依照上述章节所述,逐层解析。获取目标文件的key/value数据;

(2)获取value中关于文件的统计信息的相关字段。

tail

显示目标文件里的最后1KB数据。

(1)依照上述章节所述,逐层解析,获取目标文件的key/value数据。

(2)依据所得到的key/value查询最后一块中的1KB信息,假设最后一块不足1KB,则查询倒数第二块中信息,拼接成1KB。返回信息。

test

对路径进行检查。

(1)依照上述章节所述。对目标路径逐层解析,获取目标文件的key/value数据。

(2)检查目标文件里的key/value中的相关字段。以检測文件是否存在。大小是否为0,文件夹路径是否存在。

text

显示文件的文本内容,当文件为文本文件时,等同于cat。文件为压缩格式时,会先解压缩。

操作流程參见cat接口。

touchz

创建长度为0的文件。

操作流程參见mkdir接口。


<configuration> <!-- 把多个NameNode的地址组装成一个集群mycluster --> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <!-- 指定hadoop运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/usr/ha/hadoop-3.1.3/data</value> </property> </configuration> <configuration> <!-- NameNode数据存储目录 --> <property> <name>dfs.namenode.name.dir</name> <value>file://${hadoop.tmp.dir}/name</value> </property> <!-- DataNode数据存储目录 --> <property> <name>dfs.datanode.data.dir</name> <value>file://${hadoop.tmp.dir}/data</value> </property> <!-- JournalNode数据存储目录 --> <property> <name>dfs.journalnode.edits.dir</name> <value>${hadoop.tmp.dir}/jn</value> </property> <!-- 完全分布式集群名称 --> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- 集群中NameNode节点都有哪些 --> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2,nn3</value> </property> <!-- NameNode的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>hadoop101:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>hadoop102:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn3</name> <value>hadoop103:8020</value> </property> <!-- NameNode的http通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>hadoop101:9870</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>hadoop102:9870</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn3</name> <value>hadoop103:9870</value> </property> <!-- 指定NameNode元数据在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop101:8485;hadoop102:8485;hadoop103:8485/myclus ter</value> </property> <!-- 访问代理类:client用于确定哪个NameNode为Active --> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyP rovider</value> </property> <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 --> <value>shell(true)</value> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> <value>shell(true)</value> </property> <!-- 使用隔离机制时需要ssh秘钥登录--> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/root/.ssh/id_rsa</value> </property> </configuration> 这是我的两个配置文件的内容,有没有问题
06-18
<property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nnl</name> <value>hadoop100:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>hadoop101:8020</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>hadoop100:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>hadoop101:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop100:8485;hadoop101:8485;hadoop102:8485/mycluster</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/data/hadoop/ha/journalnode</value> </property> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value >org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverPr oxyProvider</value> </property> <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>/root/.ssh/id_dsa</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value> true</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.premissions.enabled</name> <value>false</value> </property> <property> <name>dfs.blocksize</name> <value>134217728</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/data/hadoop/namenode</value> </property> <property> <name>dfs.datanode.name.dir</name> <value>/data/hadoop/datanode</value> </property>
03-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值