0


实验二-HDFS编程

前提:在虚拟机中安装好Hadoop

参考文章:HDFS编程实践(Hadoop3.1.3)_厦大数据库实验室博客 (xmu.edu.cn)

实验要求

编写shell与Java代码检验分布式系统HDFS上是否存在一个input.txt,并对代码进行详细注释,通过流程图阐述数据查找过程。

实验步骤

     1. **做好前提准备**

** ①启动Hadoop**

     **②使用Hadoop内的hdfs创建文件夹用于存储文件,可以实现对照**

** 使用的命令为:./bin/hdfs/dfs -mkdir /input**

** ③上传本地文件到hdfs中**

** 使用的命令为:./bin/hdfs dfs -put /usr/local/hadoop/input/txt /input**

** 2. 使用shell编程实现判断文件是否存在,如存在就输出文件的内容。**

** ①命令行直接实现**

./bin/hdfs dfs -test -e /input/input.txt
echo $?
    **如果输出为 0 代表文件存在;如果输出为1,代表文件不存在。**

** ②通过shell编程实现文字版的输出**

** 3. 使用java代码判断文件是否存在,如存在就输出文件的内容。**

import java.io.BufferedReader;//java读取文件的相关包
import java.io.InputStreamReader;
//导入相关包
import org.apache.hadoop.conf.Configuration;//这个包是专门管理配置文件的
//这个包中包含了hadoop中所有关于文件管理的类,所有的都是继承它
import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;//可以读取url路径
import org.apache.hadoop.fs.FSDataInputStream;
//FileSystem对象中的open()方法返回的是FSDataInputStream对象,这个类是继承了java.io.DataInputStream接口的一个特殊类
//支持随机访问,可以从流中的任意位置读取数据

public class Hdfs {
    public static void main(String[] args){
        try{
            String fileName = "/input/input.txt";//文件的路径
            //加载配置项
            Configuration conf = new Configuration();
            
            conf.set("fs.defaultFS", "hdfs://192.168.43.100:8020");//文件系统的路径(这个需要看自己在配置core-site.xml时使用的路径)
            //DistributedFileSystem是在HDFS客户端的节点上,负责与HDFS集群进行交互,如在NameNode上读写元数据,在DataNode节点上读写数据等
            conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
            
            //创建文件系统实例
            FileSystem fs = FileSystem.get(conf);
            //判断文件是否存在
            if(fs.exists(new Path(fileName))){ 
                //如果文件存在就打印输出
                System.out.println("文件存在");
                //打印输出文本内容
                Path file = new Path(fileName); 
                FSDataInputStream getIt = fs.open(file);
               //缓冲区读取,避免了乱码现象
                BufferedReader d = new BufferedReader(new InputStreamReader(getIt));
                String line = null;
                System.out.println("文件的内容为:");
                while((line = d.readLine()) != null) {  
                    System.out.println(line);  
                }  
                d.close(); //关闭文件
            }else{
                System.out.println("文件不存在");
            }
            //如果报错的话,就打印输出错误信息
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

结果输出


小贴士

  1. 在Ubuntu中安装eclipse

教程:打开底部的软件安装软件-->搜索eclipse-->安装

  1. 创建Java project

将Hadoop相关的库导入

  1. 将Hadoop配置文件中的core-site.xml以及hdfs-site.xml复制到创建好的java project的bin目录下(要不然会报错的)


实验中遇到的问题及解决方法

  1. 实验中导包问题

在实验的过程中,按照林子雨老师的教程,只是把那几个Hadoop包导入进去就OK的,但是在实际中,还需要导入其他的库,其他库分别分布在Hadoop其他目录下,需要自己找一下。

(可能是我在安装Hadoop的时候放乱了)

贴一些因为jar包没导入而报的错

贴一些解决方法(其他库分别分布在Hadoop其他目录下,需要自己找一下)

Exception in thread “main” java.lang.NoClassDefFoundError: com/google/common/base/Preconditions_五道口纳什的博客-CSDN博客

org.apache.hadoop.util.PlatformName_鱿鱼ing的博客-CSDN博客

  1. 上传文件提示失败

这是因为DataNode节点没有启动成功

可以看另外一篇文章的文末

大数据技术原理与应用-实验一-Hadoop的安装与使用_临粤的博客-CSDN博客

  1. Caused by: java.net.ConnectException: 网络不可达 (connect failed)

解决方法:看java代码中连接hdfs的链接是否跟配置core-site.xml中hdfs的路径一致。我们在配置hdfs-site.xml时,里面可能填写的是IP地址+8020,但是在Java代码中我们填写了localhost+9000,两者不一致,导致连接不上。


实验参考厦门大学老师的hdfs编程教程

如果有什么错漏的地方,请各位大佬指教[抱拳]

标签: 大数据 hdfs hadoop

本文转载自: https://blog.csdn.net/weixin_51942429/article/details/127737254
版权归原作者 遮望眼 所有, 如有侵权,请联系我们删除。

“实验二-HDFS编程”的评论:

还没有评论