大数据组件-Hadoop安装,HDFS命令行操作,HDFS高级使用命令,HDFS元数据管理,HDFS API接口操作

目录

hadoop安装

hadoop下载地址

1.hadoop集群规划

在这里插入图片描述

2.上传apache hadoop包并解压

cd /export/software
tar -zxvf hadoop-2.7.5.tar.gz -C ../servers/

3.修改配置文件

修改core-site.xml
第一台机器执行以下命令

cd  /export/servers/hadoop-2.7.5/etc/hadoop  #内部就是hadoop全部配置文件
ls

在这里插入图片描述

在这里我们使用vim修改hadoop的核心配置文件,不好看,也容易出错,
所以这里我们可以使用Notepad++远程登录到虚拟机,进行修改操作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(1)配置core-sit.xml

<configuration>
 
	<property>        
    	<name>fs.default.name</name>        
    	<value>hdfs://node01:8020</value>
   	</property>
   	<property>        
		<name>hadoop.tmp.dir</name>        
		<value>/export/servers/hadoop-2.7.5/hadoopDatas/tempDatas</value>
 
    </property>
 
    <!--  缓冲区大小,实际工作中根据服务器性能动态调整 -->
 
    <property>        
    	<name>io.file.buffer.size</name>       
     	<value>4096</value>    
     </property>
 
    <!--  开启hdfs的垃圾桶机制,删除掉的数据可以从垃圾桶中回收,单位分钟 -->    
    <property>        
    	<name>fs.trash.interval</name>        
    	<value>10080</value>    
    </property> 
</configuration>

(2)配置hdfs-sit.xml

<configuration>

	 <property>
			<name>dfs.namenode.secondary.http-address</name>
			<value>node01:50090</value>
	</property>

	<!-- 指定namenode的访问地址和端口 -->
	<property>
		<name>dfs.namenode.http-address</name>
		<value>node01:50070</value>
	</property>
	<!-- 指定namenode元数据的存放位置 -->
	<property>
		<name>dfs.namenode.name.dir</name>
		<value>file:///export/servers/hadoop-2.7.5/hadoopDatas/namenodeDatas,file:///export/servers/hadoop-2.7.5/hadoopDatas/namenodeDatas2</value>
	</property>
	<!--  定义dataNode数据存储的节点位置,实际工作中,一般先确定磁盘的挂载目录,然后多个目录用,进行分割  -->
	<property>
		<name>dfs.datanode.data.dir</name>
		<value>file:///export/servers/hadoop-2.7.5/hadoopDatas/datanodeDatas,file:///export/servers/hadoop-2.7.5/hadoopDatas/datanodeDatas2</value>
	</property>
	
	<!-- 指定namenode日志文件的存放目录 -->
	<property>
		<name>dfs.namenode.edits.dir</name>
		<value>file:///export/servers/hadoop-2.7.5/hadoopDatas/nn/edits</value>
	</property>
	

	<property>
		<name>dfs.namenode.checkpoint.dir</name>
		<value>file:///export/servers/hadoop-2.7.5/hadoopDatas/snn/name</value>
	</property>
	<property>
		<name>dfs.namenode.checkpoint.edits.dir</name>
		<value>file:///export/servers/hadoop-2.7.5/hadoopDatas/dfs/snn/edits</value>
	</property>
	<!-- 文件切片的副本个数-->
	<property>
		<name>dfs.replication</name>
		<value>3</value>
	</property>

	<!-- 设置HDFS的文件权限-->
	<property>
		<name>dfs.permissions</name>
		<value>true</value>
	</property>

	<!-- 设置一个文件切片的大小:128M-->
	<property>
		<name>dfs.blocksize</name>
		<value>134217728</value>
	</property>
</configuration>

(3)配置hadoop-env.sh

在这里插入图片描述

(4)配置mapred-site.xml

这里是没有这个mapred-site.xml这个文件的,但是有一个mapred-site.xml的模板文件,除去模板文件后缀,就是mapred-site.xml

<configuration>
	<!-- 开启MapReduce小任务模式 -->
	<property>
		<name>mapreduce.job.ubertask.enable</name>
		<value>true</value>
	</property>
	
	<!-- 设置历史任务的主机和端口 -->
	<property>
		<name>mapreduce.jobhistory.address</name>
		<value>node01:10020</value>
	</property>

	<!-- 设置网页访问历史任务的主机和端口 -->
	<property>
		<name>mapreduce.jobhistory.webapp.address</name>
		<value>node01:19888</value>
	</property>
</configuration>

(5)配置yarn-site.xml

<configuration>
	<!-- 配置yarn主节点的位置 -->
	<property>
		<name>yarn.resourcemanager.hostname</name>
		<value>node01</value>
	</property>
	<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property>
	
	<!-- 开启日志聚合功能 -->
	<property>
		<name>yarn.log-aggregation-enable</name>
		<value>true</value>
	</property>
	<!-- 设置聚合日志在hdfs上的保存时间 -->
	<property>
		<name>yarn.log-aggregation.retain-seconds</name>
		<value>604800</value>
	</property>
	<!-- 设置yarn集群的内存分配方案 -->
	<property>    
		<name>yarn.nodemanager.resource.memory-mb</name>    
		<value>20480</value>
	</property>

	<property>  
        	 <name>yarn.scheduler.minimum-allocation-mb</name>
         	<value>2048</value>
	</property>
	<property>
		<name>yarn.nodemanager.vmem-pmem-ratio</name>
		<value>2.1</value>
	</property>

</configuration>

(6)mapred-env.sh

在这里插入图片描述

(7)salve

node01
node02
node03

(8)其他操作

在第一台机器下执行以下操作

mkdir -p /export/servers/hadoop-2.7.5/hadoopDatas/tempDatas 
mkdir -p /export/servers/hadoop-2.7.5/hadoopDatas/namenodeDatas 
mkdir -p /export/servers/hadoop-2.7.5/hadoopDatas/namenodeDatas2 
mkdir -p /export/servers/hadoop-2.7.5/hadoopDatas/datanodeDatas 
mkdir -p /export/servers/hadoop-2.7.5/hadoopDatas/datanodeDatas2 
mkdir -p /export/servers/hadoop-2.7.5/hadoopDatas/nn/edits 
mkdir -p /export/servers/hadoop-2.7.5/hadoopDatas/snn/name 
mkdir -p /export/servers/hadoop-2.7.5/hadoopDatas/dfs/snn/edits

在这里插入图片描述
安装包分发

cd  /export/servers/ 
scp -r hadoop-2.7.5 node02:$PWD   # scp远程拷贝 -r是目录 拷贝内容:hadoop-2.7.5 拷贝给谁node02下当前目录(/export/servers)
scp -r hadoop-2.7.5 node03:$PWD

4.配置hadoop环境变量

三台机器都需要进行环境变量的配置

vim /etc/profile
export HADOOP_HOME=/export/servers/hadoop-2.7.5 
export PATH=:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

在这里插入图片描述

配置完成后生效

source /etc/profile

5.启动集群

要启动 Hadoop 集群,需要启动 HDFS 和 YARN 两个模块。 注意: 首次启动 HDFS 时,必须对 其进行格式化操作。 本质上是一些清理和 准备工作.

第一台机器执行以下命令

cd  /export/servers/hadoop-2.7.5/ 
bin/hdfs namenode -format # 首次启动的格式化操作 只有在第一次启动时操作
sbin/start-dfs.sh 
sbin/start-yarn.sh 
sbin/mr-jobhistory-daemon.sh start historyserver

(1)注意事项

  • 在启动hadoop时zookeeper要启动,要不hadoop也可能起不来
  • hadoop的core-sit.xml,里面的ip地址配置要正确,否则也会报错,导致NameNode启动失败

(2)三个端口查看界面

http://node01:50070/explorer.html/ 查看hdfs
http://node01:8088/cluster 查看yarn集群
http://node01:19888/jobhistory 查看历史完成的任务
注意事项:
上述web页面需要做windows的system32的hosts文件的域名映射
在这里插入图片描述

HDFS基本概览

HDFS由四部分组成,HDFS Client、NameNode、DataNode和Secondary NameNode

1.Client:就是客户端。

文件切分。文件上传 HDFS 的时候,Client 将文件切分成 一个一个的Block,然后进行存 储。
与 NameNode 交互,获取文件的位置信息。
与 DataNode 交互,读取或者写入数据。
Client 提供一些命令来管理 和访问HDFS,比如启动或者关闭HDFS。

2.NameNode:就是 master,它是一个主管、管理者。

管理 HDFS 的名称空间
管理数据块(Block)映射信息
配置副本策略
处理客户端读写请求。

3.DataNode:就是Slave。NameNode 下达命令,DataNode 执行实际的操作。

存储实际的数据块。
执行数据块的读/写操作。

4.Secondary NameNode:并非 NameNode 的热备。当NameNode 挂掉的时候,它并不 能马上替换 NameNode 并提供服务。

辅助 NameNode,分担其工作量。
定期合并 fsimage和fsedits,并推送给NameNode。
在紧急情况下,可辅助恢复 NameNode。

5.什么叫元数据信息

一个数据要有他的路径,名称,分别存储在那几个节点,被分成了几分,这就是元数据信息,类似于一个人的档案信息.
每一个文件就会产生一个元数据,就好比每一个人都会有一个自己的档案信息

HDFS基础命令行使用

(1)显示文件列表

hdfs dfs -ls 路径

(2)在整个目录下递归执行ls

hdfs dfs ls -R 路径

(3)创建目录

hdfs dfs mkdir [-p] 文件名称

(4)本地文件夹或文件上传到HDFS上(他属于拷贝到HDFS)

hdfs dfs -put <localsrc >  ... <dst>

(5)将本地文件上传到HDFS(他属于剪切到HDFS,本地文件消失)

hdfs dfs -moveFromLocal <localsrc >  ... <dst>

(6)将HDFS上文件拷贝到本地

hdfs dfs -get [ignorecrc] [-crc] <src> <localdst>

(7)将HDFS上的两个不同目录的移动

hdfs dfs -mv <src> <dest>

(8)删除一个目录或文件

hdfs dfs -rm [-r递归] [-skipTrash跳过回收站] 文件名称 

(9)在HDFS上实现文件的拷贝

hdfs dfs -cp <src> <dest>
# -f 如果文件存在将覆盖
# -p 深度拷贝,不仅拷贝文件内容,而且拷贝文件属性(时间戳,权限)

(10)显示文件内容

hdfs dfs -cat 文件名

(11)改变文件权限

hdfs dfs -chmod [-R递归] 777 文件路径

(12)改变文件的所属用户和用户组

hdfs dfs chown [-R递归] 用户:用户组 文件路径

(13)追加一个或者多个文件到hdfs指定文件中(或者叫合并文件)

hdfs dfs -appendToFile A文件 B文件 <dest>

使用场景:
HDFS比较适合大文件的存储,但是当我们的小文件比较多时,我们可以用此命令进行一个小文件的合并,来减少我们namenode的元数据压力.

HDFS高级使用命令

1.HDFS文件限额配置

(1)查看配额信息

hdfs dfs -count -p -h 文件路径

(2)数量限额

hdfs dfsadmin -setQuota 限额数量 <dest>

在这里插入图片描述

设置n个限额时,目录认定最多放置n-1,因为目录本身就占用了一个额度

hdfs dfsadmin -clrQuota <dest> # 清除文件数量限额

(3)空间大小限额

hdfs dfsadmin-setSpaceQuota 文件大小 <dest>

注意事项
这里设置限额大小最少必须是3倍的block块大小,也就是最少不能低于384M

hdfs dfsadmin -clrSpaceQuota <dest> # 清除空间配额限制

2.安全模式

安全模式是hadoop的保护机制,当启动hadoop就会自动进入安全模式时,会检查数据块的完整性
检查无误后,就会推出安全模式

hdfs dfsadmin -safemode get # 查看安全模式状态
hdfs dfsadmin -safemode enter # 进入安全模式
hdfs dfsadmin -safemode leave # 离开安全模式

3.基准测试

在生产环境中,hadoop搭建完成后第一件事情就是进行压力测试,测试我们的集群的读取和写入速度,测试我们的贷款是否足够

(1)测试写入速度

首先我们先切换到/export/servers下,因为执行以下命令会产生一个结果文件

hadoop jar /export/servers/hadoop-2.7.5/share/hadoop/mapreduce/hadoopmapreduce-client-jobclient-2.7.5.jar  TestDFSIO -write -nrFiles 10  fileSize 10MB

TestDFSIO表示进行dfsio测试,-write写入测试,nrFiles表示我们要进行多少个文件的测试,fileSize我们要测试的文件大小
在这里插入图片描述

完成之后看些入速度

hdfs dfs -text  /benchmarks/TestDFSIO/io_write/part-00000

(2)测试读取速度

测试hdfs的读取文件性能
在HDFS文件系统中读入10个文件,每个文件10M

hadoop jar /export/servers/hadoop-2.7.5/share/hadoop/mapreduce/hadoopmapreduce-client-jobclient-2.7.5.jar  TestDFSIO -read -nrFiles 10 fileSize 10MB
 

完成之后看些入速度

hdfs dfs -text  /benchmarks/TestDFSIO/io_write/part-00000

(3)清除测试数据

hadoop jar /export/servers/hadoop-2.7.5/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.5.jar TestDFSIO -clean

HDFS元数据管理

(1)fsimage 中的文件信息查看

使用命令 hdfs oiv

cd /export/servers/hadoop2.7.5/hadoopDatas/namenodeDatas 
hdfs oiv -i fsimage_0000000000000000864 -p XML -o hello.xml

-i表示我查看哪一个,-p表示我解析的方式,-o表示我要把它保存在哪个文件

(2)edits 中的文件信息查看

使用命令 hdfs oev

cd /export/servers/hadoop2.7.5/hadoopDatas/namenodeDatas 
hdfs oev -i  edits_0000000000000000865-0000000000000000866 -p XML -o myedit.xml 

-i表示我查看哪一个,-p表示我解析的方式,-o表示我要把它保存在哪个文件

HDFS API接口操作

1.必不可少的准备工作

(1)配置Windows下hadoop环境

在windows系统需要配置hadoop运行环境,,否则直接运行代码会出现以下问题:
问题一:
缺少winutils.exe

Could not locate executable null \bin\winutils.exe in the hadoop binaries 

问题二:
缺少hadoop.dll

Unable to load native-hadoop library for your platform… using builtin-Java classes where applicable 

解决以上问题办法:
第一步:将hadoop2.7.5文件夹拷贝到一个没有中文没有空格的路径下面
第二步:在windows上面配置hadoop的环境变量: HADOOP_HOME,并 将%HADOOP_HOME%\bin添加到path中
第三步:把hadoop2.7.5文件夹中bin目录下的hadoop.dll文件放到系统盘: C:\Windows\System32 目录
第四步:关闭windows重启

(2)导入Maven依赖

如果我们不知道我们都需要导入什么样的jar包,我们可以去中央仓库去看
hadoop配置中央仓库
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

    <dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>2.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-mapreduce-client-core</artifactId>
            <version>2.7.5</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
              	<!--编译插件-->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                    <!--    <verbal>true</verbal>-->
                </configuration>
            </plugin>
            <plugin>
            	<!--打包插件-->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <minimizeJar>true</minimizeJar>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

(3)配置打印日志文件

在resources下导入log4j.properties

# Configure logging for testing: optionally with log file

#log4j.rootLogger=debug,appender
log4j.rootLogger=info,appender  
#log4j.rootLogger=error,appender

#\u8F93\u51FA\u5230\u63A7\u5236\u53F0
log4j.appender.appender=org.apache.log4j.ConsoleAppender  
#\u6837\u5F0F\u4E3ATTCCLayout
log4j.appender.appender.layout=org.apache.log4j.TTCCLayout

2.使用url方式访问数据(简单了解就行,用的很少)

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
Ctrl+h显示该接口的实现类

import org.apache.commons.io.IOUtils;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.junit.Test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

public class HdfsApiDemo {
    @Test
    public void urlHdfs() throws IOException {
        //1.注册一个url
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
        //2.获取hdfs文件的输入流
        InputStream inputStream = new URL("hdfs://node01:8020/a.txt").openStream();
        //3.获取本地文件的输出流,(读入写出)
        FileOutputStream outputStream = new FileOutputStream(new File("./heoll.txt"));
        //4.实现文件的拷贝
        IOUtils.copy(inputStream,outputStream);
        //5.关闭
        IOUtils.closeQuietly(inputStream);
        IOUtils.closeQuietly(outputStream);
    }

}

3.使用文件系统方式访问数据

(1)涉及的主要类

Java操作HDFS所涉及的类

  • Configuration
    该类的对象封转了客户端或者服务器的配置
  • FileSystem
    该类的对象是一个文件系统对象, 可以用该对象的一些方法来对文件进行操作, 通过 FileSystem 的静态方法 get 获得该对象
FileSystem fs = FileSystem.get(conf)

而这里的conf就是Configuration 的实例

(2)获取FileSystem的几种方法

方法一:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.junit.Test;
import java.io.IOException;

public class HdfsApiDemo {
    @Test
    public void getFileSystem() throws IOException {
        //1.创建configuration对象
        Configuration configuration = new Configuration();
        //2.设置我们的文件系统类型
        /*
         param1:是固定的表示我要设置文件系统类型
         param2:是表示我要设置哪一种文件系统类型
         */
        configuration.set("fs.defaultFS","hdfs://node01:8020/");

        //3.获取指定的文件系统
        FileSystem fileSystem = FileSystem.get(configuration);
        System.out.println(fileSystem.toString());
    }
    
}


方法二:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;


public class HdfsApiDemo {
    @Test
    public void getFileSystem02() throws URISyntaxException, IOException {
        FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());
        System.out.println(fileSystem);

    }

}

方法三:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.junit.Test;
import java.io.IOException;



public class HdfsApiDemo {
    @Test
    public void getFileSystem03() throws IOException {
        Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS","hdfs://node01:8020");
        FileSystem fileSystem = FileSystem.newInstance(configuration);
        System.out.println(fileSystem.toString());

    }

}

方法四:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;


public class HdfsApiDemo {
    @Test
    public void getFileSystem04() throws URISyntaxException, IOException {
        FileSystem fileSystem = FileSystem.newInstance(new URI("hdfs://node01:8020"), new Configuration());
        System.out.println(fileSystem);
    }

}

4.遍历HDFS所有文件

package yuge;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;


public class HdfsApiDemo {
    @Test
    public void listMyFile() throws URISyntaxException, IOException {
        /*获取fileSystem类,不管你对hdfs做任何操作,第一步就是先要获取文件系统
        param1:hdfs路径
        param2:configuration对象
        */
        FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());
        /*
        获取RemoteIterator得到所有的文件或文件夹
        param1:指定遍历路径
        param2:是否要递归遍历
         */
        RemoteIterator<LocatedFileStatus> locatedFileStatusRemoteIterator = fileSystem.listFiles(new Path("/"), true);
        while (locatedFileStatusRemoteIterator.hasNext()){
            LocatedFileStatus next = locatedFileStatusRemoteIterator.next();
            System.out.println(next.getPath()+"---文件名为:"+next.getPath().getName());
            //还可以获取这个文件被切分成多少个block
            BlockLocation[] blockLocations = next.getBlockLocations(); //得到一个block数组
            System.out.println("block数:"+blockLocations.length); //我们看一下这个集合的长度就指定是几个bloc了
            
        }

    }
}

5.HDFS上创建文件夹,文件

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;


public class HdfsApiDemo {
    @Test
    public void mkdirs() throws URISyntaxException, IOException {
        //1.获取文件系统
        FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());
        //2.创建文件目录
        boolean mkdirs = fileSystem.mkdirs(new Path("/hello22/mkdir/test"));
        //3/创建文件
        fileSystem.create(new Path("/hello22/mkdir/test/a.txt"));
        fileSystem.close();
    }
}

6.文件的下载

方式1:

package yuge;


import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;


public class HdfsApiDemo {
    @Test
    public void getFileToLocal() throws IOException, URISyntaxException {
        //1.获取文件系统
        FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());
        //2.获取hdfs输入流(读入)
        FSDataInputStream inputStream = fileSystem.open(new Path("/a.txt"));
        //3.获取本地输出流(写出)
        FileOutputStream outputStream = new FileOutputStream(new File("./a.txt"));
        //4.拷贝
        IOUtils.copy(inputStream,outputStream); //(org.apache.commons.io)
        //5关闭流
        IOUtils.closeQuietly(inputStream);
        IOUtils.closeQuietly(outputStream);
        fileSystem.close();

    }
}

方式2:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;


public class HdfsApiDemo {
    @Test
   public void downloadFile() throws URISyntaxException, IOException {
        FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());
        //2.调用方式实现
        fileSystem.copyToLocalFile(new Path("/a.txt"),new Path("./a.txt"));
        fileSystem.close();
    }
}

7.HDFS文件的上传

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;


public class HdfsApiDemo {
    @Test
   public void downloadFile() throws URISyntaxException, IOException {
        FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());
        //2.调用方式实现
        fileSystem.copyFromLocalFile(new Path("/aaa.txt"),new Path("/"));
        fileSystem.close();
    }
}

8.hdfs的权限访问–伪装用户

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;


public class HdfsApiDemo {
    @Test
   public void downloadFile() throws URISyntaxException, IOException, InterruptedException {
        FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration(),"root");  //这里我们伪装成为root用户
        //2.调用方式实现
        fileSystem.copyFromLocalFile(new Path("./aaa.txt"),new Path("/"));
        fileSystem.close();
    }
}

9.小文件合并

方式一:

hdfs dfs -getmerge /*.xml[hdfs路径] ./big.xml[本地路径]

把hdfs根目录下.xml结尾的文件合并为big.xml文件并下载到本地

方式二:
我在上上传之前,就把小文件合并,上传hdfs直接上传合并后的大文件

import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;


public class HdfsApiDemo {
    @Test
    public void mergeFile() throws URISyntaxException, IOException, InterruptedException {
        //1.获取文件系统
        FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration(),"root");
        //2.写出,获取hdfs的大文件的字节输出流
        FSDataOutputStream outputStream = fileSystem.create(new Path("/bigfile.txt"));
        //3.获取本地文件系统
        LocalFileSystem local = FileSystem.getLocal(new Configuration());
        //4.通过本地文件系统,获取本地文件路径下文件列表
        FileStatus[] fileStatuses = local.listStatus(new Path(".\\cccc"));
        //5.每循环一次就把本地路径下一个小文件拷贝到hdfs的bigfile中
        for (FileStatus fileStatus : fileStatuses) {
            FSDataInputStream inputStream = local.open(fileStatus.getPath());
            IOUtils.copy(inputStream,outputStream);
        }
        IOUtils.closeQuietly(outputStream);


    }

}

10.判断目录是否存在,以及删除存在目录

Path path = new Path("hdfs:node01:8020/wordcount")
FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());
        //判断目录是否存在
        boolean b1 = fileSystem.exists(path);//返回的是布尔值
        if (b1){
            //删除目标目录
            /*
            param1:删除的文件路径
            param2:是否递归删除
            */
            fileSystem.delete(path,true); 
        }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值