目录
- hadoop安装
- 1.hadoop集群规划
- 2.上传apache hadoop包并解压
- 3.修改配置文件
- (1)配置core-sit.xml
- (2)配置hdfs-sit.xml
- (3)配置hadoop-env.sh
- (4)配置mapred-site.xml
- (5)配置yarn-site.xml
- (6)mapred-env.sh
- (7)salve
- (8)其他操作
- 4.配置hadoop环境变量
- 5.启动集群
- (1)注意事项
- (2)三个端口查看界面
- HDFS基本概览
- 1.Client:就是客户端。
- 2.NameNode:就是 master,它是一个主管、管理者。
- 3.DataNode:就是Slave。NameNode 下达命令,DataNode 执行实际的操作。
- 4.Secondary NameNode:并非 NameNode 的热备。当NameNode 挂掉的时候,它并不 能马上替换 NameNode 并提供服务。
- 5.什么叫元数据信息
- HDFS基础命令行使用
- (1)显示文件列表
- (2)在整个目录下递归执行ls
- (3)创建目录
- (4)本地文件夹或文件上传到HDFS上(他属于拷贝到HDFS)
- (5)将本地文件上传到HDFS(他属于剪切到HDFS,本地文件消失)
- (6)将HDFS上文件拷贝到本地
- (7)将HDFS上的两个不同目录的移动
- (8)删除一个目录或文件
- (9)在HDFS上实现文件的拷贝
- (10)显示文件内容
- (11)改变文件权限
- (12)改变文件的所属用户和用户组
- (13)追加一个或者多个文件到hdfs指定文件中(或者叫合并文件)
- HDFS高级使用命令
- 1.HDFS文件限额配置
- (1)查看配额信息
- (2)数量限额
- (3)空间大小限额
- 2.安全模式
- 3.基准测试
- (1)测试写入速度
- (2)测试读取速度
- (3)清除测试数据
- HDFS元数据管理
- (1)fsimage 中的文件信息查看
- (2)edits 中的文件信息查看
- HDFS API接口操作
- 1.必不可少的准备工作
- (1)配置Windows下hadoop环境
- (2)导入Maven依赖
- (3)配置打印日志文件
- 2.使用url方式访问数据(简单了解就行,用的很少)
- 3.使用文件系统方式访问数据
- (1)涉及的主要类
- (2)获取FileSystem的几种方法
- 4.遍历HDFS所有文件
- 5.HDFS上创建文件夹,文件
- 6.文件的下载
- 7.HDFS文件的上传
- 8.hdfs的权限访问--伪装用户
- 9.小文件合并
- 10.判断目录是否存在,以及删除存在目录
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);
}