Hadoop 学习笔记(六)HDFS 客户端操作(上)
一、环境准备
将事先准备好的 Hadoop jar 文件安装到非中文无空格的路径下:
配置 环境变量
eclipse 创建 maven 项目,
pom.xml 引入一下依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.2</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.2</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.7.2</version> </dependency> <dependency> <groupId>jdk.tools</groupId> <artifactId>jdk.tools</artifactId> <version>1.8</version> <scope>system</scope> <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath> </dependency> </dependencies>
scr/main/resourses 下创建 log4j.properties 文件,黏贴一下内容并保存
log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n log4j.appender.logfile=org.apache.log4j.FileAppender log4j.appender.logfile.File=target/spring.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
二、测试环境是否可用
编写 HdfsTest 类;
public static Configuration conf = new Configuration(); @Test public void testMkdir() throws IOException, InterruptedException, URISyntaxException { // conf.set("fs.defaultFS", "hdfs://hadoop103:9000"); // 1、获取 HDFS 客户端对象 FileSystem fs = FileSystem.get(new URI("hdfs://hadoop103:9000"), conf, "hui"); // 2、创建路径 fs.mkdirs(new Path("/yttlj/emp")); fs.close(); System.out.println(" ok "); }
运行查看 HDFS
[hui@hadoop103 ~]$ hadoop fs -ls -R / drwxr-xr-x - hui supergroup 0 2020-09-09 13:17 /user drwxr-xr-x - hui supergroup 0 2020-09-09 13:20 /yttlj drwxr-xr-x - hui supergroup 0 2020-09-09 13:20 /yttlj/emp
至此:客户端环境搭建完毕。
三、HDFS 常用 API 操作
文件上传
// 2、文件上传 @Test public void putFileTest() throws IOException, InterruptedException, URISyntaxException { // 1、获取 fs 对象 FileSystem fs = FileSystem.get(new URI("hdfs://hadoop103:9000"), conf, "hui"); // 2、上传文件 // fs.copyFromLocalFile(new Path("E:/workspaced/data/zhouzhiruo.txt"), new // Path("/yttlj/emp")); // conf 个性化设置 // conf.set("dfs.replication", "2"); fs.copyFromLocalFile(new Path("E:/workspaced/data/zhouzhiruo.txt"), new Path("/yttlj/gmd/yangxiao.txt")); // 3、关闭资源 fs.close(); }
将hdfs-site.xml拷贝到项目的根目录下
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <!-- 设置副本数 为 1 --> <name>dfs.replication</name> <value>1</value> </property> </configuration>
参数优先级排序:(1)客户端代码中设置的值 >(2)ClassPath下的用户自定义配置文件 >(3)然后是服务器的默认配置。
HDFS 文件下载
// 3、文件下载 @Test public void gettFileTest() throws Exception { // 1、获取 fs 对象 FileSystem fs = FileSystem.get(new URI("hdfs://hadoop103:9000"), conf, "hui"); // 2、下载文件 // fs.copyFromLocalFile(new Path("E:/workspaced/data/zhouzhiruo.txt"), new // Path("/yttlj/emp")); // 直接从 HDFS 文件系统抓取数据到本地 // fs.copyToLocalFile(new Path("/yttlj/emp/zhouggl.txt"), new // Path("E:/workspaced/data/zhouggl.txt")); // false 是否删除 HDFS 文件系统文件,若删除相当于剪切,true 是否校验 fs.copyToLocalFile(false, new Path("/yttlj/emp/zhouggl.txt"), new Path("E:/workspaced/data/zhougg111l.txt"), true); fs.close(); }
HDFS 文件删除
// 3、文件删除 @Test public void deletetFileTest() throws Exception { // 1、获取 fs 对象 FileSystem fs = FileSystem.get(new URI("hdfs://hadoop103:9000"), conf, "hui"); // 2、删除文件 如果 删除的目录,true 则递归删除 fs.delete(new Path("/yttlj/emp"), true); fs.close(); }
HDFS 文件更新名称
// 4、文件更名 @Test public void updatFileTest() throws Exception { // 1、获取 fs 对象 FileSystem fs = FileSystem.get(new URI("hdfs://hadoop103:9000"), conf, "hui"); // 2、修改名称 fs.rename(new Path("/yttlj/gmd/yangxiao.txt"), new Path("/yttlj/gmd/yangxiao_buhui.txt")); fs.close(); }
HDFS 文件详情
// 5、查看文件详细信息 @Test public void lookFileInfoTest() throws Exception { // 1、获取 fs 对象 FileSystem fs = FileSystem.get(new URI("hdfs://hadoop103:9000"), conf, "hui"); // 2、查看文件详细信息 RemoteIterator<LocatedFileStatus> listFilesIterator = fs.listFiles(new Path("/"), true); while (listFilesIterator.hasNext()) { LocatedFileStatus fileStatus = listFilesIterator.next(); // 查看文件 名称 长度 权限 块信息 System.out.println(fileStatus.getPath().getName()); System.out.println(fileStatus.getPermission()); System.out.println(fileStatus.getLen()); System.out.println(fileStatus.getBlockSize()); BlockLocation[] blockLocations = fileStatus.getBlockLocations(); for (BlockLocation blockLocation : blockLocations) { String[] hosts = blockLocation.getHosts(); for (String host : hosts) { System.out.println(host); } } System.out.println("-------------------------------"); } fs.close(); }
HDFS 文件OR文件夹
//6、文件OR文件夹 @Test public void FileTest() throws Exception { // 1、获取 fs 对象 FileSystem fs = FileSystem.get(new URI("hdfs://hadoop103:9000"), conf, "hui"); // 2、获取文件信息 FileStatus[] fileStatus = fs.listStatus(new Path("/")); for (FileStatus fileStatu : fileStatus) { if(fileStatu.isFile()) { //文件 System.out.println(fileStatu.getPath().getName() +" isFile "); }else{ //文件夹 System.out.println(fileStatu.getPath().getName() +" isDir "); } } fs.close(); }