构建HDFS访问客户端对象
HDFS在生产生活中应用主要是客户端的开发,其核心步骤是从HDFS提供的API构建一个HDFS的访问客户端对象,通过该对象对HDFS上的文件进行增删改查
1.配置JAVA环境
首先电脑里cmd输入java -version 查看版本,如果没有出现下面图片这样的现象,那么说明你没有JAVA环境,可以去网上找资料配置JAVA环境(环境好久之前配置的了,没记录,就自己找一下吧)
2.下载安装包
下载eclipse 并安装 eclipse安装包 password:mua5 (workplace自己记住就行)
下载maven包 maven password:5ylo
3.配置eclipse
Window -----> Preferences ------> Java ------> Installed JREs ----> Add(将我们能的JDK找到放进去)
同时把Java ---> Comlier中的JDK 的版本改成自己的 (我的是1.8的)
修改maven,这个里面ADD的就是上面下载的那个,选在apache-maven-3.3.9就行
修改Maven中的 User Settings 修改Settings 路径是apache-maven-3.3.9/conf/settings.xml (记得修改settings.xml中的一个路径,因为你存的地方肯定和我不一样!)
4.新建工程
1.建立一个Maven Project 下面就是创建简单工程,取名啥的
2.引入依赖 在pom.xml下我们加入依赖关系
输入:
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
</dependency>
</dependencies>
3.保存之后更新配置
之后会产生一个包
在src/main/java下建立包,包下建立一个类
引入参数(出现红线,就按下ctrl+shift+o键进行填包,记得选在带hadoop的)
输入 :public class HDFS_CRUD {
FileSystem fs = null;
@Before // 此注解可以保证init方法在程序中最先执行
public void init() throws Exception{
// 构造一个配置参数对象,设置一个参数:要访问的hdfs的uri
Configuration conf = new Configuration();
// 这里指定使用的是hdfs
conf.set("fs.defaultFS", "hdfs://hadoop01:9000");// 此处使用主机名需要配置windows的host文件
// 通过如下的方式进行客户端身份的设置
System.setProperty("HADOOP_USER_NAME", "root");
// 通过FileSystem的静态方法获取文件系统客户端对象
fs = FileSystem.get(conf);
}
从客户端中上传文件(这里注意斜杠方向)
输入;
@Test
public void testAddFileToHdfs() throws IOException {
// 要上传的文件所在的路径
Path src = new Path("D:\\test.txt");
// 要上传到hdfs的目标路径
Path dst = new Path("/testFile"); // 一定注意此处的testFile就是上传到hdfs的文件的名字而不是文件夹
// 上传
fs.copyFromLocalFile(src, dst);
//关闭资源
fs.close();
}
从服务器下载文件(是不是感觉指令有那么一丝属性)
输入:// 从hdfs 中复制文件到本地文件系统
@Test
public void testDownloadFileToLocal() throws IOException {
// 下载文件
Path src = new Path("/long");
Path dst = new Path("D:/");
fs.copyToLocalFile(false,src, dst,true);
// 关闭资源
fs.close();
}
查看;删除;重命名文件
输入:
@Test
public void testMkdirAndDeleteAndRename() throws Exception {
// 创建目录
fs.mkdirs(new Path("/a/b/c"));
fs.mkdirs(new Path("/long/shi/san"));
// 重命名文件或文件夹
// fs.rename(new Path("/a"), new Path("/hahahahahaha"));
// 删除文件夹,如果是非空文件夹,参数2必须给值为true
// fs.delete(new Path("/hahahahahaha"),true);
}
查看文件目录
输入:
@Test
public void testListFiles() throws FileNotFoundException, IllegalArgumentException, IOException {
// 获取迭代器对象
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
while(listFiles.hasNext()) {
LocatedFileStatus fileStatus = listFiles.next();
// 打印当前文件名称
System.out.println(fileStatus.getPath().getName());
// 打印当前文件块大小
System.out.println(fileStatus.getBlockSize());
// 打印当前文件权限
System.out.println(fileStatus.getPermission());
// 打印当前文件内容长度
System.out.println(fileStatus.getLen());
// 获取该文件块信息(包括长度,数据块,datanode的信息)
BlockLocation[] blockLocations = fileStatus.getBlockLocations();
for (BlockLocation blockLocation : blockLocations) {
System.out.println("block-length:"+blockLocation.getLength()+" -- "+"block-offset:"+blockLocation.getOffset());
String[] hosts = blockLocation.getHosts();
for (String host : hosts) {
System.out.println(host);
}
}
System.out.println("--------------分割线---------");
}
}
执行一下看看
首先看一下我们hadoop目录下都有什么
实验现象
我们在d盘建立一个longshisan.txt传上去
右击函数,选择Run As 进行测试
第一个传输成功
第二个下载成功
第三个创建目录
第四个重命名
第五个删除
最后一个
今日HDFS访问结束!