Hadoop学习-3-HDFS简介及Python操作HDFS

HDFS(分布式文件系统)

HDFS简介

  • 分布式文件系统解决大数据存储的问题,横跨多台计算机上的存储系统
  • 是一种能够在普通硬件上运行的分布式文件系统,高容错,适用于具有大数据集的应用程序
  • 提供统一的访问接口
  • 一次写入,多次读取;用于批处理,不是交互式的分析
  • 主要以流式读取数据
  • 适合场景:
    • 大文件
    • 流式读取
    • 高容错

HDFS架构

  • 一主多从(master/slave),一个namenode和一定数量的dataNode
    Hadoop学习-3-HDFS简介及Python操作HDFS_第1张图片

  • 分块存储

    • 物理上分块存储(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.enabledname>
      <value>truevalue>
    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.hostsname>
  <value>*value>
property>
<property>
	<name>hadoop.proxyuser.root.groupsname>
  <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.dirname>
      <value>[SSD]file:///pathvalue>
    property>
    
    
  • 块存储的类型选择策略

    • 对hdfs的数据块副本存储
    • 存储策略模式
      • HOT
        • 所有副本存储在DISK中
        • 用于存储和计算
      • COLD
        • 仅适用于计算量有限的存储,不使用的 数据从热存储放到冷存储中,所有副本都是在archive
      • WARM
        • 部分冷、部分热数据
        • 部分副本在DISK中,其余的在ARCHIVE中
      • ALL_SSD
        • 所有副本在SSD中
      • ONE_SSD
        • 一个副本存在SSD,其他的在DISK中
      • LAZY_PERSIST
        • 首先写入内存,后续延迟保存在DISK中
    • 设置存储策略

你可能感兴趣的:(Hadoop,hdfs,hadoop,大数据)