目录
hadoop分布式文件存储系统,用来解决海量数据的存储问题
HDFS的组成------核心配置文件:hdfs-site.xml、core-site.xml
NameNode:负责整个HDFS集群的管理(比如监控DataNode的运行状态、调度DataNode去处理数据);存储元数据(包含数据的基本信息,有两个重要文件:fsimage, editsfsimage, edits)
- core-site.xml中:
-
- fs.defaultFS-------用于指定NameNode的地址;
- hadoop.tmp.dir----指定HDFS集群中相关文件存储的目录
- hdfs-site.xml中:
-
- dfs.namenode.name.dir------明确指定NameNode的镜像文件和日志文件等应该在什么路径下,如果不配置,则默认在hadoop.tmp.dir配置的目录的dfs/name下
- dfs.namenode.http-address---------(0.0.0.0:50070)用来配置NameNode的外部访问端口号
DataNode:负责整个集群的数据存储(数据就是以文件存储的),底层是以block块去存储数据的,一个block块默认128M
- hdfs-site.xml:
- dfs.replication------配置block块的副本数,默认是3
- dfs.namenode.heartbeat.recheck-interval-------NameNode检测DataNode状态的间隔时间,默认是5分钟,单位是ms
- dfs.heartbeat.interval--------NameNode和DataNode的心跳时间,默认是3秒
- dfs.datanode.data.dir-------用来指定DataNode中存储的block块的存放在Linux上的路径,默认在hadoop.tmp.dir/dfs/data目录下
- dfs.namenode.datanode.registration.ip-hostname-check-------hadoop默认配置HDFS的DataNode,Yarn的NodeManager,需要在 slaves文件配置,默认配置主机名,并且会对主机名在/etc/hosts文件做IP对照,如果没有,则无法正常启动。如果我们配置的是IP,那么必须将这一项设置为false,否则会把IP当做主机名去处理
- dfs.datanode.http-address---------(0.0.0.0:50075)用来配置DataNode的外部访问端口号
Notes:NameNode认为DataNode死亡的时间计算表达式:
2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval
- slaves:
- 指定DataNode/NodeManager的节点在哪些主机上(配置在这个文件中的主机,会随着start-dfs.sh一起启动)
- 这个文件中默认配置需要用主机名配置(主机名必须在/etc/hosts文件中配置主机映-----主机名对应的IP地址))
- 如果在slaves中配置的是IP地址,那么必须关掉HDFS中的hostname转换IP的检查,否则配置的IP不生效
-
dfs.hosts:
- 白名单文件:类似于slaves,里面配置的也是一些主机地址,只不过配置在白名单中的地址可以和NameNode、ResourceManager之间联系心跳。
-
注意:
- 它与slaves文件的功能不一样,slaves中配置的这些主机会随着start-dfs.sh一起启动,但是配置在dfs.hosts文件中的主机不会随着这些启动,需要单独启动
- dfs.hosts文件主要是用来做服役新节点的,如果增加了一个新节点之后,那么在dfs.hosts中增加新节点地址即可,但是如果你想让这个新节点下一次随着start-dfs.sh一起启动,那么必须在slaves文件中也增加以下
- dfs.hosts文件必须在hdfs-site.xml文件中配置一下,配置项是dfs.hosts,值是这个文件的路径
-
dfs.hosts.exclude:
- 黑名单文件:和slaves类似,配置的也是主机地址,但是配置在这个地方的地址禁止和NameNode、ResourceManager联系
-
注意:
- 黑名单文件也必须在hdfs-site.xml中配置dfs.hosts.exclude这个配置项
- 黑名单文件一般做退役数据节点使用
- 如果一个地址既在白名单出现,也在黑名单文件出现,那么就代表这个节点要退役
SecondaryNameNode:主要负责辅助NameNode去合并日志文件和镜像文件
- hdfs-site.xml:
- dfs.namenode.secondary.http-address------(0.0.0.0:50090)代表SecondaryNameNode的外部访问路径
-
作用:
- 可以帮助NameNode合并文件
- 可以恢复NameNode中丢失的元数据(将SecondaryNameNode目录下的文件复制到NameNode配置的路径中即可恢复)
HDFS的操作----要求HDFS必须处于启动状态(start-dfs.sh)
HDFS的命令行操作:在shell中使用命令操作
【补充:shell脚本编程语言----Linux中运行的命令都是shell命令,我们也可以将shell命令写在一个shell脚本中,然后去运行】
- 命令语法:
- hdfs dfs 可选操作 文件路径 … (官方建议使用)
- hdfs fs 可选操作 文件路径 …
-
常用命令:
-
从hdfs上下载(复制)一个文件到Linux本地
- hdfs dfs -copyToLocal src dst
- hdfs dfs -get src dst
-
复制一个Linux本地文件到HDFS
- hdfs dfs -put src dst
- hdfs dfs -copyFromLocal src dst
-
HDFS剪切文件到Linux / Linux剪切文件到HDFS
- hdfs dfs -moveToLocal / moveFromLocal
-
HDFS文件的删除 / 重命名 / 移动 / 复制
- hdfs dfs -rmdir/-rm / -r / -mv / -cp hdfs相关路径
-
将本地文件的内容追加到HDFS上一个文件中
- hdfs dfs -appendToFile
-
将hadoop上的多个文件下载到Linux本地,并将文件内容合并
- hdfs dfs -getmerge hdfs文件路径 Linux路径
-
Java API操作
- 环境准备:① 本地安装hadoop软件并配置环境变量;② hdfs操作需要依赖的jar包(手动 / maven依赖)
-
重点类
-
Configuration:代表HDFS的配置文件,配置文件的优先级高于HDFS软件中的配置
set(String key, String value)
-
FileSystem:HDFS文件系统的一个抽象表示,可以通过这个类获取HDFS上任何一个文件或者文件夹
get(URI, Configuration, String user):获取文件/目录
copyFromLocalFile(Path, Path):从本地复制文件到hadoop
CopyToLocalFile(Path, Path):从hadoop复制文件到Linux本地
moveToLocalFile / moveFromLocalFile(Path):剪切文件到hadoop/Linux本地
delete(Path, boolean):删除文件/目录,boolean值表示是否递归删除
rename(Path, Path):重命名文件
mkdirs(Path):创建目录
createNewFile(Path):创建文件
create(Path) ---- IO,文件输出流,代表可以通过输出流往文件中写数据
open(Path) -----IO,文件输入流,代表可以通过输入流将HDFS中的数据读取到Linux中
isFile(Path):是否为文件?
isDirectory(Path):是否为目录?
exists(Path):文件/目录是否存在
listFiles(Path, boolean):查找目录下所有文件,boolean值指定是否打印当前文件及当前文件目录下含有的目录下的文件
listStatus(Path):将path路径下所有文件和文件夹打印出来,不能递归打印
-
FileStatus:HDFS上一个文件的抽象表示,可以获取文件的权限、用户、修改时间等等操作
getOwner():获取拥有者
getGroup():获取所属组
getPermission():获取文件权限
getModifationTime():获取文件最后一次修改时间
getBlockSize():获取文件每一个块的大小
getReplication():获取文件副本数
getPath():获取当前文件目录
isFile():是否为文件?
isDirectory():是否为目录?
-