问:上边的文件有几个块,分别是多大?
hdfs-site.xml
当中的配置文件进行指定<property>
<name>dfs.blocksizename>
<value>块大小 以字节为单位value>
property>
面试题
如果有一个文件大小为1KB,它有几个块?每个块是多大?
类似于有一个水桶可以装128斤的水,但是我只装了1斤的水,那么我的水桶里面水的重量就是1斤,而不是128斤
hdfs-site.xml
当中修改以下配置属性,即可更改文件的副本数。<property>
<name>dfs.replicationname>
<value>3value>
property>
NameNode | DataNode |
---|---|
存储元数据 | 存储文件内容 |
元数据保存在内存中 | 文件内容保存在磁盘 |
保存文件、block、DataNode之间的映射关系 | 维护了block id 到 DataNode 本地文件的映射关系 |
例如: 连接(join)操作中使用的一个小的查询表就是块缓存的一个很好的候选。
用户或应用通过在缓存池中增加一个cache directive来告诉namenode需要缓存哪些文件及存多久。缓存池(cache pool)是一个拥有管理缓存权限和资源使用的管理性分组
kerberos
、ranger
来做hadoop fs
开头的hdfs dfs
开头的hdfs dfs -help ls
hadoop fs -help ls #两个命令等价
hdfs dfs -ls /
hadoop fs -ls /
hdfs dfs -ls -R /
hdfs dfs -touchz /edits.txt
hadoop fs -appendToFile edit1.xml /edits.txt #将本地磁盘当前目录的edit1.xml内容追加到HDFS根目录 的edits.txt文件
hdfs dfs -cat /edits.txt
#用法:hdfs dfs -put /本地路径 /hdfs路径
hdfs dfs -put /linux本地磁盘文件 /hdfs路径文件
hdfs dfs -copyFromLocal /linux本地磁盘文件 /hdfs路径文件 #跟put作用一样
hdfs dfs -moveFromLocal /linux本地磁盘文件 /hdfs路径文件 #跟put作用一样,只不过,源文件被拷贝成功后,会被删除
hdfs dfs -get /hdfs路径 /本地路径
hdfs dfs -copyToLocal /hdfs路径 /本地路径 #根get作用一样
hdfs dfs -mkdir /shell
hdfs dfs -rm /edits.txt
# INFO fs.TrashPolicyDefault: Moved: 'hdfs://node01:8020/edits.txt' to trash at: hdfs://node01:8020/user/hadoop/.Trash/Current/edits.txt
# 将文件彻底删除(被删除文件不放到hdfs的垃圾桶里) how?
hdfs dfs -rm -skipTrash /edit1.xml
# 先创建一个文件
hdfs dfs -touchz /a.txt
# 重命名文件
hdfs dfs -mv /a.txt /b.sh
# 移动文件
hdfs dfs -mv /b.sh /shell
hdfs dfs -cp /xrsync.sh /shell
hdfs dfs -rm -r /shell
hdfs dfs -ls file:///home/hadoop/
# linux find命令
find . -name 'edit*'
# HDFS find命令
hadoop fs -find / -name a*.txt # 在HDFS根目录中,查找文件名以 a开头的txt文件
# 获取NameNode的节点名称(可能有多个)
hdfs getconf -namenodes
# 获取hdfs最小块信息, 用相同命令可获取其他的属性值
hdfs getconf -confKey dfs.namenode.fs-limits.min-block-size
# 查找hdfs的NameNode的RPC地址
hdfs getconf -nnRpcAddresses
# 查看hdfs dfsadmin的帮助信息
hdfs dfsadmin
# 同样要学会借助help查看具体命令的帮助信息
hdfs dfsadmin -help safemode
# 查看当前的模式
hdfs dfsadmin -safemode get
# 进入/退出安全模式
hdfs dfsadmin -safemode enter # 进入安全模式
hdfs dfsadmin -safemode leave #退出安全模式
# fsck指令显示HDFS块信息
hdfs fsck /a.txt -files -blocks -locations # 查看文件 a.txt 的块信息
# 检查压缩库本地安装情况
hadoop checknative
# 格式化名称节点(慎用,一般只在初次搭建集群,使用一次;格式化成功后,不要再使用)
hadoop namenode -format
# 执行自定义jar包
hadoop jar /bigdata/install/hadoop-3.1.4/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.4.jar pi 5 5
yarn jar /bigdata/install/hadoop-3.1.4/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.4.jar pi 5 5
$ hdfs dfsadmin -safemode
Usage: hdfs dfsadmin [-safemode enter | leave | get | wait]
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<hadoop.version>3.1.4hadoop.version>
properties>
<dependencies>
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-clientartifactId>
<version>${hadoop.version}version>
dependency>
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-commonartifactId>
<version>${hadoop.version}version>
dependency>
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-hdfsartifactId>
<version>${hadoop.version}version>
dependency>
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-mapreduce-client-coreartifactId>
<version>${hadoop.version}version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.11version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.testnggroupId>
<artifactId>testngartifactId>
<version>RELEASEversion>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.0version>
<configuration>
<source>1.8source>
<target>1.8target>
<encoding>UTF-8encoding>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-shade-pluginartifactId>
<version>2.4.3version>
<executions>
<execution>
<phase>packagephase>
<goals>
<goal>shadegoal>
goals>
<configuration>
<minimizeJar>trueminimizeJar>
configuration>
execution>
executions>
plugin>
plugins>
build>
public class HdfsMkdirsTest {
// 简化版
@Test
public void mkdirsOnHdfs_simple() throws IOException {
// 配置项
Configuration configuration = new Configuration();
// 设置要连接的 hdfs 集群 NameNode
configuration.set("fs.defaultFS", "hdfs://node01:8020");
// 获取文件系统
FileSystem fileSystem = FileSystem.get(configuration);
// 调用方法创建目录,若目录存在,则创建失败,返回false
boolean result = fileSystem.mkdirs(new Path("/yw/dir1"));
assertTrue(result);
fileSystem.close();
}
// 指定目录所属用户
@Test
public void mkdirsOnHdfs_withUser() throws Exception {
// 配置项
Configuration configuration = new Configuration();
// 获取文件系统
FileSystem fileSystem = FileSystem.get(
new URI("hdfs://node01:8020"), configuration, "test");
// 调用方法创建目录,若目录存在,则创建失败,返回false
boolean result = fileSystem.mkdirs(new Path("/yw/dir2"));
assertTrue(result);
fileSystem.close();
}
// 创建目录时,指定目录权限
@Test
public void mkdirsOnHdfs_withPermission() throws IOException {
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "hdfs://node01:8020");
FileSystem fileSystem = FileSystem.get(configuration);
FsPermission fsPermission = new FsPermission(FsAction.ALL, FsAction.READ, FsAction.READ);
boolean result = fileSystem.mkdirs(new Path("hdfs://node01:8020/yw/dir3"), fsPermission);
assertTrue(result);
fileSystem.close();
}
}
public class HdfsUploadFileTest {
@Test
public void uploadFile2Hdfs() throws IOException {
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "hdfs://node01:8020");
FileSystem fileSystem = FileSystem.get(configuration);
fileSystem.copyFromLocalFile(new Path("/Volumes/F/MyGitHub/bigdata/hadoop-demo/src/test/resources/hello.txt"),
new Path("/yw/dir1"));
fileSystem.close();
}
}
public class HdfsDownloadFileTest {
@Test
public void downloadFile2Hdfs() throws IOException {
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "hdfs://node01:8020");
FileSystem fileSystem = FileSystem.get(configuration);
fileSystem.copyToLocalFile(new Path("/yw/dir1/hello.txt"),
new Path("/Volumes/F/MyGitHub/bigdata/hadoop-demo/src/test/resources"));
// // 删除文件
// fileSystem.delete()
// // 重命名文件
// fileSystem.rename()
fileSystem.close();
}
}
public class HdfsViewFileTest {
@Test
public void uploadFile2Hdfs() throws Exception {
// 获取文件系统
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://node01:8020"), configuration);
// 获取文件详情
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/yw"), true);
while (listFiles.hasNext()) {
LocatedFileStatus status = listFiles.next();
// 输出文件详情
// 文件名称
System.out.println(status.getPath().getName());
// 长度
System.out.println(status.getLen());
// 权限
System.out.println(status.getPermission());
// 分组
System.out.println(status.getGroup());
// 获取存储的块信息
BlockLocation[] blockLocations = status.getBlockLocations();
for (BlockLocation blockLocation : blockLocations) {
// 获取块存储的主机节点
String[] hosts = blockLocation.getHosts();
for (String host : hosts) {
System.out.println(host);
}
}
}
// 关闭资源
fs.close();
}
}
hello.txt
13
rw-r--r--
supergroup
node01
node02
node03
@Test
public void putFile2Hdfs() throws Exception {
// 获取文件系统
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://node01:8020"), configuration);
// 创建输入流,不需要加 file:///,否则报错
FileInputStream fis = new FileInputStream(new File("/Volumes/F/MyGitHub/bigdata/hadoop-demo/src/test/resources/hello.txt"));
// 创建输出流,父目录不存在,会自动创建
FSDataOutputStream fos = fs.create(new Path("/yw/dir2/hello.txt"));
// 流对拷
IOUtils.copy(fis, fos); // org.apache.commons.io.IOUtils
// 关闭资源
IOUtils.closeQuietly(fis);
IOUtils.closeQuietly(fos);
fs.close();
}
/**
* 小文件合并:读取所有本地小文件,写入到hdfs的大文件里面去
*/
@Test
public void mergeFile() throws Exception {
// 获取分布式文件系统
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://node01:8020"), configuration, "hadoop");
FSDataOutputStream fsdos = fs.create(new Path("/yw/dir3/big.txt"));
LocalFileSystem lfs = FileSystem.getLocal(configuration);
FileStatus[] fileStatuses = lfs.listStatus(new Path("/Volumes/F/MyGitHub/bigdata/hadoop-demo/src/test/resources/"));
for (FileStatus fileStatus : fileStatuses) {
// 获取每一个本地文件路径
Path path = fileStatus.getPath();
// 读取本地小文件
FSDataInputStream fsdis = lfs.open(path);
IOUtils.copy(fsdis, fsdos);
IOUtils.closeQuietly(fsdis);
}
IOUtils.closeQuietly(fsdos);
lfs.close();
fs.close();
}
<property>
<name>dfs.datanode.data.dirname>
<value>file:///bigdata/install/hadoop-3.1.4/hadoopDatas/datanodeDatasvalue>
property>
# 以下属性,可以查看官网的`hdfs-default.xml`文件
timeout = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval
<property>
<name>dfs.namenode.heartbeat.recheck-intervalname>
<value>300000value>
property>
<property>
<name> dfs.heartbeat.interval name>
<value>3value>
property>
node01
的目录/bigdata/install/hadoop-3.1.4/hadoopDatas/datanodeDatas/current
下查看版本号[hadoop@centos128 current]$ cat VERSION
#Wed Nov 24 07:46:56 CST 2021
storageID=DS-1661390a-4348-459e-938f-220dd9984e38
clusterID=CID-d4ce4fe0-d991-4a87-bccb-fde0c80fd838
cTime=0
datanodeUuid=04b892c7-d0d5-4e65-ac96-8130476fde01
storageType=DATA_NODE
layoutVersion=-57
vim /bigdata/install/hadoop-3.1.4/etc/hadoop/hdfs-site.xml
<property>
<name>dfs.datanode.data.dirname>
<value>
/home/hadoop/develop/data/data1/hdfs,
/home/hadoop/develop/data/data2/hdfs
value>
property>
DistributedFileSystem.create()
;假设说当前构建的pipeline是dn1、dn2、dn3构成的当传输数据的过程中,dn2挂了或通信不畅了,则当前pipeline中断 HDFS 会如何做?
如何容错?