HDFS的一些知识点记录


=Start=

缘由:

最近在看和 HDFS 相关的数据安全问题,了解到了一些之前不知道风险,在此过程中为了验证相关操作,简单配置学习了解了一下 Alluxio 和 Hadoop Shell命令 以及 WebHDFS REST API ,还有 Parquet 文件的查看方法,在此简单记录一下,方便后面有需要的时候参考和更新。

正文:

参考解答:

HDFS的内部数据安全风险很多,总的来看,对于内部监控来说,一方面是将本来限制在IDC内部才可访问的Hadoop相关系统通过WebHDFS等HTTP(S)形式的API对办公网或外部进行了开放,扩大了攻击面,这个需要从Web/API层面去做分析和监控预警;另一方面是安全认证/加密等措施执行不到位,导致攻击者只要获取到master/namenode等地址信息就可以直接通过alluxio/hadoop等客户端直连,然后通过文件拷贝等方式获取parquet文件从而拿到敏感数据完成攻击,这个需要从主机层的异常命令操作分析来监控预警相关风险。

Alluxio 部分

简单来说就是,Alluxio 让我们可以方便的在一个地方同时快速访问多个不同存储系统中的数据(为其上层数据驱动型应用提供统一的客户端API和全局命名空间)。

Alluxio 是世界上第一个面向基于云的数据分析和人工智能的开源的数据编排技术。它为数据驱动型应用和存储系统构建了桥梁,将数据从存储层移动到距离数据驱动型应用更近的位置从而能够更容易被访问。这还使得应用程序能够通过一个公共接口连接到许多存储系统。Alluxio内存至上的层次化架构使得数据的访问速度能比现有方案快几个数量级。

在大数据生态系统中,Alluxio 位于数据驱动框架或应用(如 Apache Spark、Presto、Tensorflow、Apache Hive 或 Apache Flink)和各种持久化存储系统(如 Amazon S3、Google Cloud Storage、OpenStack Swift、HDFS、IBM Cleversafe、EMC ECS、Ceph、NFS 、Minio和 Alibaba OSS)之间。Alluxio 统一了存储在这些不同存储系统中的数据,为其上层数据驱动型应用提供统一的客户端 API 和全局命名空间。

在当前的业务系统中我们会遇到多种多样的数据存储和读取场景。在对于大量数据(G以上级别)的存储和读取我们就基本会采用分布式文件系统比如 Amazon S3、Apache HDFS。目前为了系统的可用性和稳定性计算和存储往往是分开部署,在这样的背景下对于大数据的读写性能和兼容性就会成为很大的挑战。于是我们看到了一种解决方案 Alluxio。

Alluxio 快速上手
1. 下载 Alluxio

下载并解压对应文件,默认会在当前目录下创建一个名字类似 alluxio-2.9.3 的文件夹,这里将该文件夹所在的路径将简记为 ${ALLUXIO_HOME} 。

2. 配置 Alluxio

在${ALLUXIO_HOME}/conf目录下,根据模板文件创建 conf/alluxio-env.sh 配置文件。
$ cp conf/alluxio-env.sh.template conf/alluxio-env.sh

在 conf/alluxio-env.sh 文件中为 JAVA_HOME 增加配置.例如:
$ echo "JAVA_HOME=/path/to/java/home" >> conf/alluxio-env.sh

在${ALLUXIO_HOME}/conf目录下,根据模板文件创建conf/alluxio-site.properties配置文件。
$ cp conf/alluxio-site.properties.template conf/alluxio-site.properties

在 conf/alluxio-site.properties 文件中将 alluxio.master.hostname 设置为 localhost(也可根据实际需要指定为对应Alluxio的master节点的host:port地址)。
$ echo "alluxio.master.hostname=localhost" >> conf/alluxio-site.properties

3. 使用 Alluxio Shell

$ ./bin/alluxio fs
$ ./bin/alluxio fs ls /
$ ./bin/alluxio fs copyFromLocal LICENSE /LICENSE
$ ./bin/alluxio fs cat /LICENSE
Alluxio 提供的命令行接口

Alluxio命令行接口为用户提供了基本的文件系统操作,可以使用以下命令来得到所有子命令:

$ ./bin/alluxio fs

对于用Alluxio URI(如ls, mkdir)作为参数的fs子命令来说,参数应该要么是完整的Alluxio URI alluxio://<master-hostname>:<master-port>/<path>,要么是省略了头部信息的/<path>,以使用conf/alluxio-site.properties中设置的默认的主机名和端口。

#将"source path"指定的本地文件系统中的文件拷贝到Alluxio中"remote path"指定的路径 如果"remote path"已经存在该命令会失败
copyFromLocal "source path" "remote path"

#将"remote path"指定的Alluxio中的文件复制到本地文件系统中
copyToLocal "remote path" "local path"
Alluxio 常见问题

Q:Alluxio可以运行在哪些平台和Java版本上?
A:Alluxio可以在Linux / Mac的各种发行版上使用Java 1.8或更高版本运行。

Q:是否有简单的方法来查看群集的状态和运行状况?
A:是的,一旦安装好Alluxio,可以通过访问 http://master_ip:19999 的UI界面来查看。

Q:什么是底层存储系统?Alluxio支持多少种底层存储系统?
A:Alluxio 使用底层存储系统作为其持久化存储系统,当前支持 Amazon S3, Swift, GCS, HDFS以及很多其他存储系统。

Parquet 文件

数据的接入、处理、存储与查询,是大数据系统不可或缺的四个环节。随着数据量的增加,大家开始寻找一种高效的数据格式,来解决存储与查询环节的痛点。

  • 高效的压缩编码,用于降低存储成本
  • 高效的读取能力,用于支撑快速查询

Parquet便是在这样的背景下诞生,与text、json、csv等文件格式相比,它有三个核心特征,为解决上述的痛点问题提供了基础。

  • 列式存储
  • 自带Schema
  • 具备Predicate Filter特性

在行式存储中,一行的多列是连续的写在一起的,而在列式存储中,数据按列分开存储。由于同一列的数据类型是一样的,可以使用更高效的压缩编码进一步节约存储空间。

当前如果你想查看Parquet文件的内容,有几种选择:

  1. 使用Apache Arrow:Apache Arrow是一种开源的内存数据结构,可以用于存储和交换大型结构化数据集,包括Parquet。您可以使用Apache Arrow的Python库,pandas-arrow,将Parquet文件加载到pandas DataFrame中,然后查看DataFrame的内容。
  2. 使用parquet-tools:parquet-tools是一种命令行工具,可以用于查看Parquet文件的(inspect)元数据和(show)内容。
  3. 使用Spark:Apache Spark是一个流行的大数据处理引擎,它支持读取Parquet文件并将其转换为Spark DataFrame。您可以使用Spark SQL查询数据,或者使用Spark的其他功能来处理数据。
用 parquet-tools 来查看 Parquet 文件的内容
$ pip3 install parquet-tools

$ parquet-tools --help
$ parquet-tools inspect test.parquet #查看表结构
$ parquet-tools show -n 10 test.parquet #查看前10行内容
$ parquet-tools show -n 10 -c col1,col2 test.parquet #查看前10行内容,且只显示特定的列

$ ~/Library/Python/3.9/bin/parquet-tools #我的macOS上用pip3安装parquet-tools所在的位置,并不在默认的PATH路径下

WebHDFS

WebHDFS 是HDFS提供的HTTP RESTFul API接口,并且它是独立于Hadoop的版本的,它支持HDFS的完整FileSystem/FileContext接口。它可以让客户端通过发送HTTP请求的方式来操作HDFS,而无需安装Hadoop(以及Java等环境)
我们经常使用的HDFS Web UI,它就是基于 WebHDFS 来操作HDFS的。

WebHDFS 和 HttpFS 两者都是基于REST的HDFS API,使得一个集群外的host可以不用安装Hadoop和Java环境就可以对集群内的Hadoop进行访问,并且client不受语言的限制。

WebHDFS 是 HortonWorks 开发的,然后捐给了Apache;而 HttpFS 是 Cloudera 开发的,也捐给了Apache。

WebHDFS 不支持高可用NameNode架构,但 HttpFS 支持。

# Get Content Summary of a Directory
curl -i "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=GETCONTENTSUMMARY"

# Status of a File/Directory
curl -i  "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=GETFILESTATUS"

# List a Directory
curl -i "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=LISTSTATUS"

# Open and Read a File
curl -i -L "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=OPEN
                    [&offset=<LONG>][&length=<LONG>][&buffersize=<INT>]"

Hadoop Shell命令

FS Shell
调用文件系统(FS)Shell命令应使用 bin/hadoop fs <args>的形式。**所有的的FS shell命令使用URI路径作为参数。**URI格式是scheme://authority/path。对HDFS文件系统,scheme是hdfs,对本地文件系统,scheme是file。其中scheme和authority参数都是可选的,如果未加指定,就会使用配置中指定的默认scheme。一个HDFS文件或目录比如/parent/child可以表示成hdfs://namenode:namenodeport/parent/child,或者更简单的/parent/child(假设你配置文件中的默认值是namenode:namenodeport)。**大多数FS Shell命令的行为和对应的Unix Shell命令类似,不同之处会在下面介绍各命令使用详情时指出。出错信息会输出到stderr,其他信息输出到stdout。**

cat #将路径指定文件的内容输出到stdout。

使用方法:hadoop fs -cat URI [URI …]

示例:
hadoop fs -cat hdfs://host1:port1/file1 hdfs://host2:port2/file2
hadoop fs -cat file:///file3 /user/hadoop/file4

返回值:
成功返回0,失败返回-1。
==

hadoop fs -copyToLocal [-ignorecrc] [-crc] URI <localdst>
hadoop fs -get /user/hadoop/file localfile
hadoop fs -get hdfs://host:port/user/hadoop/file localfile

hadoop fs -copyFromLocal <localsrc> URI
hadoop fs -put localfile /user/hadoop/hadoopfile
hadoop fs -put localfile1 localfile2 /user/hadoop/hadoopdir
hadoop fs -put localfile hdfs://host:port/hadoop/hadoopfile
……
参考链接:

什么是 Alluxio
https://docs.alluxio.io/os/user/stable/cn/Overview.html

Alluxio 快速上手指南
https://docs.alluxio.io/os/user/stable/cn/overview/Getting-Started.html
https://downloads.alluxio.io/downloads/files/2.9.3/alluxio-2.9.3-bin.tar.gz

Alluxio 常见问题
https://docs.alluxio.io/os/user/stable/cn/overview/FAQ.html

Alluxio命令行接口为用户提供了基本的文件系统操作
https://docs.alluxio.io/os/user/stable/cn/operation/User-CLI.html

Hadoop Shell命令
https://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html

WebHDFS REST API
https://hadoop.apache.org/docs/r1.0.4/webhdfs.html#Operations

PyORC is a Python module for reading and writing Apache ORC file format. It uses the Apache ORC’s Core C++ API under the hood, and provides a similar interface as the csv module in the Python standard library.
https://pyorc.readthedocs.io/en/stable/index.html

the smallest, fastest columnar storage for Hadoop workloads.
https://orc.apache.org/

Apache Parquet is an open source, column-oriented data file format designed for efficient data storage and retrieval. It provides efficient data compression and encoding schemes with enhanced performance to handle complex data in bulk. Parquet is available in multiple languages including Java, C++, Python, etc…
https://parquet.apache.org/docs/

parquet-tools
https://pypi.org/project/parquet-tools/

Parquet的那些事(一)基本原理
https://zhuanlan.zhihu.com/p/111822325

Parquet文件查看工具
https://juejin.cn/s/Parquet%E6%96%87%E4%BB%B6%E6%9F%A5%E7%9C%8B%E5%B7%A5%E5%85%B7

hdfs之WebHDFS和HttpFS介绍
https://blog.csdn.net/breakout_alex/article/details/102384683

HDFS restful API:关于WebHDFS与HttpFS的区别
https://blog.51cto.com/zhangxueliang/4942683

[hadoop3.x系列]HDFS REST HTTP API的使用(一)WebHDFS
https://cloud.tencent.com/developer/article/1912486

使用Hadoop WebHDFS访问HDFS
https://www.cnblogs.com/yinzhengjie2020/p/13352498.html

=END=


《 “HDFS的一些知识点记录” 》 有 3 条评论

  1. 【Hadoop 系列二】HDFS 架构详解
    https://mp.weixin.qq.com/s/6U_stxC-fi03c8jkQmv-KQ
    `
    08-数据访问
    HDFS 访问数据的主要方式:WebHDFS REST API、FS shell 命令、NFS 网关、HDFS WEB UI。

    1. WebHDFS REST API

    WebHDFS 其实是 HDFS 提供的 HTTP RESTFul API接口,它支持 HDFS 的完整 FileSystem / FileContext 接口。它可以让客户端发送 Http 请求的方式来操作 HDFS。

    2. FS shell 命令

    HDFS 提供了一个名为 FS shell 的命令行界面,允许用户与 HDFS 中的数据进行交互。该命令集的语法类似于用户已经熟悉的其他 shell 语言(例如 bash、csh)。

    3. NFS 网关

    如果用命令行中访问 HDFS 路径的话感到有些繁琐。那么有没有一种工具可以将 HDFS 上面的空间映射到 Linux 本地磁盘上,然后再进行操作呢?答案是 NFS Gateway 。
    HDFS 的 NFS 网关允许客户端挂载 HDFS ,并通过 NFS 与其进行交互,就像它是本地文件系统的一部分一样(网关支持 NFSv3)。安装HDFS后,用户可以:
    ① 在 NFSv3 客户端兼容的操作系统上通过其本地文件系统浏览 HDFS 文件系统。
    ② 在 HDFS 文件系统和本地文件系统之间上载和下载文件。
    ③ 通过挂载点将数据直接传输到 HDFS。(支持文件追加,但不支持随机写入)

    NFS 网关机器需要同样的东西来运行 HDFS 客户端,例如 Hadoop JAR 文件、HADOOP_CONF 目录。NFS 网关可以与 DataNode、NameNode 或任何 HDFS 客户端位于同一主机上。

    4. HDFS WEB UI
    打开HDFS WEB UI ,可以使用 Utilities 下的 Browse the file system 去查看 HDFS 中的文件。
    `

  2. Hadoop Get File From HDFS to Local
    https://sparkbyexamples.com/apache-hadoop/hadoop-get-file-from-hdfs-to-local/
    `
    hadoop fs -get
    hdfs dfs -get

    $ hadoop fs -get /hdfs-file-path /local-file-path
    or
    $ hdfs dfs -get /hdfs-file-path /local-file-path
    `

    How to copy file from HDFS to the local file system
    https://stackoverflow.com/questions/17837871/how-to-copy-file-from-hdfs-to-the-local-file-system
    `
    1. bin/hadoop fs -get /hdfs/source/path /localfs/destination/path
    2. bin/hadoop fs -copyToLocal /hdfs/source/path /localfs/destination/path
    3. Point your web browser to HDFS WEBUI(namenode_machine:50070), browse to the file you intend to copy, scroll down the page and click on download the file.

    In Hadoop 2.0,
    hdfs dfs -copyToLocal $hdfs_input_file_path $output_path

    (cmd like ‘%fs -get %’ or cmd like ‘%copyToLocal%’)
    `

  3. Alluxio:面向 AI 计算的高性能数据访问平台
    https://mp.weixin.qq.com/s/C-yFm9kkI6kQWaqynU6cuA
    `
    随着技术发展,涌现出很多不同的数据架构,比如数据湖、湖仓一体、Data Fabric、Data Mesh 等,都是当前业界前沿的数据架构。本文将介绍目前主流的大数据技术栈和企业数据平台架构的最新发展趋势,并介绍Alluxio 产品所能带来的价值。

    主要内容包括三大部分:
    1. 大数据技术栈、企业数据平台趋势、Alluxio 架构定位

    2. Alluxio 典型应用场景及核心能力

    3. Alluxio 全球客户案例分析
    ==
    目前大数据技术栈最新的发展趋势主要包括三大方面:

    1. 存算分离架构
    传统的大数据计算引擎基本都是紧耦合的。比如 Map Reduce、Hive 和 HDFS 是紧密耦合的,是部署在一起的、存算一体的架构。随着业务的发展,目前业界也在做一些解耦工作。比如把 Spark 引擎跟 HDFS 引擎分开部署,这样实现了一定程度的存算分离,计算跟存储不再位于同一台主机上。
    另外,还有一些更复杂的业务场景,比如多集群下会有多数据中心,K8s 集群在一个数据中心,计算引擎 Spark、Presto 放到另外一个集群中心。另外也引出了新的公有云的架构、私有云的架构、混合云的架构,以及更多的计算框架,包括 Spark、Presto、Flink 等等。现在也会有更多的存储框架,除了传统的 HDFS,还有对象存储等。
    这些都是存算分离架构的发展。存算分离架构带来的好处显而易见,它解决了传统的计算和存储弹性伸缩及灵活扩展的问题。但同时也带来了一些问题,最大的问题就是计算性能的下降,因为缺少了数据本地性,存算分离架构之间会存在网络开销。

    2. 云原生技术应用
    近些年大数据业界不断推动大数据云原生技术,比如大数据计算引擎(Spark)的云原生改造,基于 K8s 容器引擎对 Spark 进行部署。
    在存储侧 HDFS 也在做一些云原生改造,比如最新的大数据对象存储引擎 Ozone,是一种对象存储。目前很多云上或者线下的对象存储,也在提供一些 HDFS、HCFS 接口来支持传统大数据分析,这些都是云原生技术在大数据技术栈上的应用。
    云原生改造主要是为了提升扩展性和资源弹性,同时也带来了计算的弹性扩展,降低了整体的物理资源成本。但是对象存储存在一定的性能问题,跟原生的 HDFS 存储相比,在 list fail 功能以及一些原子操作上,性能相对来说并不理想。

    3. 数据湖/湖仓一体、MPP/云原生数据库架构演进
    无论是数据湖还是湖仓一体,底层都是基于 HDFS 或对象存储等底层存储系统,在底层存储系统之上利用 Iceberg、Hudi、Delta Lake 等湖表格式支持一些分析场景,比如数据探索、OLAP 分析、机器学习等等。另外数据仓库现在也做了一些扩展,对接更多的数据湖存储,最终支持更广泛的分析场景。
    在湖仓一体方面,有很多 MPP、云原生数据库,像 ClickHouse、Doris、TiDB 等新的数据库层出不穷。都在做一些云原生和存算分离架构的改造,支持对象存储,支持更多的数据湖的存储,支持容器化部署等。
    存算分离趋势下的数据库、数据湖、湖仓一体技术实现了资源弹性,湖仓一体进一步实现了统一元数据、统一存储,以及减少数据冗余的目标。但是在底层存储系统(HDFS/对象存储)之上引入湖表结构层设计可能带来 IO 性能损失,需要统一的缓存加速层、统一接口支持。

    以上就是大数据技术栈及企业数据平台架构整体的发展趋势。接下来介绍几个比较容易混淆的词。
    `

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注