一脸懵逼学习hadoop之HDFS的java客户端编写

简介: 1:eclipse创建一个项目,然后导入对应的jar包: 鼠标右击项目,点击properties或者alt+enter快捷键--->java build path--->libraries--->add library--->user library--->next--->user librari...

1:eclipse创建一个项目,然后导入对应的jar包:

鼠标右击项目,点击properties或者alt+enter快捷键--->java build path--->libraries--->add library--->user library--->next--->user libraries--->new--->hdfsLib(根据自己的需要填写)---》add external jars(添加自己的需求包):

2:开始添加自己的需求包,路径如

  hadoop-2.4.1\share\hadoop\hdfs的hadoop-hdfs-2.4.1.jar和hadoop-2.4.1\share\hadoop\hdfs\lib下面的全部包;

  hadoop-2.4.1\share\hadoop\common的hadoop-common-2.4.1.jar和hadoop-2.4.1\share\hadoop\common\lib下面的全部包;

  1 package com.master01;
  2 
  3 import java.io.FileInputStream;
  4 import java.io.IOException;
  5 import java.net.URISyntaxException;
  6 
  7 import org.apache.commons.io.IOUtils;
  8 import org.apache.hadoop.conf.Configuration;
  9 import org.apache.hadoop.fs.FSDataOutputStream;
 10 import org.apache.hadoop.fs.FileStatus;
 11 import org.apache.hadoop.fs.FileSystem;
 12 import org.apache.hadoop.fs.LocatedFileStatus;
 13 import org.apache.hadoop.fs.Path;
 14 import org.apache.hadoop.fs.RemoteIterator;
 15 
 16 public class HdfsTest {
 17 
 18     
 19     //public FileSystem fs = null;
 20     /*
 21     @Before
 22     public void init() throws IOException, InterruptedException, URISyntaxException{
 23         //读配置文件
 24         Configuration conf = new Configuration();
 25         //这里直接拷贝配置或者直接设置值
 26         conf.set("fs.defaultFS", "hdfs://master:9000/");
 27         
 28         //获取配置文件里面的内容
 29         fs = FileSystem.get(conf);
 30         //fs = FileSystem.get(new URI("hdfs://master:9000"), conf, "root");
 31     }
 32     */
 33     
 34     
 35     /**
 36      * 上传文件
 37      * @throws IOException 
 38      */
 39     public static void upload() throws IOException{
 40         //读配置文件
 41         //读取classpath下的core-site.xml配置文件,并且解析其的内容,封装到conf的对象中;
 42         Configuration conf = new Configuration();
 43         //这里直接拷贝配置或者直接设置值
 44         //也可以在代码中对conf的配置信息进行手动设置,会覆盖配置文件中的配置信息
 45         conf.set("fs.defaultFS", "hdfs://master:9000");
 46         
 47         //获取配置文件里面的内容
 48         //根据配置信息,去获取一个具体文件系统的客户端操作实例对象
 49         FileSystem fs = FileSystem.get(conf);
 50         //本地文件是输入流,hdfs是输出流
 51         
 52         //先搞出路径
 53         Path src = new Path("hdfs://master:9000/aa/test.txt");
 54         //搞出输出流,即向hdfs上面写内容
 55         FSDataOutputStream create = fs.create(src);
 56         
 57         //输入流就是读,本地文件,输入流
 58         FileInputStream fileInputStream = new FileInputStream("d:/test.txt");
 59         
 60         //将文件fileInputStream到create即完成上传到hdfs
 61         IOUtils.copy(fileInputStream, create);
 62     }
 63     
 64     
 65     //最快的上传文件的方法
 66     public void upload02() throws IllegalArgumentException, IOException, InterruptedException, URISyntaxException{
 67         //读配置文件
 68         Configuration conf = new Configuration();
 69         //这里直接拷贝配置或者直接设置值
 70         conf.set("fs.defaultFS", "hdfs://master:9000");
 71         
 72         //获取配置文件里面的内容
 73         FileSystem fs = FileSystem.get(conf);
 74         //FileSystem fs = FileSystem.get(new URI("hdfs://master:9000"), conf, "root");
 75         fs.copyFromLocalFile(new Path("d:/test.txt"), new Path("hdfs://master:9000/aa/test.txt"));
 76     }
 77     
 78     
 79     /**
 80      * 下载文件
 81      * @throws IOException 
 82      * @throws IllegalArgumentException 
 83      */
 84     public void download02() throws IllegalArgumentException, IOException{
 85         //去配置文件
 86         Configuration conf = new Configuration();
 87         conf.set("fs.defaultFS", "hdfs://master:9000");
 88         
 89         //获取配置文件里面的内容
 90         FileSystem fs = FileSystem.get(conf);
 91         fs.copyToLocalFile(new Path("hdfs://master:9000/aa/test.txt"), new Path("d:/test2.txt"));
 92         
 93     }
 94     
 95     /***
 96      * 创建文件夹的方法
 97      * @throws IOException 
 98      */
 99     public void mkdir02() throws IOException{
100         //主配置文件
101         Configuration conf = new Configuration();
102         //设置配置文件的值
103         conf.set("fs.defaultFS", "hdfs://master:9000");
104         //获取配置文件里面的内容
105         FileSystem fs = FileSystem.get(conf);
106         
107         //文件夹的创建
108         fs.mkdirs(new Path("hdfs://master:9000/aaa/bbb/ccc"));
109     }
110     
111     
112     /**
113      * 删除文件
114      * @throws IOException 
115      */
116     public void remove02() throws IOException{
117         //主配置文件
118         Configuration conf = new Configuration();
119         //设置值
120         conf.set("fs.defaultFS", "hdfs://master:9000");
121         //获取配置文件里面的内容
122         FileSystem fs = FileSystem.get(conf);
123         
124         //执行删除操作
125         fs.delete(new Path("hdfs://master:9000/aaa/bbb/ccc"), true);
126     }
127     
128     /**
129      * 文件的移动
130      * @throws IOException 
131      */
132     public void move() throws IOException{
133         //主配置文件
134         Configuration conf = new Configuration();
135         //设置值
136         conf.set("fs.defaultFS", "hdfs://master:9000");
137         //获取配置文件里面的内容
138         FileSystem fs = FileSystem.get(conf);
139         
140         //移动操作
141         fs.rename(new Path("hdfs://master:9000/aa/test.txt"), new Path("hdfs://master:9000/aaa/bbb"));
142     }
143     
144     /***
145      * 查看文件的信息
146      * @throws IOException 
147      */
148     public void listFiles() throws IOException{
149         //主配置文件
150         Configuration conf = new Configuration();
151         //设置值
152         conf.set("fs.defaultFS", "hdfs://master:9000");
153         //获取配置文件里面的内容
154         FileSystem fs = FileSystem.get(conf);
155                 
156         //查看的是文件,不是文件夹
157         //listFiles列出的是文件信息,而且提供递归遍历
158         RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("hdfs://master:9000/"), true);
159         //迭代输出信息
160         while(listFiles.hasNext()){
161             LocatedFileStatus file = listFiles.next();
162             //文件路径
163             Path path = file.getPath();
164             System.out.println(path.getName());
165         }
166         
167         System.out.println("=============================================");
168         //listStatus列出文件和文件夹的信息,但是不提供自带的递归遍历
169         FileStatus[] listStatus = fs.listStatus(new Path("hdfs://master:9000/"));
170         /*for(int i = 0 ; i<listStatus.length; i++){
171             System.out.println(listStatus[i]);
172         }*/
173         for(FileStatus fileStatus : listStatus){
174             //根据获取的路径获取文件夹的名称
175             Path path = fileStatus.getPath();
176             System.out.println(path.getName());
177         }
178         
179     }
180     
181     public static void main(String[] args) {
182         HdfsTest hdfsTest = new HdfsTest();
183         try {
184             //上传文件的调用
185             //hdfsTest.upload02();
186             
187             //下载文件的调用
188             //hdfsTest.download02();
189             
190             //文件夹的创建
191             //hdfsTest.mkdir02();
192             
193             //删除操作
194             //hdfsTest.remove02();
195             
196             //移动文件的操作
197             //hdfsTest.move();
198             
199             //查看文件信息
200             hdfsTest.listFiles();
201         } catch (Exception e) {
202             e.printStackTrace();
203         }
204     }
205 
206 }

3:NameNode的职责

(1):维护元数据的信息;

(2):维护hdfs的目录树;

(3):响应客户端的请求;

 

目录
相关文章
|
3月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
110 43
Java学习十六—掌握注解:让编程更简单
|
3月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
50 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
2月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
2月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
103 4
|
2月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
3月前
|
存储 算法 Java
带你学习java的数组军队列
带你学习java的数组军队列
44 0
|
7天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
46 17
|
17天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
3天前
|
缓存 安全 算法
Java 多线程 面试题
Java 多线程 相关基础面试题
|
19天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。