HDFS(分布式文件系统)
HDFS简介
- 分布式文件系统解决大数据存储的问题,横跨多台计算机上的存储系统
- 是一种能够在普通硬件上运行的分布式文件系统,高容错,适用于具有大数据集的应用程序
- 提供统一的访问接口
- 一次写入,多次读取;用于批处理,不是交互式的分析
- 主要以流式读取数据
- 适合场景:
- 大文件
- 流式读取
- 高容错
HDFS架构
- 一主多从(master/slave),一个namenode和一定数量的dataNode
- 分块存储
- 物理上分块存储(block),HDFS中block中默认为128M(dfs.blocksize参数设置)
- 副本机制
- HDFS最好为3副本,dfs.replication参数设置
- namespace(命名空间)
- 可以创建目录树,类似于windows/linux文件系统中的目录
- 可以进行创建、删除、移动等操作
- 提供统一的抽象目录树
- 元数据管理
- 两种类型
- 文件自身属性:名称、权限、大小等
- 文件块位置映射信息:文件块与dataNode之间的映射信息(文件块位于哪个节点)
- dataNode负责数据块的存储
python操作HDFS
python连接HDFS
- Hdfs-site.xml文件配置, 否则无法访问webhdfs
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
- 安装hdfs三方库,
pip install hdfs
- 连接hdfs
import hdfs
# 创建客户端
hdfs_client = hdfs.client.InsecureClient(
url="http://node-01:9870" # hdfs web url
user='root',
root='/' # 根目录
)
- python操作hdfs的函数(方法)
hdfs_client.list('hdfs_path') # 查看文件
hdfs_client.makedirs('hdfs_path') # 创建文件夹
hdfs_client.delete('hdfs_path') # 删除文件夹
hdfs_client.upload('hdfs_path', 'local_path') # 上传文件
hdfs_client.down_load('hdfs_path', 'local_path') # 下载文件
hdfs_client.read('hdfs_path') # 读取文件
hdfs_client.write('hdfs_path', data, overwrite=True/False) # 写入文件(清空写入、追加)
hdfs_client.set_replication('hdfs_file_path', 2) # 修改文件副本数
hdfs_client.set_permission('hdfs_file_path', permission_info) # 修改文件权限
hdfs_client.rename(old_path, new_path) # 修改名称
hdfs_client.walk('hdfs_path') # 遍历文件夹
- python操作HDFS底层原理就是使用http协议操作HDFS
HDFS http协议访问
- 访问
http://master_node:9870/
基于REST的代理服务(httpFs)
- HttpFS是一个提供restFul接口的网关的服务器,支持所有HDFS文件系统的操作
- 对于文件CURD的操作提交给HttpFS服务进行中转,然后由HttpFS去跟HDFS集群交互
- 本质是一个代理服务,底层通过映射到hdfs的Http restful api调用实现的
- 配置HttpFS
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
- 启动httpfs
hdfs --daemon start httpfs
- 访问httpfs
http://node-01:14000/static/index.html
http://node-01:14000/webhdfs/v1?op=&user.name=root
Hadoop文件存储格式
- 从实际操作上面,hadoop可以存储任何格式的数据
- hadoop处理最多的都是文本数据
- orc文件,parquet、avro文件
行式存储和列式存储
- 行式存储
- 同一行的数据存储在一起
- 场景
- select * 查询
- 写入性能高
- 更新操作
- 列式存储
- 同一列的数据存储在一起
- 场景
- 数据计算
- 按列查询(查询部分字段)
丰富的文件存储格式
- text文本
- 纯文本格式,行式存储
- 不支持块级别压缩
- 易读性好
- sequence file
- 序列化文件,以key、value键值对进行序列化存储
- 支持record、block级别压缩,支持文件切分
- 通常作为中间数据存储格式
- avro file
- 基于行存储,文件中包含json格式的schema定义
- 支持切分、块压缩
- 适合于大量频繁写入的宽表数据,序列化和反序列化的性能很好
- RCFile
- 支持压缩、切分
- 行、列存储结合
- 不支持schema扩展,如果需要增加新列,需重写文件
- ORCFile
- 支持多种压缩方式,可切分
- 支持schema扩展
- 以二进制方式存储,不可以直接读取
- parquet File
- 面向分析型业务的列式存储
- 由行组、列块、页组成,支持块压缩
- 以二进制形式存储
- arrow
- 跨语言格式,是一种列式内存数据结构
- 主要用于构建数据系统
- 促进多组件之间的通信,缩减了通信时序列化、反序列化的时间
文件压缩格式
- hadoop支持的压缩格式
- defile
- gzip
- bzip2
- 支持文件切割
- lzo
- lz4
- snappy
HDFS异构存储和存储策略
- 冷、热、温、冻数据
- 异构存储
- 根据数据的冷热分区,存储在不同的介质上面
- 内存,ssd,hdd,archive(高密度存储介质)
- 需要修改文件存储路径,设置存储介质类型
<property>
<name>Dfs.datanode.data.dir</name>
<value>[SSD]file:///path</value>
</property>
<!--SSD, DISK, ARCHIVE, RAM_DISK-->
- 块存储的类型选择策略
- 对hdfs的数据块副本存储
- 存储策略模式
- HOT
- 所有副本存储在DISK中
- 用于存储和计算
- COLD
- 仅适用于计算量有限的存储,不使用的 数据从热存储放到冷存储中,所有副本都是在archive
- WARM
- 部分冷、部分热数据
- 部分副本在DISK中,其余的在ARCHIVE中
- ALL_SSD
- 所有副本在SSD中
- ONE_SSD
- 一个副本存在SSD,其他的在DISK中
- LAZY_PERSIST
- 首先写入内存,后续延迟保存在DISK中
- 设置存储策略