Hadoop数据存储及管理

简介: Hadoop数据存储及管理

一、分布式文件存储面临的挑战

1

2

3

4

5

6

7

8

9

10

11

12

13

14

1.海量数据存储问题

采用多台服务器,支持横向扩展

 

2.海量数据问题查询便捷问题

使用元数据记录文件和机器的位置信息

 

3.大文件传输效率慢问题

分块存储,分别存储在多台机器上,并行操作提高效率

 

4.数据丢失问题

冗余存储,多副本机制

 

5.解决用户查询视角统一规整问题

可以报分布式文件系统的元数据记录抽象为统一的目录树结构,类似传统的操作系统

二、HDFS应用场景

1

2

3

4

5

6

7

8

9

10

适合场景

1.主要以流式读取数据,主要用于批处理,相较于数据访问的反应时间,更注重数据访问的吞吐量

2.HDFS支持大文件,典型的文件大小是GB到TB级别

3.HDFS对文件的要求是 write-one-read-many访问模型,一个文件一旦创建、写入、关闭之后就不需要修改了

 

不适合场景

1.小文件

2.数据交互式访问

3.频繁任意修改

4.低延迟处理

三、HDFS特性

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

1.主从架构

HDFS采用master/slave架构。一般一个HDFS集群是有一个Namenode和一定数目的Datanode组成。Namenode是HDFS主节点,Datanode是HDFS从节点,两种角色各司其职,共同协调完成分布式的文件存储服务

Namenode:管理文件系统元数据信息

Datanode:负责数据存储

 

2.分块存储

HDPS中的文件在物理上是分块存储(block)的,块的大小可以通过配置参数来规定,参数位于hdfs-default.xml中: dfs.blocksize。默认大小是128M (134217728)

 

3.副本机制

文件的所有block都会有副本,默认值为3(3副本)。每个文件的block大小(dfs.blocksize)和副本系数(dfs.replication)都是可配置的。副本系数可以在文件创建的时候指定,也可以在之后通过命令改变

 

4.namespace

HDFS支持传统的层次型文件组织结构。用户可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似∶用户可以创建、删除、移动或重命名文件。

Namenode负责维护文件系统的namespace名称空间,任何对文件系统名称空间或属性的修改都将被Namenode记录下来。

 

5.元数据管理

在HDFS中,Namenode管理的元数据具有两种类型:

文件自身属性信息

    文件名称、权限,修改时间,文件大小,副本数,数据块大小。

文件块位置映射信息

    记录文件块和DataNode之间的映射信息,即哪个块位于哪个节点上。

 

6.数据块存储

文件的各个block的具体存储管理由DataNode节点承担。每一个block都可以在多个DataNode上存储 

四、HDFS Shell CLI使用

参考:https://hadoop.apache.org/docs/r3.1.4/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html

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

1.创建目录

hdfs dfs -mkdir /{source,common,workspace,tmp,warehouse} #如果是非/目录,可以添加-p地柜创建

hdfs dfs -ls /   #-h 适合人类查看的格式  -R 递归查看 

 

2.上传文件

hddoop fs -put [-f] [-p] <localsrc> <dst> # -f 强制覆盖  -p 保留访问和修改时间,所有权和权限  localsrc 本地文件系统 dst HDFS

hadoop fs -mkdir -p /source/weibo/star/comment_log/20221227_hdp01.dialev.com

hadoop fs -put caixukun.csv /source/weibo/star/comment_log/20221227_hdp01.dialev.com/

hadoop fs -ls -h /source/weibo/star/comment_log/20221227_hdp01.dialev.com/

Found 1 items

-rw-r--r--   2 root supergroup      2.4 M 2022-12-27 13:40 /source/weibo/star/comment_log/20221227_hdp01.dialev.com/caixukun.csv

 

hddoop fs -moveFromLocal  #和put类似,但是上传完成后文件会被删除

 

3.查看文件

hadoop fs -cat <src>  #读取文件全部内容显示再标准输出控制台,大文件慎重

hadoop fs -head <file> #查看文件前1KB内容

hadoop fs tail [-f] <file>  #查看文件最后1KB内容

 

4.下载文件

hadoop fs -get [-f] [-p] <src> <localdst>  #从HDFS下载文件 -f 覆盖本地已存在目录   -p 保留访问和修改时间,所有权和权限

hadoop fs -getmerge [nl] [-skip-empty-file] <src> <localdst>  #下载多个文件到本地合成成一个文件 -nl 每个文件末尾添加换行符

 

5.追加数据到文件

hadoop fs -appendToFile <localsrc> <dst>  #如果dst不存在则创建,如果未-则表示从标准输入中获取

 

6.查看磁盘空间大小

hadoop fs -df [h] <path>  #显示文件系统容量即使用大小

hadoop fs -du -s -h <path> # -s显示指定路径文件长度的汇总摘要

 

7.文件移动

hadoop fs -mv [-f]  <src> <localdst>

 

8.修改指定文件副本个数

hadoop fs -setrep [-R] [-w] <rep> <path>  # -w 命令行等待副本修改完毕,时间可能会比较长

hdfs hadoop 命令区别

1

2

3

hdfs  dfs options(只能操作HDFS系统相关包括local FS)

hadoop fs  optinos(任意操作系统)

https://hadoop.apache.org/docs/r3.1.4/hadoop-project-dist/hadoop-common/FileSystemShell.html

Java Cli API  

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

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

Configuration 配置对象类,用于加载或设置参数属性

FileSystem  文件系统对象基类。针对不同文件系统有不同具体实现。该类封装了文件系统的相关操作方法。

 

1.pom.xml文件

<?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">

    <modelVersion>4.0.0</modelVersion>

 

    <groupId>com.dialev.hadoop</groupId>

    <artifactId>example-hdfs</artifactId>

    <version>1.0-SNAPSHOT</version>

 

    <properties>

        <maven.compiler.source>8</maven.compiler.source>

        <maven.compiler.target>8</maven.compiler.target>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    </properties>

    <dependencies>

        <dependency>

            <groupId>org.apache.hadoop</groupId>

            <artifactId>hadoop-common</artifactId>

            <version>3.1.4</version>

        </dependency>

        <dependency>

            <groupId>org.apache.hadoop</groupId>

            <artifactId>hadoop-client</artifactId>

            <version>3.1.4</version>

        </dependency>

        <dependency>

            <groupId>org.apache.hadoop</groupId>

            <artifactId>hadoop-hdfs</artifactId>

            <version>3.1.4</version>

        </dependency>

        <dependency>

            <groupId>junit</groupId>

            <artifactId>junit</artifactId>

            <version>4.13</version>

        </dependency>

    </dependencies>

 

    <build>

        <plugins>

            <plugin>

                <groupId>org.apache.maven.plugins</groupId>

                <artifactId>maven-compiler-plugin</artifactId>

                <version>3.1</version>

                <configuration>

                    <source>1.8</source>

                    <target>1.8</target>

                </configuration>

            </plugin>

        </plugins>

    </build>

</project>

===============================================================================================================

2.HDFSClientTest.java文件

package com.dialev.hadoop;

 

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.yarn.webapp.hamlet2.Hamlet;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

 

import java.io.IOException;

 

public class HDFSClientTest {

    private static Configuration conf = null;

    private static FileSystem fs = null;

 

    @Before

    public void connect2HDFS() throws IOException {

        // 创建配置对象实例

        conf = new Configuration();

 

        // 设置连接用户,默认为当前登录用户

        System.setProperty("HADOOP_USER_NAME","root");

 

        // https://github.com/steveloughran/winutils 下载winutils到 C:/windows/system32 下,下载Hadoop到本地将HADOOP_HOME指向解压的目录

        System.setProperty("HADOOP_HOME","D:\\hadoop-3.1.4");

 

        // 设置操作的文件系统是HDFS 并指定HDFS地址 键值对为core-site.xml中fs.defaultFS配置

        conf.set("fs.defaultFS""hdfs://192.168.1.131:8020");

 

        // 创建FileSystem对象实例

        fs = FileSystem.get(conf);

    }

 

    @Test

    public void mkdir() throws IOException {

        if (! fs.exists(new Path("/test"))){

            fs.mkdirs(new Path("/test"));

        }

    }

 

    @Test

    public void getFile2Local() throws IOException {

        Path src = new Path("/bowen/yarn-env.sh");

        Path dst = new Path("C:\\Users\\kaluomei\\Desktop\\yarn-env.sh");

 

        fs.copyToLocalFile(src,dst);

    }

 

 

    @Test

    public void putFile2HDFS() throws IOException {

        Path src = new Path("C:\\Users\\kaluomei\\Desktop\\安装部署手册.docx");

        Path dst = new Path("/bowen/安装部署手册.docx");

        fs.copyFromLocalFile(src,dst);

    }

 

    @After

    public void close() throws IOException {

 

        // 判断文件系统是否初始化

        if (fs != null) {

            fs.close();

        }

    }

}

五、webHDFS  

1

2

3

4

5

6

7

8

9

FileSystem URIs vs HTTP URLs

·

WebHDFS的文件系统schema为webhdfs://。URL格式为:

webhdfs://<HOST>:<HTTP_PORT>/<PATH>

效果相当于hdfs://<HOST>:<RPC_PORT>/<PATH>在RESTful风格的API中,相应的HTTP URL格式:

http://<HOST>:<HTTP_PORT>/webhdfs/v1/<PATH>?op=... #op后面参数是需要执行的动作

示例:http://192.168.1.131:50070/webhdfs/v1/?op=LISTSTATUS

http://192.168.1.131:50070/webhdfs/v1/bowen/t1.txt?op=OPEN&noredirect=false  #noredirect指定是否从定向到datanode节点,以设置不跳转,返回一个datanode的链接

参数参考文档:https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/WebHDFS.html 

六、httpFS(HDFS网关代理) 

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

client (http)--> httpFS  (WebHTTP)--> HDFS

 

HttpFS本身是Java Web应用程序。使用内置的Jetty服务器对外提供服务。

HttpFS是一个独立于HDFS的服务。本质上是一个代理服务。

 

 

1.开启

core-site.xml 添加

<property>

    <name>hadoop.proxyuser.root.hosts</name>  # root.hosts为服务器上用户

    <value>*</value>

</property>

<property>

    <name>hadoop.proxyuser.root.groups</name> #root.groups同上

    <value>*</value>

</property>

2.同步配置并重启

hdfs --daemon start httpfs

3.访问

http://192.168.1.131:14000/static/index.html  #默认14000端口 /static/index.html 为主页

 

Namec                 Descriptione

/conf                 Display configuration properties

/jmx                  Java JMX management interfacee

/logLevel              Get or set log level per classe

/logs                  Display log filese

/stacks                Display JVM stackse

/static/index.htmle     The static home pagee

 

 

4.默认访问401,需要认证

http://192.168.1.131:14000/static/index.html?user.name=root

http://192.168.1.131:14000/webhdfs/v1?user.name=root&op=LISTSTATUS  #使用方法和webhdfs类似,但是更安全和高效 

七、HDFS存储

7.1 存储类型  

1

2

3

4

RAM_DISK(内存)

SSD(固态)

DISK(机械,默认使用)

ARCHIVE(高密度存储介质,存储历史数据)

7.2 存储类型配置  

1

2

3

4

5

6

7

8

配置属性时主动声明。HDFS并没有自动检测的能力。

配置参数dfs.datanode.data.dir = [SSD]file://grid/dn/ssdO

如果目录前没有带上[SSD][DISK] [ARCHIVE][RAM_DISK ]这4种类型中的任何一种,则默认是DISK类型。

vim core-site.xml

    <property>

        <name>hadoop.tmp.dir</name>

        <value>/Hadoop/tmp</value>

    </property>

7.3 查看当前存储类型

访问http://192.168.1.131:50070/dfshealth.html#tab-datanode ,点击任意datanode节点查看StorageType字段

7.4 存储策略  

1

2

3

4

5

6

7

8

HOT(默认,所有副本都存储在DISK中)

COLD(所有副本存储再ARCHIVE中)

WARM(一部分在DISK,一部分在ARCHIVE)

ALL_SSD(所有副本都存储到SSD)

ONE_SSD(只存储1个副本到SSD,其余存储到DISK中)

LAZY_PERSIST(仅限于单副本块,先存储到RAM_DISK,延迟报错到DISK中)

 

前三种根据冷热数据区分,后三种根据磁盘性质区分。

7.5 查看和设置存储策略  

1

2

3

4

1.hdfs storagepolicies -listPolicies   #查看存储策略

2.hdfs storagepolicies -setStoragePolicy -path <path> -policy <policy>   # 设置存储策略,path 引用目录或文件的路径  policy 存储策略名称

3.hdfs storagepolicies -unsetStoragePolicy -path <path> # 取消存储策略,取消后该路径将使用父目录存储策略,如果父目录为/,则策略为HOT

4.hdfs storagepolicies -getStoragePolicy -path <path> # 查看路径存储策略

7.6 示例  

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

1.修改datanode存储类型及路径

    vim hdfs-site.xml

    // 修改前

    <property>

        <name>dfs.datanode.data.dir</name>

        <value>/Hadoop/data</value>

    </property>

    

    //修改后

    <property>

        <name>dfs.datanode.data.dir</name>

         <value>[DISK]file:///mnt/data/datanode,[ARCHIVE]file:///mnt/data/archive</value>  

    </property>

 

同步配置(每个datanode也可以根据实际情况单独配置)

重启服务

stop-dfs.sh

start-dfs.sh

访问http://192.168.1.131:50070/dfshealth.html#tab-datanode ,点击任意datanode节点查看StorageType字段

 

2.创建测试目录

hadoop fs -mkdir -p /data/{hot,warm,cold}

 

3.分别设置三个目录存储策略

hdfs storagepolicies -setStoragePolicy -path /data/hot  -policy HOT

hdfs storagepolicies -setStoragePolicy -path /data/warm  -policy WARM

hdfs storagepolicies -setStoragePolicy -path /data/cold  -policy COLD

hdfs storagepolicies -getStoragePolicy -path /data/hot

 

4.上传测试文件(文件任意)

hadoop fs -put anaconda-ks.cfg /data/hot

hadoop fs -put anaconda-ks.cfg /data/warm

hadoop fs -put anaconda-ks.cfg /data/cold

 

5.验证结果

hdfs fsck /data/hot/anaconda-ks.cfg -files -blocks -locations  #查看HOT储存

......

/data/hot/anaconda-ks.cfg 1290 bytes, replicated: replication=2, 1 block(s):  OK  #总共两个副本

0. BP-631728325-192.168.1.131-1672044003397:blk_1073741941_1117 len=1290 Live_repl=2  [DatanodeInfoWithStorage[192.168.1.132:9866,DS-9e039269-bed9-42a5-a79a-3a3b1bf2ab0a,DISK], DatanodeInfoWithStorage[192.168.1.131:9866,DS-1be7b9ec-cc5e-406a-bb35-cb0dc56fc5e2,DISK]]  #HOT存储两个副本都存储在DISK上

......

 

 

hdfs fsck /data/warm/anaconda-ks.cfg -files -blocks -locations  #查看WARM储存

......

/data/warm/anaconda-ks.cfg 1290 bytes, replicated: replication=2, 1 block(s):  OK

0. BP-631728325-192.168.1.131-1672044003397:blk_1073741942_1118 len=1290 Live_repl=2  [DatanodeInfoWithStorage[192.168.1.132:9866,DS-ecfa1d69-9ae6-4bda-862f-593c74b9159e,ARCHIVE], DatanodeInfoWithStorage[192.168.1.131:9866,DS-1be7b9ec-cc5e-406a-bb35-cb0dc56fc5e2,DISK]] #WARM存储两个副本一个在DISK上,一个在ARCHIVE上

 

 

hdfs fsck /data/cold/anaconda-ks.cfg -files -blocks -locations  #查看COLD储存

......

/data/cold/anaconda-ks.cfg 1290 bytes, replicated: replication=2, 1 block(s):  OK

0. BP-631728325-192.168.1.131-1672044003397:blk_1073741943_1119 len=1290 Live_repl=2  [DatanodeInfoWithStorage[192.168.1.131:9866,DS-499f93c3-61cc-40fb-9c7d-fc81ec773cb3,ARCHIVE], DatanodeInfoWithStorage[192.168.1.133:9866,DS-dc7ea5ce-4dfd-4b4f-a8db-3c465a479670,ARCHIVE]] #COLD存储两个副本都存储在ARCHIVE上

......

7.7 HDFS内存存储策略支持--LAZY PERSIST介绍  

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

HDFS支持把数据写入由DataNode管理的堆外内存;

DataNode异步地将内存中数据刷新到磁盘,从而减少代价较高的磁盘I0操作,这种写入称为 Lazy Persist写入。

 

1.配置虚拟内存盘(无法直接写入内存,需要借助tmpfs技术)

mount -t tmpfs -o size=1g tmpfs /mnt/data/ram_disk

 

2.创建测试目录

hadoop fs -mkdir -p /data/ram_disk

 

3.配置目录存储策略

    vim hdfs-site.xml

    <property>

        <name>dfs.datanode.data.dir</name>

         <value>[DISK]file:///mnt/data/datanode,[ARCHIVE]file:///mnt/data/archive,[RAM_DISK]file:///mnt/data/ram_disk</value>  

    </property>

    <!-- 开启异构存储策略 -->

    <property>

        <name>dfs.storage.policy.enabled</name>

        <value>true</value>

    </property>

    <property>

        <!-- 开启缓存,单位字节,配置值根据ulimit -l数值*1024,该值如果过小可能存储回写入到磁盘而不是内存-->

        <name>dfs.datanode.max.locked.memory</name>

        <value>65536</value>

    </property>

    <!-- 不开启文件权限 -->

    <property>

        <name>dfs.permissions</name>

        <value>false</value>

    </property>

 

    

4.上传目录设置存储策略

hdfs storagepolicies -setStoragePolicy -path  /data/ram_disk  -policy LAZY_PERSIST   #注意此处 path 路径为HDFS路径,配置文件为本地路径

    

扩展命令:   

  hdfs dfs -mv <src>  <dst>

   

  

相关实践学习
块存储快速入门
块存储是阿里云为云服务器ECS提供的块设备产品。通过体验挂载数据盘、分区格式化数据盘(Linux)、创建云盘快照、重新初始化数据盘、使用快照回滚云盘和卸载数据盘等功能,带您快速入门块存储。
相关文章
|
4月前
|
存储 分布式计算 监控
Hadoop冗余数据存储
【4月更文挑战第13天】Hadoop的HDFS分布式文件系统通过数据块划分、冗余存储(副本创建)和多样化存储类型提升可靠性与扩展性。NameNode监控副本数量,确保数据安全。使用数据压缩算法节省空间,数据本地化优化提高效率。支持并行处理,实现高效大规模数据处理。
51 1
|
4月前
|
存储 分布式计算 Hadoop
[hadoop3.x]HDFS存储策略和冷热温三阶段数据存储(六)概述
[hadoop3.x]HDFS存储策略和冷热温三阶段数据存储(六)概述
104 0
|
存储 分布式计算 负载均衡
Hadoop生态系统中的数据存储技术:HDFS的原理与应用
Hadoop生态系统中的数据存储技术:HDFS的原理与应用
|
SQL 存储 数据库
Hive简介、什么是Hive、为什么使用Hive、Hive的特点、Hive架构图、Hive基本组成、Hive与Hadoop的关系、Hive与传统数据库对比、Hive数据存储(来自学习资料)
1.1 Hive简介 1.1.1   什么是Hive Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。 1.1.2   为什么使用Hive Ø  直接使用hadoop所面临的问题 人员学习成本太高 项目周期要求太短 MapReduce实现复杂查询逻辑开发难度太大   Ø  为什么要使用Hive 操作接口采用类SQ
26692 0
|
存储 分布式计算 Linux
基于Hadoop生态系统的一种高性能数据存储格式CarbonData(性能篇)
CarbonData在数据查询的性能表现比Parquet好很多,在写一次读多次的场景下非常适合使用;社区比较活跃,响应也很及时。目前官网发布版本1.3.0与最新的spark稳定版Spark2.2.1集成,增加了支持标准的Hive分区,支持流数据准实时入库等新特性,相信会有越来越多的项目会使用到。
3960 0
|
存储 编解码 分布式计算
|
1月前
|
存储 分布式计算 Hadoop
|
14天前
|
图形学 数据可视化 开发者
超实用Unity Shader Graph教程:从零开始打造令人惊叹的游戏视觉特效,让你的作品瞬间高大上,附带示例代码与详细步骤解析!
【8月更文挑战第31天】Unity Shader Graph 是 Unity 引擎中的强大工具,通过可视化编程帮助开发者轻松创建复杂且炫酷的视觉效果。本文将指导你使用 Shader Graph 实现三种效果:彩虹色渐变着色器、动态光效和水波纹效果。首先确保安装最新版 Unity 并启用 Shader Graph。创建新材质和着色器图谱后,利用节点库中的预定义节点,在编辑区连接节点定义着色器行为。
55 0

相关实验场景

更多