敞开掘金成长之旅!这是我参加「掘金日新计划 12 月更文应战」的第1天,点击检查活动详情

前语 问题引入

(这是以前讲课的时分,给学生预备的一些问题,大家能够思考一下,对理解HDFS很有协助)

1、假如一个文件中有10个数值(一行一个,而且都是能够用int来衡量), 现在求10个数值的和。

这个思路很简单。

2、假如,这样的文件有很大一堆, 而且每个文件都很大,而且每个文件里边的内容都很多

例如:现在有10000个文件,每个文件2T,文件里边的内容依然是每行一个数值,要求这一堆文件的一切数值的和。

思路是什么?有没有更加好的计划?

3、又有个问题:该10000个2T的文件应该怎样散布, 才能让这10000个使命的履行效率到达最高?

4、数据的处理:存储 和 核算 是怎样规划的?

5、HDFS是怎样保障数据的安全的?

6、HDFS核心思想

第一章 HDFS介绍

1.1 HDFS规划思路

HDFS 被规划成用来运用低价的服务器来进行海量数据的存储,那是怎样做到的呢?

1、大文件被切割成小文件,运用分而治之的思想对同一个文件进行办理 涣散存储

2、每个切分之后的块都进行冗余存储,高可用不丢掉 冗余备份

大数据生态圈及分布式文件系统HDFS实践-part2

1.2 HDFS架构

1、namenode:掌管文件体系的目录树,处理客户端的恳求,保存元数据信息

2、datanode:存储实践的数据的,处理真实的读写

3、secondnamenode:分担namenode压力的,帮忙兼并元数据信息

大数据生态圈及分布式文件系统HDFS实践-part2

具体弥补解说:

1、NameNode:是Master,办理者节点。
(1)办理HDFS的称号空间
(2)装备副本策略
(3)办理数据块(Block)映射信息
(4)处理客户端读写恳求
2、DataNode:是Worker,NameNode下达指令,DataNode履行实践的操作。
(1)存储实践的数据块
(2)履行数据块的读/写操作
3Client:是客户端。
(1)文件切分。文件上传HDFS的时分,Client将文件切分红一个一个的Block,然后进行上传
(2)与NameNode交互,获取文件的位置信息
(3)与DataNode交互,读取或者写入数据
(4Client供给一些指令来办理HDFS,比方NN格式化 hadoop namenode -format
(5Client供给一些指令来拜访HDFS,比方对HDFS查询操作
4、Secondary NameNode:不是NameNode的热备。当NameNode挂掉的时分,它并不能马上替换NameNode并供给服务。
协助NameNode,分担其工作量,比方定期兼并Fsimage和Edits,并回来给NameNode 

1.3 HDFS优缺点

1.3.1 优点

1、可构建在廉价机器上

经过多个副本来提高可靠性,文件切分多个块进行存储

2、高容错性

数据自动保存多个副本,副本丢掉后,能够自动恢复

3、合适批处理

数据规划:能够处理PB等级数据 文件数量:能够处理百万等级以上的文件数量

4、合适大数据文件处理

10k+节点规划

5、流式写入

合适于一次写入、屡次读出的场景。文件经过创立、写入和联系之后就不需要再改动。

一次写入,屡次读取,能够确保数据的一致性

1.3.2 缺点

不适于以下操作

1、要求高的数据拜访

比方毫秒级

2、小文件存取

寻道时刻超越读取时刻

3、并发写入、文件随机修正

一个文件只能有一个写 仅仅支持append追加

4、不合适存储小文件

存储一个1亿个小文件,巨细仅仅1t,可是消耗掉20g左右的内存

第二章 HDFS的shell操作

2.1 前语

HDFS 供给 shell 指令行客户端,运用办法如下:

hadoop fs 和 hdfs dfs 指令相同作用

大数据生态圈及分布式文件系统HDFS实践-part2

hadoop fs 还有以下的指令行操作:

[root@hadoop0 software]# hadoop fs 
Usage: hadoop fs [generic options]
    [-appendToFile <localsrc> ... <dst>]
    [-cat [-ignoreCrc] <src> ...]
    [-checksum <src> ...]
    [-chgrp [-R] GROUP PATH...]
    [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
    [-chown [-R] [OWNER][:[GROUP]] PATH...]
    [-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>]
    [-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-count [-q] [-h] <path> ...]
    [-cp [-f] [-p | -p[topax]] <src> ... <dst>]
    [-createSnapshot <snapshotDir> [<snapshotName>]]
    [-deleteSnapshot <snapshotDir> <snapshotName>]
    [-df [-h] [<path> ...]]
    [-du [-s] [-h] <path> ...]
    [-expunge]
    [-find <path> ... <expression> ...]
    [-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-getfacl [-R] <path>]
    [-getfattr [-R] {-n name | -d} [-e en] <path>]
    [-getmerge [-nl] <src> <localdst>]
    [-help [cmd ...]]
    [-ls [-d] [-h] [-R] [<path> ...]]
    [-mkdir [-p] <path> ...]
    [-moveFromLocal <localsrc> ... <dst>]
    [-moveToLocal <src> <localdst>]
    [-mv <src> ... <dst>]
    [-put [-f] [-p] [-l] <localsrc> ... <dst>]
    [-renameSnapshot <snapshotDir> <oldName> <newName>]
    [-rm [-f] [-r|-R] [-skipTrash] <src> ...]
    [-rmdir [--ignore-fail-on-non-empty] <dir> ...]
    [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
    [-setfattr {-n name [-v value] | -x name} <path>]
    [-setrep [-R] [-w] <rep> <path> ...]
    [-stat [format] <path> ...]
    [-tail [-f] <file>]
    [-test -[defsz] <path>]
    [-text [-ignoreCrc] <src> ...]
    [-touchz <path> ...]
    [-truncate [-w] <length> <path> ...]
    [-usage [cmd ...]]

2.2 常用指令参数介绍

-help
功用:输出这个指令参数手册
[root@hadoop0 software]# hadoop fs -help
​
-ls
功用:显现目录信息
示例: hadoop fs -ls hdfs://hadoop0:9000/
备注:这些参数中,一切的 hdfs 途径都能够简写成 hadoop fs -ls / 等同上条指令的作用
​
-put
功用:等同于 copyFromLocal,进行文件上传
示例:hadoop  fs  -put  /aaa/jdk.tar.gz  /bbb/jdk.tar.gz
​
-get
功用:等同于 copyToLocal,就是从 hdfs 下载文件到本地
示例:hadoop fs -get  /aaa/jdk.tar.gz
​
-cp        
功用:从 hdfs 的一个途径复制到 hdfs 的另一个途径 
示例: hadoop  fs  -cp  /aaa/jdk.tar.gz  /bbb/jdk.tar.gz.2
​
-mv           
功用:在 hdfs 目录中移动文件 
示例: hadoop  fs  -mv  /aaa/jdk.tar.gz  /
​
-rm         
功用:删去文件或文件夹 
示例:hadoop fs -rm -r /aaa/bbb/ 
-rmdir         
功用:删去空目录 
示例:hadoop  fs  -rmdir  /aaa/bbb/ccc
​
-moveFromLocal       
功用:从本地剪切到 hdfs 
示例:hadoop  fs  - moveFromLocal  /home/hadoop/a.txt  /aa/bb/cc/dd 
-moveToLocal        
功用:从 hdfs 剪切到本地 
示例:hadoop  fs  - moveToLocal  /aa/bb/cc/dd  /home/hadoop/a.txt
​
-copyFromLocal   
功用:从本地文件体系中复制文件到 hdfs 文件体系去 
示例:hadoop  fs  -copyFromLocal  ./jdk.tar.gz  /aaa/ 
-copyToLocal    
功用:从 hdfs 复制到本地 
示例:hadoop fs -copyToLocal /aaa/jdk.tar.gz
​
-appendToFile  
功用:追加一个文件到已经存在的文件结尾 
示例:hadoop  fs  -appendToFile  ./hello.txt  hdfs://hadoop0:9000/hello.txt 
能够简写为: 
hadoop  fs  -appendToFile  ./hello.txt  /hello.txt
​
-cat
功用:显现文件内容 
hadoop  fs  -cat  /hello.txt
​
-tail         
功用:显现一个文件的结尾 
示例:hadoop  fs  -tail  /weblog/access_log.1
​
-text          
功用:以字符办法打印一个文件的内容 
示例:hadoop  fs  -text  /weblog/access_log.1
​
-chgrp 
-chmod 
-chown 
功用:linux 文件体系中的用法相同,对文件所属权限 
示例: 
hadoop  fs  -chmod  666  /hello.txt 
hadoop  fs  -chown  someuser:somegrp  /hello.txt
hadoop  fs  -chown  root:supergroup  /zz/test1.txt
​
-df 
功用:计算文件体系的可用空间信息 
示例:hadoop  fs  -df  -h  / 
-du 
功用:计算文件夹的巨细信息 
示例:hadoop  fs  -du  -s  -h /aaa/*
​
-count     
功用:计算一个指定目录下的文件节点数量 
示例:hadoop fs -count /aaa/
​
-setrep 
功用:设置 hdfs 中文件的副本数量 
示例:hadoop fs -setrep 3 /aaa/jdk.tar.gz
​

弥补:检查 dfs 集群工作状况的指令

hdfs dfsadmin -report

2.3 再次弥补常见指令

根底指令
1、发动Hadoop集群
sbin/start-dfs.sh
sbin/start-yarn.sh
2、-help:输出这个指令参数
hadoop fs -help rm
3、创立/zz文件夹
[root@hadoop10 software]# hadoop fs -mkdir /zz
4、追加文件操作
[root@hadoop10 data]# hadoop fs -put wordcount.txt /bb/cc
[root@hadoop10 data]# hadoop fs -appendToFile aa.txt /bb/cc/wordcount.txt
​
上传相关
1、-moveFromLocal:从本地剪切到HDFS
vim aa.txt
输入:
aa
具体指令:
[root@hadoop10 data]# hadoop fs  -moveFromLocal  ./aa.txt  /zz
2、-copyFromLocal:从本地文件体系中复制文件到HDFS途径去
vim bb.txt
bb
[root@hadoop10 data]# hadoop fs -copyFromLocal bb.txt /zz
3、-put:等同于copyFromLocal,个人喜欢用put
vim cc.txt
cc
hadoop fs -put ./cc.txt /zz
4、-appendToFile: 追加一个文件到已经存在的文件结尾
vim dd.txt
dd
[root@hadoop10 data]# hadoop fs -appendToFile dd.txt /zz/bb.txt
​
​
下载相关
1、-copyToLocal:HDFS复制到本地
[root@hadoop10 data]# hadoop fs -copyToLocal /zz/aa.txt ./
2、-get:等同于copyToLocal,个人偏好get
[root@hadoop10 data]# hadoop fs -get /zz/aa.txt ./aa2.txt
​
HDFS其他一些常见操作
1、-ls: 显现目录信息
[root@hadoop10 data]# hadoop fs -ls /zz
2、-cat:显现文件内容
[root@hadoop10 data]# hadoop fs -cat /zz/aa.txt
3、-chgrp、-chmod、-chown:Linux文件体系中的用法相同,修正文件所属权限
[root@hadoop10 data]# hadoop fs  -chmod 666  /zz/aa.txt
4、-mkdir:创立途径
hadoop fs -mkdir /yy
5、-cp:从HDFS的一个途径复制到HDFS的另一个途径
hadoop fs -cp /zz/aa.txt /yy
6、-mv:在HDFS目录中移动文件
hadoop fs -mv /zz/aa.txt /yy
hadoop fs -mv /zz/bb.txt /yy
7、-tail:显现一个文件的结尾1kb的数据
hadoop fs -tail /yy/dd.txt
8、-rm:删去文件或文件夹
hadoop fs -rm /zz/dd.txt
9、-rm -r:递归删去目录及目录里边内容
hadoop fs -rm -r /zz
10、-du计算文件夹的巨细信息
hadoop fs -du -s -h /yy
3  6  /yy
​
[root@hadoop10 logs]# hadoop fs -du  -h /zz
3  3  /zz/aa.txt
6  6  /zz/bb.txt
说明:第一个3表明文件巨细;第二个3表明3*1个副本;/yy表明检查的目录
11)-setrep:设置HDFS中文件的副本数量
hadoop fs -setrep 5 /yy/aa.txt
​
这里设置的副本数仅仅记录在NameNode的元数据中,是否真的会有这么多副本,还得看DataNode的数量。目前只有2个datanode节点,最多也就2个副本,只有从节点数的添加到5台时,副本数才能到达5
​
​
页面上复制剪切的时分的犯错
Couldn't move file aa.txt. Forbidden
给文件夹属性也改成777

第三章 HDFS的API操作

3.0 在写客户端代码的时分本地的环境装备

1、现在本地给hadoop3.2.2安装包解压了

2、在解压之后的安装包的bin目录下面添加winutils.exe和hadoop.dll

3、装备环境变量

大数据生态圈及分布式文件系统HDFS实践-part2

大数据生态圈及分布式文件系统HDFS实践-part2

3.1 导入Maven依靠

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
     <artifactId>bigdatapre</artifactId>
     <groupId>com.aa</groupId>
     <version>1.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion><artifactId>hdfs</artifactId><dependencies>
     <dependency>
       <groupId>org.apache.hadoop</groupId>
       <artifactId>hadoop-client</artifactId>
       <version>3.2.2</version>
     </dependency>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>4.13.2</version>
     </dependency>
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-log4j12</artifactId>
       <version>1.7.30</version>
     </dependency>
   </dependencies></project>

3.2 拜访数据(运用文件体系办法)

说在前面:其间涉及到的几个类

在 Java 中操作 HDFS, 主要涉及以下 Class

Configuration:该类的目标封转了客户端或者服务器的装备

FileSystem:该类的目标是一个文件体系目标, 能够用该目标的一些办法来对文件进行操作, 经过 FileSystem 的静态办法 get 获得该目标

3.2.1 获取FileSystem

第一种办法:set办法+经过get

   /**
   * 办法一:set办法+经过get
   * @throws IOException
   */
   public void getFileSystem1() throws IOException {
     //1:创立Configuration目标
     Configuration conf = new Configuration();
​
     //2:设置文件体系类型
     conf.set("fs.defaultFS", "hdfs://hadoop0:8020");
​
     //3:获取指定文件体系
     FileSystem fileSystem = FileSystem.get(conf);
​
     //4:输出测验
     System.out.println(fileSystem);
   }
​

测验结果:

DFS[DFSClient[clientName=DFSClient_NONMAPREDUCE_1593411524_1, ugi=LIAO (auth:SIMPLE)]] Process finished with exit code 0

大数据生态圈及分布式文件系统HDFS实践-part2

办法二:set办法+经过newInstance

   /**
   * 办法二:set办法+经过newInstance
   * @throws IOException
   */
   public void getFileSystem2() throws IOException {
     //1:创立Configuration目标
     Configuration conf = new Configuration();
​
     //2:设置文件体系类型
     conf.set("fs.defaultFS", "hdfs://hadoop0:8020");
​
     //3:获取指定文件体系
     FileSystem fileSystem = FileSystem.newInstance(conf);
​
     //4:输出测验
     System.out.println(fileSystem);
   }
​

办法三:new URI+get

   /**
   * 办法三:new URI+get
   * @throws Exception
   */
   public void getFileSystem3() throws Exception{
     FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop0:8020"), new Configuration());
     System.out.println("fileSystem:"+fileSystem);
   }
​

办法四:new URI+newInstance

   /**
   * 办法四:newInstance+get
   * @throws Exception
   */
   public void getFileSystem4() throws Exception{
     FileSystem fileSystem = FileSystem.newInstance(new URI("hdfs://hadoop0:8020"), new Configuration());
     System.out.println("fileSystem:"+fileSystem);
   }
​

3.2.2 文件的遍历

   /**
   * hdfs文件的遍历
   * @throws URISyntaxException
   * @throws IOException
   */
   public void listFiles() throws URISyntaxException, IOException {
     //1、获取FileSystem实例
     FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop10:8020"), new Configuration());
​
     //2、调用办法listFiles 获取 /目录下一切的文件信息
     RemoteIterator<LocatedFileStatus> iterator = fileSystem.listFiles(new Path("/"), true);
​
     //3、遍历迭代器
     while (iterator.hasNext()){
       LocatedFileStatus fileStatus = iterator.next();
​
       //获取文件的绝对途径 : hdfs://hadoop0:8020/xxx
       System.out.println(fileStatus.getPath() + "======" +fileStatus.getPath().getName());
       System.out.println(fileStatus.getPermission());
       System.out.println(fileStatus.getOwner());
       System.out.println(fileStatus.getGroup());
       System.out.println(fileStatus.getLen());
       System.out.println(fileStatus.getModificationTime());
       System.out.println(fileStatus.getReplication());
       System.out.println(fileStatus.getBlockSize());
       System.out.println(fileStatus.getPath().getName());
​
       //文件的block信息
       BlockLocation[] blockLocations = fileStatus.getBlockLocations();
​
       for (BlockLocation blockLocation : blockLocations) {
         String[] hosts = blockLocation.getHosts();
         System.out.println("block数量为: "+hosts.length);
         for (String host : hosts) {
           System.out.println("主机为: "+host);
         }
       }
       System.out.println();
     }
   }
​

3.2.3 创立文件夹

   /**
   * 创立文件夹
   * @throws URISyntaxException
   * @throws IOException
   * @throws InterruptedException
   */
   public void mkdirs() throws URISyntaxException, IOException, InterruptedException {
     //1:获取FileSystem实例
     FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop0:8020"), new Configuration(),"root");
​
     //2:创立文件夹
     boolean bl = fileSystem.mkdirs(new Path("/aaa/bbb/ccc"));
     //fileSystem.create(new Path("/aaa/bbb/ccc/a.txt"));
     //fileSystem.create(new Path("/aaa2/bbb/ccc/a.txt"));
     System.out.println(bl);
​
     //3: 封闭FileSystem
     fileSystem.close();
   }
​

3.2.4 文件的上传

简易版代码:

   /**
   * 文件的上传
   * @throws URISyntaxException
   * @throws IOException
   * @throws InterruptedException
   */
   public void uploadFile() throws URISyntaxException, IOException, InterruptedException {
     //1:获取FileSystem
     FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop0:8020"), new Configuration(),"root");
​
     //2:调用办法,完成上传
     fileSystem.copyFromLocalFile(new Path("D://test1.txt"), new Path("/"));
​
     //3:封闭FileSystem
     fileSystem.close();
   }
​

稍微杂乱版本代码:

设置副本的优先级能够经过如下的代码设置

   /**优先级:1>2>3>4
   * (1)客户端代码中设置的参数值 
   * (2)resources资源目录下的用户自定义装备文件 
   * (3)服务器自定义装备(hdfs-site.xml) 
   * (4)服务器默认装备(hdfs-default.xml)
   * @throws IOException
   * @throws InterruptedException
   * @throws URISyntaxException
   */
   //@Test
   public void uploadFile() throws IOException, InterruptedException, URISyntaxException {
​
     // 1、获取文件体系
     Configuration configuration = new Configuration();
     configuration.set("dfs.replication", "3");
     FileSystem fs = FileSystem.get(new URI("hdfs://hadoop10:8020"), configuration, "root");
​
     // 2、上传文件操作
     //fs.copyFromLocalFile(new Path("D:\input\test1.txt"), new Path("/bb/cc"));
     /**
     * @param delSrc whether to delete the src  默认是不删去
     * @param overwrite whether to overwrite an existing file  默认是覆盖写入true
     * @param src path
     * @param dst path
     */
     fs.copyFromLocalFile(false,true,new Path("D:\input\test1.txt"), new Path("/bb/cc"));
​
     // 3、封闭资源
     fs.close();
   }

3.2.5 文件的下载

文件的下载办法一:运用copyToLocalFile

   /**
   * 文件的下载办法一:运用copyToLocalFile
   * @throws URISyntaxException
   * @throws IOException
   * @throws InterruptedException
   */
   //@Test
   public void downloadFile1() throws URISyntaxException, IOException{
     //1:获取FileSystem
     FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop10:8020"), new Configuration());
     //2:调用办法,完成文件的下载// boolean delSrc 指是否将原文件删去
     // Path src 指要下载的文件途径
     // Path dst 指将文件下载到的途径
     // boolean useRawLocalFileSystem 是否敞开文件校验  就是是否生成windows体系是上面那个crc文件,设置true,不会有crc文件。设置false在本地会有crc文件。
     fileSystem.copyToLocalFile(false,new Path("/bb/cc/test1.txt"), new Path("D://test1_down1.txt"),false);
​
     //3:封闭FileSystem
     fileSystem.close();
   }

文件的下载办法二:经过输入输出流

   /**
   * 文件的下载办法二:经过输入输出流
   * @throws URISyntaxException
   * @throws IOException
   */
   public void downloadFile2() throws URISyntaxException, IOException {
     //1:获取FileSystem
     FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop0:8020"), new Configuration());
​
     //2:获取hdfs的输入流
     FSDataInputStream inputStream = fileSystem.open(new Path("/test1.txt"));
​
     //3:获取本地途径的输出流
     FileOutputStream outputStream = new FileOutputStream("D://test1_down2.txt");
​
     //4:文件的复制
     IOUtils.copy(inputStream, outputStream);
     //5:封闭流
     IOUtils.closeQuietly(inputStream);
     IOUtils.closeQuietly(outputStream);
     fileSystem.close();
   }
​

3.2.6 判别是文件或者文件夹

   //判别某个途径下面的内容是文件或者文件夹
   public void isFileOrDir() throws URISyntaxException, IOException, InterruptedException {
     //1、获取FileSystem
     FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop10:8020"), new Configuration(), "root");
​
     //2、找到根目录/下面一切的文件或文件夹
     FileStatus[] listStatus = fileSystem.listStatus(new Path("/"));
​
     //3、判别
     for (FileStatus status : listStatus) {
       if (status.isDirectory()){
         System.out.println(status.getPath().getName() + " 是文件夹");
       }else {
         System.out.println(status.getPath().getName() + " 是文件");
       }
     }
   }

3.2.7 重命名且具有剪切的作用

   //重命名,而且具有剪切的功用。文件的移动和重命名。
   public void moveRename() throws URISyntaxException, IOException, InterruptedException {
     //1:获取FileSystem(散布式文件体系)
     FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop10:8020"), new Configuration(),"root");
​
     //2、移动重命名操作
     boolean b = fileSystem.rename(new Path("/bb/test1.txt"), new Path("/bb/cc/test1.txt"));
     System.out.println(b);
​
     //3、封闭FileSystem
     fileSystem.close();
   }

3.2.8 文件追加内容

//注意导包的时分别错了,是 import org.apache.commons.io.IOUtils; //文件的追加
   public void appendFile() throws URISyntaxException, IOException, InterruptedException {
     //1:获取FileSystem(散布式文件体系)
     FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop10:8020"), new Configuration(),"root");
​
     //2、追加操作
     BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream("D:\input\test3.txt"));
     FSDataOutputStream outputStream = fileSystem.append(new Path("/bb/cc/wordcount.txt"));
     IOUtils.copy(inputStream,outputStream);
​
     //3、封闭FileSystem
     IOUtils.closeQuietly();
     fileSystem.close();
   }

3.2.9 删去文件或文件夹

   //删去文件或目录
   public void deleteFileOrDir() throws URISyntaxException, IOException, InterruptedException {
     //1:获取FileSystem(散布式文件体系)
     FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop10:8020"), new Configuration(),"root");
​
     //2、删去操作
     //boolean b = fileSystem.delete(new Path("/test_big.txt"));
     boolean b = fileSystem.delete(new Path("/aa"));
     System.out.println(b);
​
     //3、封闭FileSystem
     fileSystem.close();
   }

3.3 兼并小文件

3.3.1 兼并下载:经过指令办法:

在根目录下面新建一个文件夹

hadoop fs -mkdir -p /test 

讲test1.txt和test2.txt移动到/test文件夹下面

[root@hadoop0 data]# hadoop fs -mv  /test1.txt /test 
[root@hadoop0 data]# hadoop fs -mv  /test2.txt /test 

经过getmerge指令兼并下载文件到当前目录下面:

[root@hadoop0 data]# hadoop fs -getmerge /test/*.txt ./test_merge.txt
[root@hadoop0 data]# ll
total 8
-rw-r--r--. 1 root root 36 Jun 24 19:50 test2.txt
-rw-r--r--. 1 root root 74 Jun 24 20:34 test_merge.txt
[root@hadoop0 data]# cat test_merge.txt 
hello world
hello hadoop
hello hbasehello world
hello hive
hello flume[root@hadoop0 data]#

3.3.2 兼并上传:经过Java API办法

   /**
   * 小文件的兼并上传
   * @throws URISyntaxException
   * @throws IOException
   * @throws InterruptedException
   */
   public void mergeFileUpload() throws URISyntaxException, IOException, InterruptedException {
     //1:获取FileSystem(散布式文件体系)
     FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop0:8020"), new Configuration(),"root");
​
     //2:获取hdfs大文件的输出流
     FSDataOutputStream outputStream = fileSystem.create(new Path("/test_big.txt"));
​
     //3:获取一个本地文件体系
     LocalFileSystem localFileSystem = FileSystem.getLocal(new Configuration());
​
     //4:获取本地文件夹下一切文件的详情
     FileStatus[] fileStatuses = localFileSystem.listStatus(new Path("D:\input"));
​
     //5:遍历每个文件,获取每个文件的输入流
     for (FileStatus fileStatus : fileStatuses) {
       FSDataInputStream inputStream = localFileSystem.open(fileStatus.getPath());
​
       //6:将小文件的数据复制到大文件
       IOUtils.copy(inputStream, outputStream);
       IOUtils.closeQuietly(inputStream);
     }
​
     //7:封闭流
     IOUtils.closeQuietly(outputStream);
     localFileSystem.close();
     fileSystem.close();
   }
​

其实3.3.1 也能够运用Java API的办法进行操作,同学们先自己思考一下。

3.4 必要性装备弥补

3.4.1 控制台日志打印等级设置

在 resources下面新建log4j.properties 文件,然后装备如下:

log4j.rootLogger=INFO, stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n 
log4j.appender.logfile=org.apache.log4j.FileAppender 
log4j.appender.logfile.File=target/spring.log 
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout 
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

3.4.2 hdfs的副本个数优先级设置之 resources下面装备文件

在 resources下面新建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.4.3 页面删去文件的时分报错解决计划

大数据生态圈及分布式文件系统HDFS实践-part2

计划一: 到shell窗口中给对应的目录加权限

[root@hadoop10 data]# hdfs dfs -chmod -R 777 /wcout0909

然后就能够在页面上点击删去按钮直接删去

计划二:

在Hadoop的装备文件core-site.xml中添加如下装备:

<!-- 当前用户全设置成root,便利学习 -->
<property>
    <name>hadoop.http.staticuser.user</name>
    <value>root</value>
</property><!-- 封闭权限检查 -->
<property>
    <name>dfs.permissions.enabled</name>
    <value>false</value>
</property>

3.4.4 在页面中上传文件犯错

大数据生态圈及分布式文件系统HDFS实践-part2

shell窗口中给对应的目录加权限

[root@hadoop10 data]# hdfs dfs -chmod -R 777 /aa

然后再次选择对应的文件夹下面选择对应的文件上传就能够了。