HDFS
一、HDFS架构
HDFS块大小的问题:
Hadoop1.x默认block大小64MB Hadoop2.x 3.x默认block大小128MB 实际生产中一般256MB或512MB
块大小的设置依据: 经过大量测试得出的结论:磁盘寻址时间和文件读写时间为1:100时,HDFS性能最佳 block过小,文件数量较多,NN压力较大,文件查找时间增加 block过大,读取一个block的时间较长,单个MapTask处理较慢
HDFS 命令行操作
-
hadoop fs -命令
-
hdfs dfs -命令
-help:输出这个命令参数 -ls: 显示目录信息 # -mkdir:在hdfs上创建目录 hdfs dfs -mkdir /dir1 # -rmdir:删除空目录 hdfs dfs -rmdir /dir1 #-df :统计文件系统的可用空间信息 # 查看当前HDFS集群的容量占用情况 hdfs dfs -df -h #-copyFromLocal:从本地文件系统中拷贝文件到hdfs路径去 # -put:等同于copyFromLocal # 将本地文件上传到HDFS集群 hdfs dfs -put /root/1.txt / #-moveFromLocal从本地剪切粘贴到hdfs # 上传并删除本地文件 # -copyToLocal:从hdfs拷贝到本地 # -get:等同于copyToLocal,就是从hdfs下载文件到本地 hdfs dfs -get /1.txt /root # -cp :从hdfs的一个路径拷贝到hdfs的另一个路径 # -mv:在hdfs目录中移动文件 # -cp 和 mv 是集群路径之间的操作 # -cat :显示文件内容 # -tail:显示一个文件的末尾 # -appendToFile :追加一个文件到已经存在的文件末尾 # 将多个本地文件合并到HDFS集群上的单个文件 hdfs dfs -appendToFile 1.txt 2.txt 3.txt /Harry.txt # -getmerge :合并下载多个文件,比如hdfs的目录 /hj/下有多个文件:log.1, log.2,log.3,... # 将多个HDFS文件下载并合并到单个本地文件 hdfs dfs -getmerge /1.txt /2.txt /3.txt /root/res.txt linux文件系统中的用法一样,修改文件所属权限 -chgrp -chmod -chown # -rm:删除文件或文件夹 hdfs dfs -rm -r /文件或者文件夹 # -du统计文件夹的大小信息 # 查看文件夹占用磁盘空间的大小 hdfs dfs -du -s -h /文件夹 # -setrep:设置hdfs中文件的副本数量 # HDFS默认将文件保存3个副本 # 可以通过setrep根据文件的安全性要求单独改变文件的副本个数 hdfs dfs -setrep n /文件
二、HDFS JavaAPI操作
-
maven依赖hadoop-client
-
关键类FileSystem
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.permission.FsPermission; import java.net.URI; import java.text.SimpleDateFormat; public class HDFSDemo1 { public static void main(String[] args) throws Exception { URI uri = URI.create("hdfs://192.168.235.10:8020"); Configuration conf = new Configuration(); String user = "root"; FileSystem fs = FileSystem.get(uri, conf, user); String pa = "/dir1";//Path路径 FileStatus[] fileStatuses = fs.listStatus(new Path(pa)); StringBuilder builder = new StringBuilder(); Path src = new Path("G:\\aaa.txt"); Path dst = new Path("/"); /** * 上传文件 * 参数一:true相当于剪切本地文件 false相当于复制本地文件 * 参数二:true覆盖集群文件 false不覆盖 * 参数三:本地路径 * 参数四:集群的路径 */ fs.copyFromLocalFile(true,true,src,dst); /** * 下载文件 * 参数一:原文件是否删除 * 参数二:原文件路径HDFS * 参数三:目标地址路径 * 参数四:是否开启本地校验 */ Path dst1 = new Path("/aaa.txt"); Path src1 = new Path("G:\\"); fs.copyToLocalFile(dst1,src1); //创建目录 fs.mkdirs(new Path("/dir1/dir2")); /** * 删除文件 * 参数一:集群文件路径 * 参数二:是否递归删除 */ fs.delete(new Path("/dir1/dir2"),true); //文件名更改 fs.rename(new Path("/aaa.txt"),new Path("/bbb.txt")); //设置时间格式 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd" + " " + "HH:mm"); //查看文件详情 for (FileStatus fileStatus : fileStatuses) { //-rw-r--r-- 3 root supergroup 9 2021-11-16 18:52 /dir1/a.txt if (fileStatus.isFile()) {//判断文件或者目录 builder.append("-"); } else { builder.append("d"); } //文件权限 FsPermission permission = fileStatus.getPermission(); builder.append(permission).append("\t").append("\t"); //副本数 short replication = fileStatus.getReplication(); builder.append(replication).append("\t"); //所有人 String owner = fileStatus.getOwner(); builder.append(owner).append("\t"); //所属组 String group = fileStatus.getGroup(); builder.append(group).append("\t").append("\t"); //文件大小 long len = fileStatus.getLen(); builder.append(len).append("\t"); //更新时间 long time = fileStatus.getModificationTime(); String format = simpleDateFormat.format(time); builder.append(format).append("\t"); //文件名 String name = fileStatus.getPath().getName(); builder.append(pa).append("/").append(name).append("\n"); } System.out.println(builder.toString()); fs.close(); }
设置副本数
1、客户端代码设置值
//设置副本数 Configuration conf = new Configuration(); conf.set("dfs.replication", "2"); FileSystem fs = FileSystem.get(uri, conf, user);
2、sources下设置hdfs-site.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
3、服务器的自定义配置(xxx-site.xml)
<configuration> <property> <!-- 设置副本数 --> <name>dfs.replication</name> <value>1</value> </property> </configuration>
4、服务器默认副本数为3
参数优先级
参数优先级排序:(1)客户端代码中设置的值 >(2)ClassPath下的用户自定义配置文件 >(3)然后是服务器的自定义配置(xxx-site.xml) >(4)服务器的默认配置(xxx-default.xml)