HDFS命令

HDFS源码查看

1-HDFS的Shell命令

bash 复制代码
# 查看 hadoop 命令的脚本
# which查看可执行文件的位置
which hadoop
# 结果:
/usr/local/hadoop/bin/hadoop
# 查看源码:
cat /usr/local/hadoop/bin/hadoop

2-在Maven工程中配置Hadoop关联仓库

xml 复制代码
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>2.7.3</version>
</dependency>

HDFS常用操作

01-查看帮助文档

bash 复制代码
# 查看yarn帮助文档
yarn
# 查看HDFS帮助文档
hdfs
# 查看Hadoop帮助文档
hadoop

02-显示文件/目录

bash 复制代码
# hadoop fs 与 hdfs dfs 都调用的 FsShell 类
hdfs dfs -ls path
hadoop fs -ls path(常用)

# 标准写法
hadoop fs -ls hdfs://ns1/       #当然,ns1是我们在hdfs-site.xml中配置时命名的,可以改名

# 简写,默认是HDFS系统下的根目录
hadoop fs -ls [path]

# 最大单位显示(文件大小显示为最大单位)
hadoop fs -ls -h path   

# 递归显示(如果有子目录,则递归显示)
hadoop fs -ls -R path

# 多个显示参数(递归打印并且最大单位显示文件)
hadoop fs -ls -h -R path   

03-上传文件/目录

上传:从主机本地系统(linux)到集群HDFS系统.

3.1-put

上传新文件
bash 复制代码
# 标准写法:(前面是Linux本地文件地址,后面是hdfs地址)
hadoop fs -put /home/hadoop/test.txt hdfs://ns1/
# 简写:
hadoop fs -put /home/hadoop/test.txt /

# 上传文件并对文件重命名
hadoop fs -put test.txt /t1.txt
# 当上传文件时,指定的hdfs目录存在同样的文件名时,会报file exists(文件已存在)错误。
上传多个文件
bash 复制代码
# 一次上传多个文件到指定HDFS路径
hadoop fs -put f1 f2 /data  
上传目录
bash 复制代码
# 上传目录
hadoop fs -put dir path
#上传并重命名目录
hadoop fs -put mypkg /newpkg    
覆盖上传
bash 复制代码
#如果指定HDFS目录中有同名文件会被覆盖
hadoop fs -put -f ~/hadoop/test.txt /   
#建议在上传目录的时候不覆盖目录

3.2-copyFromLocal

基本弃用,和put的用法雷同,老版本的hadoop用这种方式.

上传文件并重命名
bash 复制代码
hadoop fs -copyFromLocal file:/test.txt hdfs:/test2.txt
覆盖上传
bash 复制代码
hadoop fs -copyFromLocal -f test.txt /test.txt

04-下载文件/目录

下载:从集群HDFS到本地Linux文件系统.

4.1-get

拷贝文件到本地目录
bash 复制代码
hadoop fs -get hdfs:/test.txt /home/hadoop/
拷贝文件并重命名
bash 复制代码
hadoop fs -get /test.txt ~/hadoop/test001.txt

4.2-copyToLocal

拷贝文件到本地目录
bash 复制代码
hadoop fs -copyToLocal hdfs:/test.txt file:/home/hadoop/
拷贝文件并重命名
bash 复制代码
hadoop fs -copyToLocal /test.txt file:/home/hadoop/test.txt

05-拷贝文件/目录

从本地到HDFS

bash 复制代码
:"
cp命令:默认都是hdfs目录,如果要从本地上传到hdfs,本地的文件目录必须是 file:绝对路径;如果本地文件目录使用相对路径,会报错(no such file or directory)
"
hadoop fs -cp file:/home/hadoop/test/f2 /test_f2   

从HDFS到HDFS

bash 复制代码
 hadoop fs -cp hdfs://ns1/haha.sh hdfs://ns1/test  # 完整写法  hdfs://ns1 == /
 hadoop fs -cp hdfs:/exe.sh hdfs:/test             # 半完整写法
 hadoop fs -cp /haha.sh /data                      # 简单写法 

06-移动文件/目录

bash 复制代码
:"
hdfs之间的移动 叫 mv
windows与hdfs之间的叫上传或下载(sz,rz)
"

# 标准写法
hadoop fs -mv hdfs:/test.txt hdfs:/dir/test.txt
# 简写方案
hadoop fs -mv /test_f2 /test

07-删除文件/目录

删除指定文件

bash 复制代码
hadoop fs -rm /a.txt

删除全部txt文件

bash 复制代码
hadoop fs -rm /*.txt

递归删除全部文件和目录

bash 复制代码
# hdfs不推荐写法 但是也能对付删(不推荐)   系统显示已弃用(deprecated)
hadoop fs -rmr /dir/
# hdfs的推荐写法(推荐)
hadoop fs -rm -r /dir/

删除之后不放到回收站

bash 复制代码
#  跳过垃圾桶,直接删除
hadoop fs -rm -skipTrash /dir

08-读取文件

bash 复制代码
# 一般不建议在hdfs中查看文件内容,因为打开速度慢,大文件的打开更慢
hadoop fs -cat /test.txt      
# 统计表中的行数(仅限于tetxfile格式的表,比如orc格式的这种方法统计的结果远比count(1)的结果小的多,因为orc文件被压缩了)
hadoop fs -cat /user/hive/warehouse/gbd_kj_dms_safe.db/ods_audit_log/dt=20221212/* | wc -l

# 读取HDFS文件的尾部内容
:"
此处和linux中的区别 :
1.此处没有查看 head 的命令  
2.此处tail查看的是尾部1k字节的内容,而linux中查看的是尾部10行的内容
"
hadoop fs -tail /test.txt   

09-创建空文件

bash 复制代码
# z 代表 zero
hadoop fs - touchz /newfile.txt

10-合并小文件

bash 复制代码
#读取本地文件内容追加到HDFS文件
hadoop fs -appendToFile file:/test.txt hdfs:/newfile.txt 

# eg1:Linux文件到hdfs文件    将Linux上的test.txt文件内容追加到hdfs的large.txt文件中(如果此文件不存在则会自动创建)
hadoop fs -appendToFile /home/hadoop/test.txt(Linux文件地址) /cgz/large.txt(hdfs的文件地址)

# eg2:hdfs文件到hdfs文件     将hdfs上存在的文件test.txt追加到hdfs的large.txt文件中
hadoop fs -cat test.txt | hadoop fs -appendToFile - large.txt
:' 中间的 - 代表的含义:
官网中这样说:If <localSrc> is -,then the input is read from stdin.
如果localSrc是-,那么输入的内容是从标准输入读取,那么管道符'|'前面的[hadoop fs -cat test.txt]就相当于标准输入
'

# 合并小文件还有另外一个思路:getmerge    将hdfs上的多个文件合并到linux本地的一个小文件(原hdfs上的文件不变)
# 将hdfs上/cgz目录下所有的txt文件合并到linux本地的merge.txt文件(文件不存在会自动创建)
hadoop fs -getmerge /cgz/*.txt /home/hadoop/merge.txt 

11-创建目录

bash 复制代码
# 同时创建多个同级目录
hadoop fs -mkdir /newdir /newdir2   
# 递归创建目录 -p
hadoop fs -mkdir -p /newpkg/newpkg2/newpkg3

12-修改文件副本数

bash 复制代码
hadoop fs -setrep -R -w 2 /test.txt         
:"
-R 递归改变目录下所有文件的副本数。
-w 等待副本数调整完毕后返回。可理解为加了这个参数就是阻塞式的了。
另一种方法是进入配置文件/usr/local/hadoop/etc/hadoop/hdfs-site.xml修改replication参数值 
"

13-获取文件/目录大小

bash 复制代码
#显示HDFS根目录中各文件和文件夹大小
hadoop fs - du / 
#以最大单位显示HDFS根目录中各文件和文件夹大小
hadoop fs -du -h /  #会出现两列数字,第一列为单个文件实际大小,第二列为备份(副本)大小
#仅显示HDFS根目录大小,即各文件和文件夹大小之和
hadoop fs -du -s /

#拓展:linux中查看根目录下所有子目录下的大小
du -h  --max-depth=1

14-获取目录的信息

bash 复制代码
# 显示HDFS根目录在物理空间的信息   / hdfs的根目录
hadoop fs -count [-h] / 
# 查询结果:
         258         1609         1453656609 /
         258        1.6 K              1.4 G / # 加 -h
:"
第一个数值 : 表示/下的目录的个数(包括其本身).
第二个数值 : 表示/下的文件的个数.
第三个数值 : 表示/下的文件所占的空间大小,这个大小是不计算副本的个数的.
如果不加-h的话,显示的是字节数.
"

15-判断目录、文件是否存在

bash 复制代码
hadoop fs -test -e /app-data/$dt

HDFS管理工具

1-report

bash 复制代码
# 查看HDFS文件系统的基本信息和统计信息.
hdfs dfsadmin -report

2-safemode

bash 复制代码
# 获取安全模式状态
hdfs dfsadmin -safemode get

# 进入安全模式
hdfs dfsadmin  -safemode enter

# 离开安全模式
hdfs dfsadmin -safemode leave

# 等待安全模式结束
hdfs dfsadmin -safemode wait

:"
安全模式是namenode的一种状态,在这种状态下,namenode不接受对名字空间的更改(只读);不复制或删除块.
namenode在启动时自动进入安全模式,当配置块的最小百分数满足最小副本数的条件时,会自动离开安全模式.
每次hdfs在启动的时候都会进入安全模式进行自检,如果自检无误,则退出安全模式;自检的内容是 namenode 中存储的元数据是否可以和 datanode 中的信息对上.
"

3-metasave filename

bash 复制代码
# 保存 namenode 的主要数据结构到 hadoop.log.dir 属性指定的目录下的 <filename> 文件中。
# 在 hadoop 日志目录下创建 namenode 的数据结构信息
hdfs dfsadmin -metasave  namenode_data

4-refreshNodes

bash 复制代码
:"
此命令在新增节点或注销节点时用到.
重新读取hosts和exclude文件,使新的节点或需要退出集群的节点能够被NameNode重新识别.
"
hdfs dfsadmin -refreshNodes
相关推荐
哲讯智能科技3 小时前
SAP环保-装备制造领域创新解决方案
大数据
钡铼技术物联网关3 小时前
Ubuntu工控卫士在制造企业中的应用案例
大数据·人工智能·物联网·边缘计算
闯闯桑4 小时前
scala 中的@BeanProperty
大数据·开发语言·scala
闯闯桑4 小时前
Scala 中的隐式转换
大数据·scala
小刘爱喇石( ˝ᗢ̈˝ )6 小时前
行式数据库与列式数据库区别
数据库·分布式
用户Taobaoapi20146 小时前
淘宝商品列表查询 API 接口详解
大数据
MiniFlyZt7 小时前
消息队列MQ(RabbitMQ)
spring boot·分布式·微服务·rabbitmq
涛思数据(TDengine)7 小时前
taosd 写入与查询场景下压缩解压及加密解密的 CPU 占用分析
大数据·数据库·时序数据库·tdengine
DuDuTalk7 小时前
DuDuTalk接入DeepSeek,重构企业沟通数字化新范式
大数据·人工智能
大数据追光猿7 小时前
Qwen 模型与 LlamaFactory 结合训练详细步骤教程
大数据·人工智能·深度学习·计算机视觉·语言模型