HDFS(分布式文件系统)

HDFS简介
  • 分布式文件系统解决大数据存储的问题,横跨多台计算机上的存储系统
  • 是一种能够在普通硬件上运行的分布式文件系统,高容错,适用于具有大数据集的应用程序
  • 提供统一的访问接口
  • 一次写入,多次读取;用于批处理,不是交互式的分析
  • 主要以流式读取数据
  • 适合场景:
  • 大文件
  • 流式读取
  • 高容错
HDFS架构
  • 一主多从(master/slave),一个namenode和一定数量的dataNode
  • Python 如何从HDFS读取文件 python读取hdfs数据_大数据

  • 分块存储
  • 物理上分块存储(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中
  • 设置存储策略