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