一、前提
1、安装好java的开发环境jdk
windows7环境下安装jdk
https://blog.csdn.net/weixin_40612128/article/details/121431327
2、安装java开发工具
下面2个开发工具随便安装一个就行,这里我使用的是IntelliJ IDEA
(1)windows7环境下安装IntelliJ IDEA
https://blog.csdn.net/weixin_40612128/article/details/121431750?spm=1001.2014.3001.5502
(2)windows7环境下安装eclpise
https://blog.csdn.net/weixin_40612128/article/details/121431523?spm=1001.2014.3001.5502
3、配置好maven
windows7环境下java开发环境之maven环境配置
https://blog.csdn.net/weixin_40612128/article/details/121432260?spm=1001.2014.3001.5502
二、创建maven项目
1、创建一个名为db_hadoop的项目
2、配置好maven的信息
3、引入hadoop依赖
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.2.0</version>
</dependency>
注意: (1)这里要点击右上角自动导入依赖!然后稍等一会就可以了。 (2)在pom.xml中要新建标签,在这个标签中复制上面的依赖!! 如下红色字体变为蓝色,说明依赖就下载并导入成功了
4、上传文件
代码如下:
package com.imooc.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.FileInputStream;
import java.net.URI;
/**
* Java代码操作HDFS
* 文件操作:上传文件、下载文件、删除文件
*
*/
public class HdfsOp {
public static void main(String[] args) throws Exception{
//创建一个配置对象
Configuration conf = new Configuration();
//指定HDFS的地址
conf.set("fs.defaultFS","hdfs://bigdata01:9000");
//获取操作HDFS的对象
FileSystem fileSystem = FileSystem.get(conf);
//获取HDFS文件系统的输出流
FSDataOutputStream fos = fileSystem.create(new Path("/user.txt"));
//获取本地文件的输入流
FileInputStream fis = new FileInputStream("D:\\user.txt");
//上传文件:通过工具类把输入流拷贝到输出流里面,实现本地文件上传到HDFS
IOUtils.copyBytes(fis,fos,1024,true);
}
}
运行代码,注意,要在D盘创建一个user.txt的文件!! 点击运行,发现如下报错,通过关键字发现是权限的问题!! 解决办法有两个
第一种:去掉hdfs的用户权限检验机制,通过在hdfs-site.xml中配置dfs.permissions.enabled为false即可
第二种:把代码打包到linux中执行
在这里为了在本地测试方便,我们先使用第一种方式
停止hadoop
stop-all.sh
修改配置文件,添加如下内容
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
重新启动集群
start-all.sh
重新执行代码
如下,发现报错没有了 此时,去hdfs上检查文件是否已经上传成功,如下发现文件成功上传到了hdfs了
hdfs dfs -ls /
hdfs dfs -cat /user.txt
最后,对代码进行封装提取 输入方法名称,这里我定义为put
5、下载文件
代码如下:
/**
* 下载文件
* @param fileSystem
* @throws IOException
*/
private static void get(FileSystem fileSystem) throws IOException{
//获取HDFS文件系统的输入流
FSDataInputStream fis = fileSystem.open(new Path("/test/hello.txt"));
//获取本地文件的输出流
FileOutputStream fos = new FileOutputStream("D:\\hello.txt");
//下载文件
IOUtils.copyBytes(fis,fos,1024,true);
}
执行代码,注意将上传的注释掉 检查D盘,发现文件就从hdfs上下载到D盘了
6、删除文件
代码如下:
/**
* 删除文件
* @param fileSystem
* @throws IOException
*/
private static void delete(FileSystem fileSystem) throws IOException{
//删除文件,目录也可以删除
//如果要递归删除目录,则第二个参数需要设置为true
//如果是删除文件或者空目录,第二个参数会被忽略
boolean flag = fileSystem.delete(new Path("/test/hello02.txt"),true);
if(flag){
System.out.println("删除成功!");
}else{
System.out.println("删除失败!");
}
}
执行代码,注意将上传、下载注释掉
然后去hdfs上检查文件是否被删除了
执行代码前 执行代码后,发现文件就被删除了
7、整个代码汇总
如下:
package com.imooc.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* Java代码操作HDFS
* 文件操作:上传、下载、删除文件
*/
public class HdfsOp {
public static void main(String[] args) throws Exception{
//创建一个配置对象
Configuration conf = new Configuration();
//指定HDFS的地址
conf.set("fs.defaultFS","hdfs://bigdata01:9000");
//获取操作HDFS的对象
FileSystem fileSystem =FileSystem.get(conf);
//上传文件
//put(fileSystem);
//下载文件
//get(fileSystem);
//删除文件
delete(fileSystem);
}
/**
* 文件上传
* @param fileSystem
* @throws IOException
*/
private static void put(FileSystem fileSystem) throws IOException {
//获取HDFS文件系统的输出流
FSDataOutputStream fos = fileSystem.create(new Path("/user.txt"));
//获取本地文件的输入流
FileInputStream fis = new FileInputStream("D:\\user.txt");
//上传文件:通过工具类把输入流拷贝到输出流里面,实现本地文件上传到HDFS
IOUtils.copyBytes(fis,fos,1024,true);
}
/**
* 下载文件
* @param fileSystem
* @throws IOException
*/
private static void get(FileSystem fileSystem) throws IOException{
//获取HDFS文件系统的输入流
FSDataInputStream fis = fileSystem.open(new Path("/test/hello.txt"));
//获取本地文件的输出流
FileOutputStream fos = new FileOutputStream("D:\\hello.txt");
//下载文件
IOUtils.copyBytes(fis,fos,1024,true);
}
/**
* 删除文件
* @param fileSystem
* @throws IOException
*/
private static void delete(FileSystem fileSystem) throws IOException{
//删除文件,目录也可以删除
//如果要递归删除目录,则第二个参数需要设置为true
//如果是删除文件或者空目录,第二个参数会被忽略
boolean flag = fileSystem.delete(new Path("/test/hello02.txt"),true);
if(flag){
System.out.println("删除成功!");
}else{
System.out.println("删除失败!");
}
}
}
8、log4j配置
注意,我们在执行代码的时候,发现控制台有一些红色的报错信息,这个是因为缺少日志的配置,下面进行配置下,执行代码就不会报错了。 1:pom.xml中增加log4j依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.10</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.10</version>
</dependency>
2:resources目录下添加log4j.properties文件
在项目的src\main\resources目录中添加log4j.properties
log4j.properties文件内容如下:
log4j.rootLogger=info,stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
再执行代码,发现就不会有那些红色的警告信息了。
|