HTTP方式在线访问Hadoop HDFS上的文件解决方案

server/2024/10/19 2:19:33/

 背景:

在做大数据和大模型产品的时候,方式设计的是将文件放在hdfs上进行管理,前几天遇到一个需求:需要通过http的方式去访问hdfs上的问题,以前基本上都是通过hdfs://hadoop01:9000,去访问文件,于是经过一番调研对这个进行一下总结,为后续做个记录。

为了通过HTTP方式在线访问HDFS上的文件,您可以利用WebHDFS REST API或者HttpFS Gateway这两种机制实现。以下是使用这两种方式访问HDFS文件的基本步骤。

注:本例使用的是Hadoop2.7.X版本,请各位同学留意!

一、使用WebHDFS REST API

1.HTTPFS简介

1:httpfs是cloudera公司提供的一个hadoop hdfs的一个http接口,通过WebHDFS REST API 可以对hdfs进行读写等访问

2:与WebHDFS的区别是不需要客户端可以访问hadoop集群的每一个节点,通过httpfs可以访问放置在防火墙后面的hadoop集群

3:httpfs是一个Web应用,部署在内嵌的tomcat中

 2.webHDFS设置

做这个的前提是Hadoop已经安装ok,没有任何问题了,如果安装Hadoop步骤或问题,可参考博主的这篇文章:超详细的Hadoop集群部署_hadoop部署-CSDN博客

 namenode的hdfs-site.xml是必须将dfs.webhdfs.enabled属性设置为true,否则就不能使用webhdfs的LISTSTATUS、LISTFILESTATUS等需要列出文件、文件夹状态的命令,因为这些信息都是由namenode来保存的。

在namenode和一台datanode中向 etc/hadoop/conf/hdfs-site.xml中添加属性:

vi hdfs-site.xml

<property><name>dfs.webhdfs.enabled</name><value>true</value>
</property>

3.使用说明

Hadoop 2.x版本可能会监听在50070端口提供Web界面

访问namenode的hdfs使用50070端口,访问datanode的webhdfs使用50075端口。访问文件、文件夹信息使用namenode的IP和50070端口,访问文件内容或者进行打开、上传、修改、下载等操作使用datanode的IP和50075端口。要想不区分端口,直接使用namenode的IP和端口进行所有的webhdfs操作,就需要在所有的datanode上都设置hdfs-site.xml中的dfs.webhdfs.enabled为true。

4.curl 操作命令示例

(需要将 host 替换为实际部署 httpfs 的服务器 IP)

curl -c ~/.httpsauth "http://host:50070/webhdfs/v1?op=gethomedirectory&user.name=hdfs"curl -b ~/.httpsauth "http://host:50070/webhdfs/v1?op=gethomedirectory"curl -b ~/.httpsauth "http://host:50070/webhdfs/v1/test/data1.txt?op=OPEN"curl -b ~/.httpsauth -X DELETE "http://host:14000/webhdfs/v1/test/data1.txt?op=DELETE"
创建和追加都是分为两步,测试都没有成功 (注意,一定要追加 --header 参数,否则创建会失败)
curl -b ~/.httpsauth -i -X PUT "http://172.168.63.221:14000/webhdfs/v1/test2?op=CREATE&buffersize=1000"curl -b ~/.httpsauth -i -X PUT -T data2.txt --header "Content-Type: application/octet-stream" "http://172.168.63.221:14000/webhdfs/v1/test2/data.txt?op=CREATE&user.name=hdfs&buffersize=1000&data=true"

其他API:

创建并写一个文件curl -i -X PUT "http://localhost:50070/webhdfs/v1/<PATH>?op=CREATE[&overwrite=<true|false>][&blocksize=<LONG>][&replication=<SHORT>][&permission=<OCTAL>][&buffersize=<INT>]“curl -i -X PUT -T <LOCAL_FILE> "http://<DATANODE>:<PORT>/webhdfs/v1/<PATH>?op=CREATE...“注意这个地方填入的是DataNode的信息在一个文件内追加内容curl -i -X POST "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=APPEND[&buffersize=<INT>]”curl -i -X POST -T <LOCAL_FILE> "http://<DATANODE>:<PORT>/webhdfs/v1/<PATH>?op=APPEND...“注意该条命令获得的是DataNode的信息。打开并读取一个文件curl -i -L "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=OPEN[&offset=<LONG>][&length=<LONG>][&buffersize=<INT>]“创建一个目录curl -i -X PUT "http://<HOST>:<PORT>/<PATH>?op=MKDIRS[&permission=<OCTAL>]“重名命文件、文件夹curl -i -X PUT "<HOST>:<PORT>/webhdfs/v1/<PATH>?op=RENAME&destination=<PATH>"删除文件/文件夹curl -i -X DELETE "http://<host>:<port>/webhdfs/v1/<path>?op=DELETE [&recursive=<true|false>]“文件/ 文件夹的状态信息curl -i “http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=GETFILESTATUS“目录列表curl -i "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=LISTSTATUS”获取目录的上下文环境汇总信息curl -i "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=GETCONTENTSUMMARY"获取Check Sum Filecurl -i "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=GETFILECHECKSUM”获取Home 目录curl -i "http://<HOST>:<PORT>/webhdfs/v1/?op=GETHOMEDIRECTORY”设置权限curl -i -X PUT "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=SETPERMISSION [&permission=<OCTAL>]“设置所有者curl -i -X PUT "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=SETOWNER [&owner=<USER>][&group=<GROUP>]"设置备份curl -i -X PUT "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=SETREPLICATION [&replication=<SHORT>]“

我使用的是查看所以用的是这个命令:

http://hadoop01:50070/webhdfs/v1/<PATH>?op=OPEN

http(s)://<NAMENODE_HTTP_ADDRESS>:<HTTP_PORT>/webhdfs/v1/<PATH>?op=OPEN[&offset=<LONG>&length=<LONG>]

其中:

  • <NAMENODE_HTTP_ADDRESS> 是NameNode的HTTP地址。
  • <HTTP_PORT> 是WebHDFS服务监听的HTTP端口。
  • <PATH> 是HDFS文件系统的路径。
  • offset 和 length 是可选参数,用于指定读取文件的起始位置和长度。

5.身份验证

如果Hadoop集群启用了安全性(如Kerberos),则需要在HTTP请求中包含有效的认证凭证(如SPNEGO令牌)。

6.基于 JAVA 操作 httpfs 的开源代码

开源项目地址,有什么问题可以直接反馈给我

    https://github.com/gitriver/httpfs-client

   说明

   1  包 com.catt.httpfs.client.httpclient 是采用 commons-httpclient.jar,
    基于 http 请求实现的,没有使用到 hadoop 相关的 jar
    2  包 org.apache.hadoop.fs.http.client 根据 httpfs 项目的源代码,
    根据需要修改了一下,使用了 hadoop 相关的 jar

二、使用HttpFS Gateway

1.安装和配置HttpFS Gateway

HttpFS是一个独立的服务,需安装并在Apache Tomcat或其他Servlet容器上运行。配置HttpFS以连接到您的Hadoop集群,并启动服务。

2.访问文件

使用类似于WebHDFS的API调用,但通过HttpFS Gateway提供的URL访问文件。例如:

http(s)://<HTTPFS_SERVER>:<HTTPFS_PORT>/<PATH>?op=OPEN[&offset=<LONG>&length=<LONG>]

这里 <HTTPFS_SERVER> 和 <HTTPFS_PORT> 是HttpFS服务所在的服务器地址和端口。

无论是WebHDFS还是HttpFS,由于涉及到安全性和权限控制,可能还需要进行Kerberos认证或简单的HTTP基本认证。根据实际情况配置相应的身份验证机制。

请注意,在生产环境中,还需考虑网络策略和防火墙设置,以确保外部客户端能够通过HTTP访问这些服务。同时,对于大规模文件或频繁访问的情况,通常建议结合使用代理服务器(如Nginx)进行负载均衡和缓存优化。

引申:

1. HTTPFS: 基于HTTP操作hadoop hdfs文件系统

HTTPFS: 基于HTTP操作hadoop hdfs文件系统 - 大数据处理技术研究、使用 - OSCHINA - 中文开源技术交流社区

2. 利用JavaAPI访问HDFS的文件
    利用JavaAPI访问HDFS的文件_java api 访问hdfs 读取文件-CSDN博客 

3. Hadoop HDFS over HTTP - Documentation Sets 2.2.0
   http://hadoop.apache.org/docs/r2.2.0/hadoop-hdfs-httpfs/index.html 

4. 

Hadoop HDFS over HTTP 2.2.0 - Using HTTP Tools

http://hadoop.apache.org/docs/r2.2.0/hadoop-hdfs-httpfs/UsingHttpTools.html

5. Hadoop REST API -WebHDFS(上)
    http://www.tuicool.com/articles/yUZnMj 

6. httpfs装配指南
   http://www.ylzx8.cn/gaoxingnenkaifa/cloud/1010950.html 

https://my.oschina.net/cloudcoder/blog/277426


http://www.ppmy.cn/server/28010.html

相关文章

STM32-HAL库12-STM32F407VGT6的PWM主从定时器,发送指定数量脉冲

STM32-HAL库12-STM32F407VGT6的PWM主从定时器&#xff0c;发送指定数量脉冲 一、所用材料 STM32F407VGT6自制双伺服电机控制板&#xff1b; 一川A1系列伺服电机驱动器&#xff08;电0.73KW电机&#xff09;&#xff1b; 二、所学内容 实现PWM发送指定个数脉冲&#xff0c;以…

B树:原理、操作及应用

B树&#xff1a;原理、操作及应用 一、引言二、B树概述1. 定义与性质2. B树与磁盘I/O 三、B树的基本操作1. 搜索&#xff08;B-TREE-SEARCH&#xff09;2. 插入&#xff08;B-TREE-INSERT&#xff09;3. 删除&#xff08;B-TREE-DELETE&#xff09; 四、B树的C代码实现示例五、…

【QEMU系统分析之实例篇(九)】

系列文章目录 第九章 QEMU系统仿真的机器创建分析实例 文章目录 系列文章目录第九章 QEMU系统仿真的机器创建分析实例 前言一、QEMU是什么&#xff1f;二、QEMU系统仿真的机器创建分析实例1.系统仿真的命令行参数2.完成默认设备的设置工作suspend_mux_open()qemu_disable_defa…

ReactNative0.74 版本发布重大更新

React Native 0.74 版本发布&#xff0c;主要更新包括&#xff1a; Yoga 3.0&#xff1a;新版布局引擎带来更稳定的样式处理&#xff0c;并支持基于Web的组件渲染。Yoga 3.0对行反向容器上的边距、填充和边框属性的行为进行了调整&#xff0c;现在与Web保持一致&#xff0c;即不…

unity入门——按钮点击了却无法调用函数

查阅了一番都没有解决问题&#xff0c;最后发现问题是由button的Onclick()事件绑定了代码脚本而不是游戏对象导致的。 如果Onclick()事件绑定的是代码脚本&#xff0c;则下拉框里没有函数&#xff0c;但是点击MonoScript后能手动填入函数名&#xff08;本以为这样就能实现调用…

Oracle对空值(NULL)的 聚合函数 排序

除count之外sum、avg、max、min都为null&#xff0c;count为0 Null 不支持加减乘除&#xff0c;大小比较&#xff0c;相等比较&#xff0c;否则只能为空&#xff1b;只能用‘is [not] null’来进行判断&#xff1b; Max等聚合函数会自动“过滤null” null排序默认最大&#xf…

Mac 上安装多版本的 JDK 且实现 自由切换

背景 当前电脑上已经安装了 jdk8; 现在再安装 jdk17。 期望 完成 jdk17 的安装&#xff0c;并且完成 环境变量 的配置&#xff0c;实现自由切换。 前置补充知识 jdk 的安装路径 可以通过查看以下目录中的内容&#xff0c;确认当前已经安装的 jdk 版本。 cd /Library/Java/Java…

【云原生】Docker 实践(四):使用 Dockerfile 文件的综合案例

Docker 实践&#xff08;四&#xff09;&#xff1a;使用 Dockerfile 文件的综合案例 下面将从一个 CentOS 的基础镜像开始&#xff0c;安装 JDK 和 Tomcat 环境&#xff0c;并完成一个 Web 应用的部署。整个过程通过一个 Dockerfile 文件来描述。通过 Dockerfile 文件来构建一…