大数据开发工程师-第三周 Hadoop之HDFS的使用


第三周-Hadoop之HDFS的使用

第1章 HDFS介绍

假设让我们来设计一个分布式的文件系统,我们该如何设计呢?

Hm1DTe.png

1
这种设计架构会存在一个问题,假设同时过来很多人都需要租房子,那么一个二房东是忙不过来的,就会造成阻塞。

Hm3i11.png

1
2
3
4
现在这种设计是,我们去找一个中介公司,这里的主节点就可以理解为一个中介公司
这里的从节点就可以理解为是房源,中介公司会在每块房源都安排一个工作人员,当我们找房子的时候,先联系中介公司,中介公司会告诉我们哪里有房子,并且把对应工作人员的信息告诉我们,我们就可以直接去找对应的工作人员去租房子。这样对于中介公司而言,就没什么压力了。
中介公司只负责管理房源和工作人员信息,具体干活的是工作人员。
这样就算同时过来很多人,中介公司也是可以扛得住的,因为具体看房租房的流程是我们直接和工作人员联系的,不会造成阻塞。

HDFS设计思想

1
用户请求查看数据时候会请求主节点,主节点上面会维护所有数据的存储信息,主节点会把对应数据所在的节点信息返回给用户,然后用户根据数据所在的节点信息去对应的节点去读取数据,这样压力就不会全部在主节点上面。

HDFS(Hadoop Distributed File System)

1
2
3
4
Hadoop的 分布式文件系统
它是一种允许文件通过网络在多台主机上分享的文件系统,可以让多台机器上的多个用户分享文件和存储空间
其实分布式文件管理系统有很多,HDFS只是其中一种实现而已
HDFS是一种适合大文件存储的分布式文件系统,不适合小文件存储,什么叫小文件,例如,几KB,几M的文件都可以认为是小文件

HDFS的Shell介绍

1
针对HDFS,我们可以在shell命令行下进行操作,就类似于我们操作linux中的文件系统一样,但是具体命令的操作格式是有一些区别的 格式如下:

Hm8WdS.png

1
2
3
4
5
6
7
  使用hadoop bin目录的hdfs命令,后面指定dfs,表示是操作分布式文件系统的,这些属于固定格式。
如果在PATH中配置了hadoop的bin目录,那么这里可以直接使用hdfs就可以了
这里的xxx是一个占位符,具体我们想对hdfs做什么操作,就可以在这里指定对应的命令了
大多数hdfs 的命令和对应的Linux命令类似

HDFS的schema是hdfs,authority是集群中namenode所在节点的ip和对应的端口号,把ip换成主机名也是一样的,path是我们要操作的文件路径信息
其实后面这一长串内容就是core-site.xml配置文件中fs.defaultFS属性的值,这个代表的是HDFS的地址。

第2章 HDFS基础操作

HDFS的常见Shell操作

管理命令

操作命令

1
2
3
4
5
6
7
8
9
10
11
12
13
1.-ls [-R]:查询指定路径信息

首先看第一个ls命令
查看hdfs根目录下的内容,什么都不显示,因为默认情况下hdfs中什么都没有

[root@bigdata01 hadoop-3.2.0]# hdfs dfs -ls hdfs://bigdata01:9000/
其实后面hdfs的url这一串内容在使用时默认是可以省略的,因为hdfs在执行的时候会根据HDOOP_HOME自动识别配置文件中的fs.defaultFS属性
所以这样简写也是可以的

[root@bigdata01 hadoop-3.2.0]# hdfs dfs -ls /
[root@bigdata01 hadoop-3.2.0]#

想要递归显示所有目录的信息,可以在ls后面添加-R参数
1
2
3
2.-put:从本地上传文件
直接上传到hdfs的根目录即可
[root@bigdata01 hadoop-3.2.0]# hdfs dfs -put README.txt /
1
2
3
4
5
6
3.-cat:查看HDFS文件内容

4.-get:下载文件到本地
[root@bigdata01 hadoop-3.2.0]# hdfs dfs -get /README.txt .
注意:这样执行报错了,提示文件已存在,我这条命令的意思是要把HDFS中的README.txt下载当前目录中,但是当前目录中已经有这个文件了,要么换到其它目录,要么给文件重命名
[root@bigdata01 hadoop-3.2.0]# hdfs dfs -get /README.txt README.txt.bak
1
2
5.-mkdir [-p]:创建文件夹
如果要递归创建多级目录,还需要再指定-p参数
1
2
3
4
5
6
6.-rm [-r]:删除文件/文件夹
删除目录,注意,删除目录需要指定-r参数
如果是多级目录,可以递归删除吗?可以

[root@bigdata01 hadoop-3.2.0]# hdfs dfs -rm -r /abc
Deleted /abc

HDFS案例实操

1
2
3
4
5
6
7
8
9
10
11
12
13
14
需求:统计HDFS中文件的个数和每个文件的大小
1:统计根目录下文件的个数
[root@bigdata01 hadoop-3.2.0]# hdfs dfs -ls / |grep /| wc -l
注:wc -l 是打印换行符
2:统计根目录下每个文件的大小,最终把文件名称和大小打印出来
[root@bigdata01 hadoop-3.2.0]# hdfs dfs -ls / |grep / | awk '{print $8,$5}'
/LICENSE.txt 150569
/NOTICE.txt 22125
/README.txt 1361

[root@bigdata01 my_shell]# hdfs dfs -ls / | grep ^- | awk '{print $8,$5}'
/for1.sh 48
/hello.txt 59
/if1.sh 108

第3章 java操作HDFS

Java代码操作HDFS

1
2
3
前面我们学习了在shell命令行下操作hdfs,shell中操作hdfs是比较常见的操作,但是在工作中也会遇到一些需求是需要通过代码操作hdfs的,下面我们就来看一下如何使用java代码操作hdfs
在具体操作之前需要先明确一下开发环境,代码编辑器使用idea,当然了eclipse也可以
在创建项目的时候我们会创建maven项目,使用maven来管理依赖,是比较方便的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package com.imooc.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
* Java代码操作HDFS
* 文件操作:上传文件、下载文件、删除文件
* Created by xuwei
*/
public class HdfsOp {
public static void main(String[] args) throws Exception{
System.setProperty("HADOOP_USER_NAME", "root");
//创建一个配置对象
Configuration conf = new Configuration();
//指定HDFS的地址
conf.set("fs.defaultFS","hdfs://bigdata01:9000");
//获取操作HDFS的对象
FileSystem fileSystem = FileSystem.get(conf);
//上传文件
//put(fileSystem);

//下载文件
//get(fileSystem);

//删除操作
delete(fileSystem);
}

/**
* 文件和文件夹都可以删除,true代表递归删除多层文件夹
* @param fileSystem
* @throws IOException
*/
private static void delete(FileSystem fileSystem) throws IOException {
boolean flag = fileSystem.delete(new Path("/user"));
if(flag){
System.out.println("删除成功!");
}else{
System.out.println("删除失败!");
}
}

private static void get(FileSystem fileSystem) throws IOException {
//HDFS输入流
FSDataInputStream fis = fileSystem.open(new Path("/user2.txt"));
//本地输出流
FileOutputStream fos = new FileOutputStream("D:\\user3.txt");
//下载文件
IOUtils.copyBytes(fis,fos,1024,true);
}

private static void put(FileSystem fileSystem) throws IOException {
//获取HDFS文件系统的输出流
FSDataOutputStream fos = fileSystem.create(new Path("/user2.txt"));
//获取本地文件的输入流
FileInputStream fis = new FileInputStream("D:\\user.txt");

//上传文件:通过工具类把输入流拷贝到输出流里面,实现本地文件上传到HDFS
IOUtils.copyBytes(fis,fos,1024,true);
}

}

HDFS体系结构

1
2
3
4
  前面我们掌握了HDFS的基本使用,下面我们来详细分析一下HDFS深层次的内容
HDFS支持主从结构,主节点称为 NameNode ,是因为主节点上运行的NameNode进程,NameNode支持多个,目前我们的集群中只配置了一个
从节点称为 DataNode ,是因为从节点上面运行的有DataNode进程,DataNode支持多个,目前我们的集群中有两个
HDFS中还包含一个 SecondaryNameNode 进程,这个进程从字面意思上看像是第二个NameNode的意思,其实不是,一会我们会详细分析。

HMxWSH.png


本文标题:大数据开发工程师-第三周 Hadoop之HDFS的使用

文章作者:TTYONG

发布时间:2022年02月05日 - 10:02

最后更新:2023年06月09日 - 16:06

原始链接:http://tianyong.fun/%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88-%E7%AC%AC%E4%B8%89%E5%91%A8%20Hadoop%E4%B9%8BHDFS%E7%9A%84%E4%BD%BF%E7%94%A8.html

许可协议: 转载请保留原文链接及作者。

多少都是爱
0%