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的一些知识点记录” 》 有 2 条评论

  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%’)
    `

发表回复

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