思考

  • 如何设计HDFS?
  • 首先明白HDFS是干嘛的?简单来说就是存数据的,所以有以下几点势必需要注意
  • 首先要能存大规模数据,TB级甚至PB级
  • 分布式系统容易出现故障,出现故障如何快速处理?
  • 一致性如何做的?这也是分布式系统的顽疾
  • Hadoop是如何做的?
  • 大文件被切分成block,将block存储在不同节点上,同时通过Namenode存储文件对应block信息
  • block做数据冗余,并且均衡分布在不同节点中,这样最大程度保证挂掉可以随时恢复

HDFS架构


flink写入hdfs时固定文件大小256_分布式

架构:主从架构

  • 组成部分
  • Namenode
  • 管事节点,所有请求都要先经过Namenode,存储HDFS元数据,处理client的请求,以及当datanode节点宕机时恢复和切换
  • DataNode
  • 干活的,存储数据
  • secondary Namenode
  • 不是namenode的备份,是二老板角色,替Namenode分担一些任务,进行元数据合并用,关键时刻Namenode挂了也可以顶上去,但是注意的是可能会存在数据丢失风险
  • HDFS Client
  • 将文件切分成block,进行上传
  • 向namenode发送请求和接受响应
  • 向datanode执行真正的读写操作
  • 管理HDFS,可以格式化Namenode

元数据

有好多人好奇,到底元数据是什么?元数据就好比电话簿,存储的都是索引信息

元数据存储在哪?内存+磁盘,内存读取快,减少IO,但是挂了无法恢复,所以需要定期存到磁盘中,也就是内存满了然后刷到缓冲区,然后写到磁盘中,MySQL也是类似逻辑

内存元数据

  1. 目录树结构FileSystem
  2. 文件File和切换Block之间的映射数据,也就是File包含哪些个Block
  3. Block和节点之间的关系,也就是Block存储在那些个节点上

磁盘元数据

俺也一样,不过我还得存储DataNode数据


Hadoop优缺点

  • 高容错
  • 多个副本提高容错性,某一个挂了可以自动恢复
  • 适合处理大规模数据
  • 扩展性好,能存储TB PB级别的数据
  • 对机器要求低,机器差架不住我副本多呀
  • 一次写入,多次读取

缺点:

  • 数据访问延迟高,所以实时性要求高的数据可以考虑HBase ES等No SQL数据库
  • 不适合小文件存取
  • 太多小文件会占用过多的元数据空间,造成寻址时间长,读写效率都受影响。
  • 不支持并发写入,文件不能修改
  • 一个文件只能有一个写入着,想着并发写提高性能不存在
  • 不允许修改,敢情你还真把我当数据库了?当然了并不是严格意义上不允许,你可以修改源码呀(手动滑稽)
  • 过多小文件会给HDFS带来什么?
  • 首先元数据存储在Namenode中,存取大量小文件会消耗大量寻址时间,这是操作系统知识了,有兴趣同时可以翻翻操作系统中的磁盘寻址
  • 一个文件大小为10k,一亿个才1TB,但是Namenode内存占用就20G了
  • HDFS文件块设置
  • 块大小如何定义?
  • 老版本默认64M,新版本默认128m,可以通过配置dfs.blocksize调整
  • 为什么是这么大?
  • 显然是效率最高

flink写入hdfs时固定文件大小256_hadoop_02

HDFS Shell操作


flink写入hdfs时固定文件大小256_hdfs_03

常用参数介绍:


命令

功能

示例

-help

输出这个命令参数手册

hadoop -help hadoop fs -help hadoop fs -help Is

-Is

显示目录信息 这些参数中,所有的hdfs路径都可 以简写成hadoop fs -Is /等同上条 命令的效果

hadoop fs -Is hdfs://hadoop02:9000/

-mkdir

在hdfs上创建目录

hadoop fs -mkdir -p /aa/bb/cc/dd

-put

等同于copyFromLocal,进行文件 上传

hadoop fs -put /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2

-get

等同于copyToLocal ,hdfs文件下载到本地

hadoop fs -get /aaa/a.gz

-getmerge

合并下载多个文件

hdfs有多个文件:log.1, log.2,log.3,… hadoop fs -getmerge /aaa/丨og.* ./log.sum

-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 -「/aaa/bbb/

-rmdir

删除空目录

hadoop fs -rmdir /aaa/bbb/ccc

hadoop fs - moveFromLocal

moveFromLocal

从本地剪切到hdfs

/home/hadoop/a.txt /aa/bb/cc/dd

hadoop fs - moveToLocal

-moveToLocal

从hdfs剪切到本地

/aa/bb/cc/dd

U /home/hadoop/a.txt

-copyFromLocal

从本地文件系统中拷贝文件到hdfs 文件系统去

hadoop fs -copyFromLocal ./jdk.tar.gz /aaa/

-copyToLocal

从hdfs拷贝到本地

hadoop fs -copyToLocal /aaa/jdk.tar.gz

hadoop fs -appendToFile ./hello.txt hdfs://hadoop-

-appendToFile

細一个文件到已经細勺文件末尾

serverOI :9000/hello.txt hadoop fs -appendToFile ./hello.txt /hello.txt

-cat

显示文件内容

hadoop fs -cat /hello.txt

-tail

显示一个文件的末尾内容

hadoop fs -tail /web I og/a ccess」og. 1

-text

以字符形式打印一个文件的内容

hadoop fs -text /web I og/a ccess J og. 1

-chgrp -chmod

Linux文件系统中的用法样,对文 件所属权限

hadoop fs -chmod 666 /hello.txt hadoop fs -chown

-chown

someuser:somegrp /hello.txt

-df

统计文件系统的可用空间信息

hadoop fs -df-h /

-du

统计文件夹的大小信息

hadoop fs -du -s -h /aaa/*

-count

统计一个指定目录下的文件节点数量

hadoop fs -count /aaa/

HDFS API操作

这里简单讲一下,毕竟就是调用API操作

  • 搭建开发环境,推荐使用IDE
  • 引入依赖包
<dependency> 
    	<groupId>org.apache.hadoop</groupId>
    	<artifactId>hadoop-hdfs</artifactId>
    	<version>2.7.7</version> </dependency>
<dependency> 
    	<groupId>org.apache.hadoop</groupId> 
    	<artifactId>hadoop-client</artifactId> 
    	<version>2.7.7</version> 
</dependency> 
<dependency>
    	<groupId>org.apache.hadoop</groupId> 
    	<artifactId>hadoop-hdfs-client</artifactId>
    	<version>2.7.7</version> 
    	<scope>provided</scope> 
</dependency>
		<artifactId>hadoop-hdfs-client</artifactId>
    	<version>2.7.7</version> 
    	<scope>provided</scope> 
</dependency>