目录
1.1 解压hadoop-2.7.6.tar.gz到本地磁盘
1.3 由于Hadoop是在32位系统上编译的,并且对windows支持不好,所以需要把64的编译本地库文件(下图的两个文件),放入bin目录中。
1.5 如果报错:Error: JAVA_HOME is incorrectly set
一.IDEA远程管理HDFS
1.1 解压hadoop-2.7.6.tar.gz到本地磁盘
1.2 配置环境变量
- HADOOP_HOME: D:\apps\hadoop-2.7.6
- PATH: %HADOOP_HOME%\bin 和 %HADOOP_HOME%\sbin
1.3 由于Hadoop是在32位系统上编译的,并且对windows支持不好,所以需要把64的编译本地库文件(下图的两个文件),放入bin目录中。
1.4 验证环境变量
C:\Users\usr>hadoop version
1.5 如果报错:Error: JAVA_HOME is incorrectly set
那就找到etc/hadoop/下的hadoop-env.cmd,修改JAVA_HOME的内容如下格式即可
set JAVA_HOME=C:\PROGRA~1\Java\jdk1.8.0_221
如果还不好用,那么重新装一个JDK,路径上别带空格
1.6 提取HDFS的资源jar包
为了方便开发,我们可以将相关的jar提取出来。
1. 在hadoop-2.7.6目录下创建以上目录(参考图片)
2. 进入share目录中的doc子目录,搜索default.xml。将四个默认的xml文件copy到_default目录中,方便以后查看
3. 进入share目录中,搜索*.jar。将搜索到的所有jar文件copy到_jars目录下,重复的跳过。大约208个jar包左右。
4. 在_jars目录中,搜索test,将搜索到的jar包剪切到_tests目录下。这是一些关于程序测试的jar包,提取出来。大约36个左右
5. 在_jars目录中,搜索source,将搜索到的jar包剪切到_sources目录下。这些jar包是hadoop的源码包。想看源码的可以使用,大约28个
6. 此时,_jars目录中剩下的都是hadoop的相关api的jar包,大约144个。
1.7 打开IDEA新建个java项目
1.8 项目下新建一个lib文件夹
1.9 将_jars的所有jar包导入到lib中
1.10 新建个Test类
1.11 获取分布式文件系统对象
(注意这里导包,导的都要是hadoop的!!!!)
package com.csdn;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.junit.Test;
import java.io.IOException;
public class Test1 {
@Test
public void testGetFileSystem() throws IOException {
//创建配置对象,用于加载配置信息(四个默认的配置文件:core-default.xml,hdfs-default.xml,mapred-default.xml,yarn-default.xml)
Configuration conf = new Configuration();
//修改fs.defaultFS属性的值
conf.set("fs.defaultFS","hdfs://192.168.10.101:8020");
//使用FileSystem类的静态方法get(Configuration conf);返回fs.defaultFS定义的文件系统
FileSystem fs = FileSystem.get(conf);
System.out.println("文件系统对象的类型名:"+fs.getClass().getName());
}
}
1.12 通过IDEA对HDFS进行文件的上传和下载
@Test
public void testFileUpload() throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.10.101:8020");
FileSystem fs = FileSystem.get(conf);
//将本地的一个文件D:/file1,上传到HDFS上 /file1
//1. 使用Path描述两个文件
Path localPath = new Path("D:/file1");
Path hdfsPath = new Path("/file1");
//2.调用上传方法
fs.copyFromLocalFile(localPath,hdfsPath);
//3.关闭
fs.close();
System.out.println("上传成功");
}
@Test
public void testFileDownload() throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.10.101:8020");
FileSystem fs = FileSystem.get(conf);
//从HDFS上下载一个文件/file1,下载到本地 D:/file2
//1. 使用Path描述两个文件
Path hdfsfile = new Path("/file1");
Path local = new Path("D:/file2");
//2. 调用下载方法进行下载
fs.copyToLocalFile(hdfsfile,local);
fs.close();
System.out.println("下载成功");
}
1.13 通过IDEA进行对HDFS的目录创建和删除
@Test
public void testMkdir() throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.10.101:8020");
FileSystem fs = FileSystem.get(conf);
//1. 测试创建目录,描述一个目录
Path hdfsfile = new Path("/dir1");
//2. 调用创建目录的方法
fs.mkdirs(hdfsfile);
fs.close();
System.out.println("创建成功");
}
@Test
public void testDelete() throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.10.101:8020");
FileSystem fs = FileSystem.get(conf);
//1. 测试删除目录,描述一个目录
Path hdfsfile = new Path("/dir1");
//2. 调用创建目录的方法
fs.delete(hdfsfile,true);
fs.close();
System.out.println("删除成功");
}
1.14 通过IDEA实现对HDFS上文件的重命名
@Test
public void testRename() throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.10.101:8020");
FileSystem fs = FileSystem.get(conf);
//1. 测试重命名,将file1改为file01
Path oldName = new Path("/file1");
Path newName = new Path("/file01");
//2.调用重命名方法
fs.rename(oldName,newName);
fs.close();
System.out.println("命名成功");
}
1.15 通过IOUtils对文件进行上传和下载
@Test
public void putFile() throws IOException, URISyntaxException {
//1 连接HDFS 文件系统
Configuration conf=new Configuration();
//获得文件系统
FileSystem fs=FileSystem.get(new URI("hdfs://182.168.10.101:8020"),conf);
// 创建输入流,读取输入文件
FileInputStream input=new FileInputStream(new File("c://a.txt"));
// 创建输出流
FSDataOutputStream out=fs.create(new Path("/gg.txt"));
//IO的流拷贝
IOUtils.copyBytes(input, out, conf);
//关闭资源
IOUtils.closeStream(input);
IOUtils.closeStream(out);
System.out.println("上传完毕");
}
@Test
public void getFile() throws IOException, URISyntaxException {
// 1 连接HDFS 文件系统
Configuration conf = new Configuration();
// 获得文件系统
FileSystem fs = FileSystem.get(new URI("hdfs://192.168.10.101:8020"), conf);
// 获取输入流 从HDFS上读取
FSDataInputStream input=fs.open(new Path("/gg.txt"));
// 获取输出流
FileOutputStream out=new FileOutputStream(new File("c://gg.txt"));
//流拷贝
IOUtils.copyBytes(input, out, conf);
//关闭流
IOUtils.closeStream(input);
IOUtils.closeStream(out);
System.out.println("下载完成");
}
1.16 API之文件状态
@Test
public void testFileStatus() throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.10.101:8020");
FileSystem fs = FileSystem.get(conf);
//1. 描述你要读取的文件 /file02
Path path = new Path("/file02");
//获取文件的状态信息
RemoteIterator<LocatedFileStatus> it = fs.listLocatedStatus(path);
while(it.hasNext()){
// 取出对象
LocatedFileStatus status = it.next();
System.out.println("name:"+status.getPath());
//获取位置
BlockLocation[] locate = status.getBlockLocations();
for(BlockLocation bl:locate){
System.out.println("当前块的所有副本位置:"+Arrays.toString(bl.getHosts()));
System.out.println("当前块大小:"+bl.getLength());
System.out.println("当前块的副本的ip地址信息:"+Arrays.toString(bl.getNames()));
}
System.out.println("系统的块大小:"+status.getBlockSize());
System.out.println("文件总长度:"+status.getLen());
}
}
二.通过创建Maven项目连接HDFS
2.1 将Maven压缩包解压到本地磁盘
2.2 配置环境变量
Path:
2.3 修改settings.xml文件
2.3.1 指定本地仓库
2.3.2 指定aliyun镜像(下载资源速度更快)
2.4 创建maven项目
2.5 导入jar包依赖
2.6 验证连接
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.junit.Test;
import java.io.IOException;
public class Test2 {
@Test
public void testConnect() throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.10.101:8020/");
FileSystem fs = FileSystem.get(conf);
System.out.println(fs.getClass().getName());
fs.close();
}
}
(=-=今天就分享到这里,IDEA对HDFS的远程相关操作,切记导包的时候一定要注意,避免自动导包,导错包!)