本地 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的集群节点信息,主要是配置主节点namenode
        Configuration 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.mfbz.cn/a/675604.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

创意设计新伙伴:StartAI PSAI插件,让设计工作更轻松!

在设计的世界里&#xff0c;灵感与效率是设计师的双翼。但有时候&#xff0c;面对复杂的设计任务和紧迫的截止日期&#xff0c;即使是最富有经验的设计师也会感到力不从心。StartAI&#xff0c;一款革命性的PS AI设计插件。 StartAI&#xff1a;设计工作的加速器 StartAI是一款…

超分辨重建——SRGAN网络训练自己数据集与推理测试(详细图文教程)

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《暗光增强》 &a…

Linux——简单指令汇总

Linux&#xff0c;一般指GNU/Linux&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年10月5日首次发布&#xff0c;它主要受到Minix和Unix思想的启发&#xff0c;是一个…

笔记-python操作kafka实践

1、先看最简单的场景&#xff0c;生产者生产消息&#xff0c;消费者接收消息&#xff0c;下面是生产者的简单代码。 #!/usr/bin/env python # -*- coding: utf-8 -*- import json from kafka import KafkaProducerproducer KafkaProducer(bootstrap_serversxxxx:x)msg_dict …

浅测 长亭雷池 WAF “动态防护”

本文首发于 Anyeの小站 前言 雷池 WAF 社区版的更新速度是真快啊&#xff0c;几乎一周一个小版本&#xff0c;俩月一个大版本&#xff0c;攻城狮们真的狠啊&#xff0c;没法测了。 废话不多说&#xff0c;前两天看到了 这篇文章&#xff0c;对雷池的“动态防护”功能挺感兴趣…

二人订单共享模式:新零售电商盈利新秘诀

电商江湖日新月异&#xff0c;竞争如火如荼&#xff0c;如何脱颖而出&#xff0c;赢得消费者&#xff1f;二人订单共享模式&#xff0c;这是一种全新的商业模式&#xff0c;旨在打造爆款产品&#xff0c;迅速吸引大量客源&#xff0c;并激发消费者重复购买欲望。 首先&#xf…

期权懂带你懂50etf认沽期权和认购期权有什么区别?

今天带你了解期权懂带你懂50etf认沽期权和认购期权有什么区别&#xff1f;在金融市场中&#xff0c;期权是一种允许持有者在未来某个时间以特定价格买入或卖出基础资产的金融衍生品。 50etf认沽期权和认购期权有什么区别&#xff1f; 50ETF认沽期权和认购期权的主要区别在于它…

从报名到领证:软考高级【网络规划设计师】报名考试全攻略

本文共计10551字&#xff0c;预计阅读35分钟。包括七个篇章&#xff1a;报名、准考证打印、备考、考试、成绩查询、证书领取及常见问题。 不想看全文的可以点击目录&#xff0c;找到自己想看的篇章进行阅读。 一、报名篇 报名条件要求&#xff1a; 1.凡遵守中华人民共和国宪…

淘宝电商接口获取商品数据,该怎么获取?

淘宝电商接口&#xff08;也称为淘宝开放平台API&#xff09;允许开发者通过编程方式获取淘宝平台上的商品数据、订单数据等。然而&#xff0c;直接获取淘宝的商品数据并不是一件简单的事情&#xff0c;因为淘宝对API的使用有一定的限制和要求&#xff0c;包括权限申请、接口调…

项目-双人五子棋对战: websocket的讲解与使用 (1)

项目介绍 接下来, 我们将制作一个关于双人五子棋的项目, 话不多说先来理清一下需求. 1.用户模块 用户的注册和登录 管理用户的天梯分数, 比赛场数, 获胜场数等信息. 2.匹配模块 依据用户的天梯积分, 实现匹配机制. 3.对战模块 把两个匹配到的玩家放到同一个游戏房间中, 双方通…

线程进阶-2 ThreadLocal

一.简单说一下ThreadLocal 1.ThreadLocal是一个线程变量&#xff0c;用于在并发条件下&#xff0c;为不同线程提供相互隔离的变量存储空间。在多线程并发的场景下&#xff0c;每个线程往ThreadLocal中存的变量都是相互独立的。 2.基本方法 &#xff08;1&#xff09;set(Obj…

wms中对屏幕进行修改wm size设置屏幕宽高原理剖析

背景&#xff1a; 上面是正常屏幕1440x2960的屏幕大小&#xff0c;如果对display进行相关的修改&#xff0c;可以使用如下命令&#xff1a; adb shell wm size 1080x1920 得出如下的画面 明显看到差异就是屏幕上下有黑边了&#xff0c;那么下面就来调研这个wm size是怎么做的…

软件系统测试的定义和测试内容介绍

一、什么是软件系统测试? 软件系统测试是指对软件系统的功能、性能、可靠性、稳定性等方面进行全面检查和验证的过程。其目的是发现潜在的问题、缺陷和风险&#xff0c;并确保软件系统的质量和稳定性。 软件系统测试可以分为多个阶段&#xff0c;包括单元测试、集成测试、系…

《深入浅出C语言:从基础到指针的全面指南》

1. 简介 C语言是一种通用的编程语言&#xff0c;广泛应用于系统编程、嵌入式系统和高性能应用程序。它由Dennis Ritchie在1972年开发&#xff0c;并且至今仍然非常流行。C语言以其高效、灵活和强大的功能著称&#xff0c;是许多现代编程语言的基础。 2. 基本语法 2.1 Hello, …

44-4 waf绕过 - CDN简介

一、CDN简介 CDN,即内容分发网络(Content Delivery Network),是建立在现有网络基础之上的智能虚拟网络。它依靠部署在各地的边缘服务器,并通过中心平台的负载均衡、内容分发和调度等功能模块,使用户可以就近获取所需内容,从而降低网络拥塞,提高用户访问响应速度和命中率…

servlet小项目与servlet续集

文章目录 servlet小项目与servlet续集,是结合上一次的案例进行升级,给项目新增了,增加员工,删除员工,查询具体员工 功能新增操作修改操作删除操作过滤器Cookie servlet小项目与servlet续集,是结合上一次的案例进行升级,给项目新增了,增加员工,删除员工,查询具体员工 功能 上一…

Spring boot集成通义千问大模型实现智能问答

Spring boot集成通义千问大模型实现智能问答 背景 我在用idea进行java开发时发现了通义灵码这款免费的智能代码补全插件&#xff0c;用了一段时间了&#xff0c;感觉很不错。就想着在自己的项目中也能集成通义千问大模型实现智能回答&#xff0c;毕竟对接openai需要解决网络问…

社交媒体数据恢复:Weico

一、从备份中恢复数据 云备份 希望这篇教程能帮助你恢复Weico中的聊天记录和文件。如有其他问题&#xff0c;请随时联系我们。 三、注意事项 在尝试恢复数据的过程中&#xff0c;请避免执行任何可能导致数据进一步丢失的操作。 数据恢复的效果取决于多种因素&#xff0c;包…

GPU的最佳拍档HBM到底是什么

在AI界&#xff0c;英伟达的大名无人不知&#xff0c;无人不晓。然而即使在AI芯片界占据绝对霸主地位的英伟达&#xff0c;依旧受制于人。 众所周知&#xff0c;算力与带宽是制衡AI应用的两大关键因素&#xff0c;长期以来高速发展的算力受困于有限的带宽限制了其性能的最大发…

信息系统项目管理师0142:管理新实践(9项目范围管理—9.1管理基础—9.1.2管理新实践)

点击查看专栏目录 文章目录 9.1.2 管理新实践 9.1.2 管理新实践 需求一直是项目管理的关注重点&#xff0c;需求管理过程结束于需求关闭&#xff0c;即把产品、服务或成果移交给接收方&#xff0c;以便长期测量、监控、实现并维持收益。随着全球项目环境变得日益复杂&#xff0…