一,Hadoop生态圈
二、HDFS组件角色
2.1 NameNode(简称NN)
- HDFS元数据管理者,管理NameSpace(文件系统命名空间),记录文件是如何分割成数据块以及他们分别存储在集群中的哪些数据节点上。
- NameSpace或其本身属性的任何更改都由NameNode记录,维护整个文件系统的文件和目录。
2.2 DataNode(简称DN)
- DataNode是文件系统的工作节点。根据客户端或者NameNode发送的管理指令,负责HDFS的数据块的读写和检索操作。
- 通过心跳机制定期向NameNode发送他们的存储块的列表。
2.3 Client
- 客户端Client代表用户与NameNode或者DataNode交互来访问整个文件系统的对象。
- 开发人员面向Client API来编程实现,对NameNode、DataNode来说透明无感。
HDFS组件角色
3、HDFS架构设计
3.1读文件流程
详细步骤:
- 第一步:Client向NameNode发送数据请求后,寻找数据对应的数据块的位置信息。
- 第二步:NameNode返回文件对应的数据块元数据信息,如所属机器、数据块的block_id、数据块的先后顺序等。
- 第三步:由Client与DataNode直接通信,读取各个block数据块的信息。过程为并行读取,由客户端合并数据。
3.2写文件流程
详细步骤:
- 第一步:
- Client向NameNode发送写数据请求后,寻找可以写入的数据块block信息的机器位置。
- 若文件过大,写入可能会分成很多block数据块,实际上是通过一个block一个block的申请。
- 若副本为3,则每次请求后返回一个block的对应的3个副本的block的存放位置。
- 第二步:
- Client获取到对应的block数据块所处的DataNode节点位置后,Client开始写操作。
- Client先写入第一个DataNode,以数据包package的方式逐个发送和接收。如64K大小的package包大小来发送和接收。
- 存在多个副本时,package包的写入是依次进行的。写入到第一个DataNode后,第一个向第二个DataNode传输。第二个写完后,由第二个向第三个DataNode传输package。以此类推。
- 写完一个block数据块后,如果还有则反复进行第一步和第二步。
- 第三步:
- 待所有的数据块block均写完后,Client接收到全部写完的ack答复,告诉NameNode数据已写完,Client关闭socket流。
- DataNode也会向NameNode报告新增block数据块的信息。
四、pom引入依赖
<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.test.test</groupId>
<artifactId>TlHadoopCore</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<!-- 设置项目编码为 UTF-8 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 首先配置仓库的服务器位置,首选阿里云,也可以配置镜像方式,效果雷同 -->
<repositories>
<repository>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</repository>
</repositories>
<dependencies>
<!-- 引入hadoop-cli-2.7.4依赖 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>TlHadoopCore</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
五、HDFS问题
1.HDFS为何要将文件分成block块存储?
- 减少底层操作系统的IO读取时的寻址时间
- 方便更高效的流式读取,提高吞吐量
2.HDFS block块的默认大小时多少?
- dfs.blocksize为Hadoop定义block块大小的设置参数,在hdfs-site.xml中
- Hadoop2.2.x及以后版本均为128M
3.HDFS block块的大小是否可以更改?
- 可以修改
- 参数修改对以前的文件不起作用,对以后的文件起作用
- 也可针对上传文件临时修改,指定-D dfs.blocksize即可
4.一个block块文件是否可以存储多个文件数据?
- 一个block块文件不会跨文件存储
- 一个block块文件最多只会存储一个文件对应的数据
5.如果一个文件的大小,小于一个blocksize,那么它实际占用多大空间?
- 实际文件多大则占多大空间,但是占了一个block块的元数据空间大小
- 小文件越多,Hadoop NameNode的压力越大。故Hadoop的优势在于处理大文件数据,GB、TB甚至PB等。
6.HDFS block越大越好?还是越小越好?
- 越大则分块越少,则NameNode压力将减小,但并行的IO和处理能力降低
- 越小则分块越多,则NameNode处理压力越大,但因为寻址时间太久,不利于提高吞吐量
- 适中即可,一般采用官方的128M即可