Hadoop集群环境下HDFS实践编程过滤出所有后缀名不为“.abc”的文件时运行报错:java.net.ConnectException: 拒绝连接;

news/2024/5/20 3:09:16 标签: 分布式, hdfs, hadoop, eclipse, java, 大数据

一、问题描述

搭建完Hadoop集群后,在Hadoop集群环境下运行HDFS实践编程使用Eclipse开发调试HDFS Java程序(文末有源码):

假设在目录“hdfs://localhost:9000/user/hadoop”下面有几个文件,分别是file1.txt、file2.txt、file3.txt、file4.abc和file5.abc,这里需要从该目录中过滤出所有后缀名不为“.abc”的文件,对过滤之后的文件进行读取,并将这些文件的内容合并到文件“hdfs://localhost:9000/user/hadoop/merge.txt”中。

在执行上述任务时,运行代码后报错:

Exception in thread "main" java.net.ConnectException: Call From Master/192.168.52.136 to localhost:9000 failed on connection exception: java.net.ConnectException: 拒绝连接; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused

二、解决办法

将代码中“localhost”修改为自己的主节点的主机名

修改之前:

修改之后:

修改完成后再次运行即可成功:

查看HDFS家目录下的内容:

查看hdfs.txt中的内容:

如上,证明程序正常运行且运行成功。

至此,问题解决!!!

三、问题分析及可能出现的问题

1.问题分析

出现 "Exception in thread "main" java.net.ConnectException: Call From Master/192.168.52.136 to localhost:9000 failed on connection exception: java.net.ConnectException: 拒绝连接" 错误通常表示无法建立到Hadoop的NameNode(通常在localhost:9000)的连接。这可能是由以下原因导致的:

1. Hadoop服务未启动:请确保已经正确启动了Hadoop集群中的所有必要服务,包括NameNode。您可以通过运行`jps`命令来检查所需的Hadoop进程是否正在运行。

2. 网络连接问题:请确保主节点(Master/192.168.52.136)可以与NameNode服务器正常通信。可以尝试使用telnet命令验证是否能够连接到localhost的9000端口,例如:`telnet localhost 9000`。如果无法连接,请检查网络配置并确保端口未被防火墙阻止。

3. Hadoop配置错误:请检查Hadoop的核心配置文件(如`core-site.xml`和`hdfs-site.xml`)中的相关属性,特别是`fs.defaultFS`和`dfs.namenode.rpc-address`。确保它们正确的设置为NameNode的地址和端口。

4. 资源不足:如果系统资源不足,可能会导致Hadoop服务运行异常。请确保集群节点具有足够的内存和处理能力来支持Hadoop运行。

5.权限问题:请确保具有足够的权限来访问Hadoop集群。检查在运行Eclipse时使用的用户是否具有适当的权限。

此处是因为未访问到正确的地址端口导致无法与hdfs建立连接而导致的问题。

2.可能出现的问题

若出现“Exception in thread "main" java.io.FileNotFoundException: Path is not a file: /user/hadoop/input”的问题,可参考:

Hadoop集群环境下HDFS实践编程过滤出所有后缀名不为“.abc”的文件时运行报错:Path is not a file: /user/hadoop/input-CSDN博客Hadoop集群环境下HDFS实践编程过滤出所有后缀名不为“.abc”的文件时运行报错:Path is not a file: /user/hadoop/input的解决办法及问题分析https://blog.csdn.net/qq_67822268/article/details/135396792

四、源码

执行的任务是:假设在目录“hdfs://localhost:9000/user/hadoop”下面有几个文件,分别是file1.txt、file2.txt、file3.txt、file4.abc和file5.abc,这里需要从该目录中过滤出所有后缀名不为“.abc”的文件,对过滤之后的文件进行读取,并将这些文件的内容合并到文件“hdfs://localhost:9000/user/hadoop/merge.txt”中。

现附上源码如下:

java">import java.io.IOException;
import java.io.PrintStream;
import java.net.URI;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
 
/**
 * 过滤掉文件名满足特定条件的文件 
 */
class MyPathFilter implements PathFilter {
     String reg = null; 
     MyPathFilter(String reg) {
          this.reg = reg;
     }
     public boolean accept(Path path) {
        if (!(path.toString().matches(reg)))
            return true;
        return false;
    }
}
/***
 * 利用FSDataOutputStream和FSDataInputStream合并HDFS中的文件
 */
public class MergeFile {
    Path inputPath = null; //待合并的文件所在的目录的路径
    Path outputPath = null; //输出文件的路径
    public MergeFile(String input, String output) {
        this.inputPath = new Path(input);
        this.outputPath = new Path(output);
    }
    public void doMerge() throws IOException {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://localhost:9000");
          conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
        FileSystem fsSource = FileSystem.get(URI.create(inputPath.toString()), conf);
        FileSystem fsDst = FileSystem.get(URI.create(outputPath.toString()), conf);
                //下面过滤掉输入目录中后缀为.abc的文件
        FileStatus[] sourceStatus = fsSource.listStatus(inputPath,
                new MyPathFilter(".*\\.abc")); 
        FSDataOutputStream fsdos = fsDst.create(outputPath);
        PrintStream ps = new PrintStream(System.out);
        //下面分别读取过滤之后的每个文件的内容,并输出到同一个文件中
        for (FileStatus sta : sourceStatus) {
            //下面打印后缀不为.abc的文件的路径、文件大小
            System.out.print("路径:" + sta.getPath() + "    文件大小:" + sta.getLen()
                    + "   权限:" + sta.getPermission() + "   内容:");
            FSDataInputStream fsdis = fsSource.open(sta.getPath());
            byte[] data = new byte[1024];
            int read = -1;
 
            while ((read = fsdis.read(data)) > 0) {
                ps.write(data, 0, read);
                fsdos.write(data, 0, read);
            }
            fsdis.close();          
        }
        ps.close();
        fsdos.close();
    }
    public static void main(String[] args) throws IOException {
        MergeFile merge = new MergeFile(
                "hdfs://localhost:9000/user/hadoop/",
                "hdfs://localhost:9000/user/hadoop/merge.txt");
        merge.doMerge();
    }
}


http://www.niftyadmin.cn/n/5304282.html

相关文章

【unity】基于Obi的绳长动态修改(ObiRopeCursor)

文章目录 一、在运行时改变绳子长度:ObiRopeCursor1.1 Cursor Mu(光标μ)1.2 Source Mu(源μ)1.3 Direction(方向) 一、在运行时改变绳子长度:ObiRopeCursor Obi提供了一个非常通用的组件来在运行时修改绳…

深入了解 Vite:快速、简洁、高效的前端构建工具(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

全屏字幕滚动APP:12月份广告总收:84.89元(2023年12月份) 穿山甲SDK接入收益·android广告接入·app变现·广告千展收益·eCPM收益

接入穿山甲SDK app示例: android 数独小游戏 经典数独休闲益智 广告接入示例: Android 个人开发者如何接入广告SDK,实现app流量变现 2023年12月份,总新增用户1242 友盟统计: 12月份:总新增用户1242 2023年12月份…

6.vue学习笔记(style绑定+监听器+表单的输入绑定)

文章目录 1.style绑定2.监听器3.表单的输入绑定3.1.复选框3.2.修饰符3.2.1 .lazy 1.style绑定 数据绑定的一个常见需求场景是操纵元素的 CSS style列表,因为style是attribute,我们可以和其他attribute一样使用v-bind将它们和动态字符串绑定。 但是&…

盲盒、一番赏小程序搭建,打开线上盲盒市场

近几年,我国潮玩市场发展非常迅速,在互联网的影响下,盲盒更是迅速走红网络,深受年轻人的喜欢,各大社交平台上关于盲盒的讨论度也是层出不穷。 一番赏与盲盒的机制都是差不多的,盲盒是在包装一样的盒子中放…

python识别验证码+灰度图片base64转换图片

一、为后面识别验证码准备 1、base64转换为图片,保存本地、并且置灰 上文中的base64,后面的就是包含Base64编码的PNG图像的字符串复制下来 import base64 from PIL import Image import io# 这里是你的Base64编码的字符串 base64_data "iVBORw0KGgoAAAANSUhE…

海康威视摄像头+服务器+录像机配置校园围墙安全侦测区域入侵侦测+越界侦测.docx

一、适用场景 1、校园内,防止课外时间翻越围墙到校外、从校外翻越围墙到校内; 2、通过服务器摄像头的侦测功能及时抓图保存,为不安全因素提供数字化依据; 3、网络录像机保存监控视频,服务器保存抓拍到的入侵与越界&am…

PyTorch|在张量运算中使用GPU

pytorch在张量运算时允许我们在GPU上进行计算,我们可以采用这些方法将数据无缝的移入或移出GPU。 当我们进入GPU时,我们可以使用cuda()方法,当我们进入CPU时,我们可以使用cpu()方法。 同时,我们还可以使用to()方法&a…