本地 Java API 访问云上 HDFS 集群的问题与解决

前言

这篇文章默认是已经在云上配置好了 Haoop 集群,因此本文主要是记录一些可能会出现错误的地方。

如果还不会配置 Hadoop 集群,那么可以参考本专栏的另一篇文章:云上配置 Hadoop 集群详解

另外在进行本文的学习之前也建议先看看该文章,因为一些基本概念这里不会再进行解释了嗷。

1、本地(windows)配置主机名映射

在使用 Java API 进行远程访问之前,要先在本地的 Windows 环境下配置上相应的主机名映射捏。

打开下面路径,进行文件配置:

C:\Windows\System32\drivers\etc\hosts

打开该文件,可以看到下面的内容:

在这里插入图片描述

我们需要在上面追加一行内容,内容格式为:

xxx.xxx.xxx.xxx cloud_host_name

其中前面的 xxx.xxx.xxx.xxx 为你的云服务器的公网 IP 地址,后面的 cloud_host_name 则是你云服务器上的主机名称,该主机名称可以在云服务器上键入命令:hostname 得知:

在这里插入图片描述

因此,假设你的服务器的公网 IP 地址为 111.123.123.123,且云服务器的主机名为 VM-8-4-ubuntu 那么需要追加的内容就是:

111.123.123.123 VM-8-4-ubuntu

2、本地(windows)配置JDK以及Hadoop的环境变量

本地连接云服务器的Hadoop集群时需要配置 Hadoop 的环境变量,否则启动会报错,而配置 Hadoop 的环境变量时又依赖 JDK 的环境变量,因此也要配置好 JDK 的本地环境变量。

配置环境变量这个网上教程就太多了,随便 CSDN 一下都一大把,因此这里不再赘述。

3、云服务器上需要进行的配置

3.1、首先也是需要进行主机名的映射

Linux的主机名配置在根目录下的 /etc/hosts 文件中,注意需要切换成 root 用户才有权限进行更改:

/etc/hosts

在这里插入图片描述

使用 vim 打开后,如下:

在这里插入图片描述

这里要注意,上图已经是我修改过后的 hosts 文件了,因此如果你和我的不一样那么也很正常,你只要改成我上面的样子即可。

那么重点改哪里呢:

众所周知,在我们购买云服务器时,会有两个 IP 地址,一个是公网 IP 地址另一个是内网 IP 地址:
在这里插入图片描述

形式基本如上图如所示,那么在云上的 Hadoop 集群中,其内部通信是通过内网进行的,因此我们需要配上类似于刚刚在 Windows 环境上的操作,即在 /etc/hosts 文件中追加下面内容:

内网地址IP 云服务器主机名
如
192.168.88.152 VM-8-4-ubuntu

如果你的云服务器主机名的默认情况下被映射到了别的IP地址(多半是本地环回地址),那么请将其去掉改成上述内容。

总之就是确保你的云服务器主机名所对应的只有一个内网IP地址即可,因为如果有多个的话我们自己设置的内网IP映射主机名的优先级不够别的映射关系级别高,会让我们自己设置的不起作用。

3.2、修改Hadoop的配置文件

主要是 Hadoop 文件夹下的下面几个文件:

在这里插入图片描述

1、修改 workers 文件:

vim 打开 workers ,写入我们的主机名(注意一定是本机的主机名嗷),因为我只有一台云服务器,所以我只在该文件中写入一个主机名即可,因此相当于是在构建一个伪分布式 Hadoop 集群:

在这里插入图片描述

2、vim 打开 core-site.xml 文件:

在该文件中配置好我们的内部通讯端口,也就是我们的 namenode 主节点,我这唯一一台的云服务器既是主节点也是从节点,即既是namenode 节点也就是 datanode 节点,因此这里配置主节点用的是本服务器的主机名(注意一定是本机的主机名嗷):

在这里插入图片描述

3、vim 打开 hdfs-site.xml 文件

在上文刚刚提过,我这唯一一台服务器既是主节点也是从节点,因此这里配置数据节点 datanode 时,同样采用的本机的主机名(注意一定是本机的主机名嗷):

在这里插入图片描述

全部弄完这些之后,就可以格式化 namenode 然后启动 hdfs 集群了。

格式化时不出意外按照上面的配置流程走下来,格式化完后的结果应该如下:

在这里插入图片描述

“Shutting down NameNode at VM-8-4ubuntu(也就是你的服务器主机名)/10.0.8.4(也就是你服务器的内网IP地址)”

格式化后如果如上,那么配置应该就没有问题了。

4、注意云服务器的端口开放问题

因为云服务器的端口默认只开放了几个,而 hdfs 集群会涉及较多的端口,因此这里根据我的经验需要开放下面几个:

首先是我们在之前的配置中所配置的 namenode 的通讯端口:8020,注意这个是我们自己可以配置的:

在这里插入图片描述

然后是在集群内部各个节点之间的通讯端口,这是 Hadoop 的 HDFS 默认占用的端口,请注意这几个端口有无被占用:

在这里插入图片描述

把这几个端口开放了应该连接就没有问题了。

5、测试

可以使用下面的 Java 代码进行简单的测试,也可以让 GPT 生成一些测试代码来进行简单的测试:

@PostMapping("/upload")public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file) throws IOException, InterruptedException {//1. 初始化配置对象 需要new出来,用来配置Hadoop的集群节点信息,主要是配置主节点namenodeConfiguration conf = new Configuration();//下面这行代码告诉Hadoop客户端使用数据节点(Datanode)的主机名来建立连接,而不是使用IP地址//因为在分布式环境下,节点(包括数据节点)的IP地址可能会发生变化,而主机名通常是稳定的。//因此,通过使用主机名而不是IP地址,可以提高Hadoop集群的可维护性和可靠性conf.set("dfs.client.use.datanode.hostname", "true");//2. 添加配置 (其实就是提供一个key - value)//xxx.xxx.xxx.xxx改成你的公网IP地址嗷FileSystem fileSystem = FileSystem.get(URI.create("hdfs://xxx.xxx.xxx.xxx:8020"),conf,"ubuntu");//4、将前端传来的文件数据上传至hdfs/*用MultipartFile的getInputStream方法,获得输入流,随后转换成Hadoop的FSDataOutputStream输出流后,就可以将文件上传到Hadoop最后记得flush和close输入输出流*/InputStream inputStream = null;FSDataOutputStream fsDataOutputStream = null;try{inputStream = file.getInputStream();//用户上传文件存储在hdfs中的路径//截取文件名后缀来分别进行存储String fileName = file.getOriginalFilename();Path desPath = new Path("/"+fileName);//创建路径后写入文件fsDataOutputStream = fileSystem.create(desPath);byte[] b = new byte[4096];int read;while((read=inputStream.read(b)) > 0){fsDataOutputStream.write(b,0,read);}fsDataOutputStream.flush();return ResponseEntity.ok().body("File uploaded to HDFS successfully.");} catch (IOException e){e.printStackTrace();} finally {if (null != inputStream) inputStream.close();if (null != fsDataOutputStream) fsDataOutputStream.close();}//关闭hdfs的连接工具if (fileSystem != null) {fileSystem.close();}return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Failed to upload file to HDFS");}

6、其他问题

如果还出现了其他的报错,那么建议自己反复检查一下自己的配置以及程序,不然就多多百度,按我的经验应该是将上面的步骤挨个做完应该就能解决了。

还有一个问题,如果出现了往 HDFS 上写入文件只能写入文件名却无法写入文件内容的情况时,或者报错类似于:

org.apache.hadoop.ipc.RemoteException(java.io.IOException): File could only be replicated to 0 nodes instead of minReplication (=1). There are 1 datanode(s) running and 1 node(s) are excluded in this operation.

可以参考下面这篇文章:使用Java API 向 HDFS 中写入数据报错解决;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/21588.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

边缘计算的AI小板——OrangePi AI Pro

简介 OrangePi AI Pro是一款基于Allwinner H6处理器的嵌入式AI计算设备&#xff0c;适用于物联网和边缘计算。它具有强大的性能、低功耗、多接口和小尺寸。 本文分为三个部分&#xff1a; 一、对该板进行简单的开箱介绍。 二、 将SD卡中的系统迁移到由于该板支持SD卡、SSD…

必看——怎么让网站实现HTTPS访问?

让网站实现HTTPS访问的步骤可以简化为以下几个基本步骤&#xff0c;非常适合非技术背景人士理解&#xff1a; 1. 申请SSL证书&#xff1a; - SSL证书是实现HTTPS的关键&#xff0c;它能加密网站数据&#xff0c;保证用户信息的安全。你可以从一些提供免费SSL证书的机构&#xf…

Spring boot集成mybatis

Spring boot集成mybatis maven依赖 我的spring boot版本是2.5.0&#xff0c;集成mybatis&#xff0c;首先需要数据库的支持&#xff0c;这里我选择mysql数据库&#xff0c;版本是8.0.11&#xff0c;然后使用druid连接池&#xff0c;其次就需要加上mybatis的依赖。 <!--mys…

[ue5]建模场景学习笔记(2)——用vectornoise降低重复率

1.问题分析&#xff1a; 利用改uv的方式降低重复率并不理想&#xff0c;在一定程度上的确能够达到降低重复率的效果&#xff0c;但远看仍然有较清晰的重复效果&#xff0c;尝试优化一下。 2.操作实现&#xff1a; 1.首先先看一下修改后的效果&#xff1a; 这是未修改前&#…

【Web API DOM02】如何获取、操作DOM元素

一&#xff1a;获取DOM元素 1 根据CSS选择器获取 语法格式如下&#xff1a; &#xff08;1&#xff09;选中一个DOM元素 document.querySeletor(CSS选择器) <ul><li>1</li><li>2</li><li>3</li> </ul> document.querySel…

Github上一款开源、简洁、强大的任务管理工具:Condution

Condution 是一款开源任务管理工具&#xff0c;它以简洁易用、功能强大著称。它旨在为用户提供一个简单高效的平台&#xff0c;帮助他们管理日常任务、提高工作效率。 1. Condution 的诞生背景 现如今&#xff0c;市面上存在着许多任务管理软件&#xff0c;但它们往往价格昂贵…

如何不用口吐莲花,照样成为社交达人

一、教程描述 每个人的一生&#xff0c;70%的时候都在沟通&#xff0c;与老板沟通、与家人沟通、与朋友沟通、与陌生人沟通&#xff0c;等等&#xff0c;但是你真的会沟通么&#xff1f;不论是工作上跟上司、同事和客户间的沟通&#xff0c;还是生活中与家人、朋友、伴侣间的沟…

[ICPC2024 Xi‘an I] ICPC2024 邀请赛西安站(7/8/13)

心得 [ICPC2024 Xian I] ICPC2024 邀请赛西安站重现赛 - 比赛详情 - 洛谷 7表示赛时ac了7个&#xff0c;8表示含补题总共ac数&#xff0c;13表示题目总数 题目 M. Chained Lights 打表&#xff0c;发现只有k1是YES //#include <bits/stdc.h> #include<iostream&…

软考 系统架构设计师系列知识点之SOME/IP与DDS(1)

本文内容参考&#xff1a; 车载以太网 - SOME/IP简介_someip-CSDN博客 https://zhuanlan.zhihu.com/p/369422441 什么是SOME/IP?_someip-CSDN博客 SOME/IP 详解系列&#xff08;1&#xff09;—— 概述_some ip-CSDN博客 深入浅出SOME/IP协议&#xff1a;基本概念和原理-…

OJ3376无尽的石头问题

答案&#xff1a; #include<bits/stdc.h> using namespace std; const int N10e7; int fx(int n) {int sum0;while(n){sum(n%10);n/10;}return sum; } int main() {int t,n,x;cin>>t;while(t--){cin>>n;int count0;for(int i1;i<N;){if(in){cout<<…

在github上创建(上传、关联)自已的项目

目录 创建一个github项目并进行开发。 1.github创建空项目 2. git clone 项目 3. 将项目关联 创建一个github项目并进行开发。 1.github创建空项目 右边的New 然后按步创建就行 2. git clone 项目 复制这个连接 然后在终端&#xff1a;git clone [刚才复制的连接] 3. 将…

解读 Explainable Image Similarity Integrating Siamese Networks and Grad-CAM

给出论文&#xff08;Explainable Image Similarity Integrating Siamese Networks and Grad-CAM&#xff09;的内容解读、代码运行说明 论文链接&#xff1a;J. Imaging | Free Full-Text | Explainable Image Similarity: Integrating Siamese Networks and Grad-CAM (mdpi.c…

2024年武汉东湖高新中级职称报名时间是什么时候?

2024年武汉市东湖高新中级职称上半年批次报名已经截止了&#xff0c;下半年东湖高新至少还有一次报名机会&#xff0c;所以各位东湖高新区评职称的朋友们&#xff0c;不要错过这次了。 2024年武汉东湖高新区中级职称报名条件&#xff1a; 1.东湖高新区社保满足1年&#xff0c;近…

golang的http客户端封装

简介 net/http 是 Go 语言标准库的一部分&#xff0c;它提供了创建 HTTP 客户端和服务器的能力。这个包通过简化与 HTTP 协议的交互&#xff0c;让开发者能够方便地构建 HTTP 请求和响应&#xff0c;以及处理路由等任务。 本文以 net/http 包作为底层&#xff0c;封装一个包含…

HTCC电路板是什么,有哪些主要应用领域

HTCC英文名称是High-Temperature Co-Fired Ceramic&#xff0c;又称高温共烧多层陶瓷基板。因其具有导热系数高、耐热性好、热膨胀系数小、机械强度高、绝缘性好、耐腐蚀等优势&#xff0c;是保持高速增加的PCB线路板之一。 SPEA作为专业电路板测试设备方案服务商&#xff0c;公…

FY-SA-20237·8-WhyWeSpin

Translated from the Scientific American, July/August 2023 issue. Why We Spin (我们为什么旋转) Primates may play with reality by twirling around 翻译&#xff1a;灵长类动物有能力通过旋转或旋转运动来操纵或扭曲他们对现实的感知。 解释&#xff1a; “Primates”…

【开发心得】三步本地化部署llama3大模型

目录 第一步&#xff1a;启动ollama 第二步&#xff1a;启动dify 第三步&#xff1a;配置模型&#xff08;截图&#xff09; 最近llama3很火&#xff0c;本文追击热点&#xff0c;做一个本地化部署的尝试&#xff0c;结果还成功了&#xff01; 当然也是站在别人的肩膀上&…

【运维项目经历|027】PXE自动化部署与管理平台

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

Nginx企业级负载均衡:技术详解系列(18)—— 作为上传服务器

你好&#xff0c;我是赵兴晨&#xff0c;97年文科程序员。 在上一期的技术分享中&#xff0c;我们探讨了如何高效搭建Nginx下载服务器&#xff0c;并讨论了长连接优化策略。那么今天&#xff0c;咱们进一步了解Nginx的另一面——作为上传服务器的配置技巧。 作为上传服务器&a…

怎么做好企业短信服务呢?(文字短信XML接口示例)

企业短信服务已经成为各行各业都信赖的行业推广方式之一&#xff0c;并且短信行业也与时俱进的发展着&#xff0c;随之而来的就是市场上短信平台的数量也随之增多。那么怎么在鱼龙混杂的短信行业中选择适合自己的企业短信服务平台呢&#xff1f;企业短信服务平台又适用于哪些应…