(一)hadoop集群搭建——1.4hdfs的操作
1.HDFS介绍
1.1HDFS特点
a. HDFS是分布式文件管理系统中的一种,适用一次写入,多次读取,不支持对文件的随机写,可以追加,但不能进行修改。
原因:
- 文件在HDFS存储时,以block为基本单位存储,修改一个块中的内容,就会影响当前快之后所有的块,效率低。
- 没有对文件提供在线寻址功能。
b. HDFS具有高容错性,保存数据自动保存多个副本;适合处理大数据;可构建在廉价机器上。
c. HDFS不适合低延时数据访问,无法对大量小文件进行存储,不支持并发写入、文件随机修改。
1.2HDFS文件块大小
块大小取绝于dfs.blocksize,默认为128M,默认为128M原因,基于最佳传输损耗理论。
最佳传输损耗理论:在一次传输中,寻址时间占用总传输时间的1%时,本次传输的损耗最小,为最佳性价比传输。
2.HDFS的shell操作
- 统计文件数
[hzhao@h2 ~]$ hadoop fs -count -h / 7 0 0 /
- 查看文件大小
[hzhao@h2 ~]$ hadoop fs -du / 0 /tmp
- hadoop fs既可以对本地文件系统进行操作,还可以操作分布式文件系统;hdfs dfs只能操作分布式文件系统。
3.使用java客户端操作hdfs
3.1windows安装hadoop并配置到环境变量中。
3.2创建项目
使用idea创建maven工程,并导入相关依赖,pom.xml内容为
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.fanbai</groupId>
<artifactId>hadoop</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<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>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
</dependencies>
</project>
3.3java客户端创建目录
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
public class TestHDFS {
private FileSystem fs;
private Configuration conf = new Configuration();
@Before
public void init() throws URISyntaxException, IOException, InterruptedException {
fs = FileSystem.get(new URI("hdfs://h1:9000"), conf, "hzhao");
}
@After
public void close() throws IOException {
fs.close();
}
/**
* 创建目录:hadoop fs -mkdir 目录名
* @throws IOException
*/
@Test
public void testMkdir() throws IOException{
//创建一个客户端对象
fs.mkdirs(new Path("/idea"));
fs.close();
}
}
目录创建成功
3.4上传文件
/**
* 上传文件:hadoop fs -put 本地文件 hdfs
*/
@Test
public void testUpload() throws IOException {
fs.copyFromLocalFile(new Path("D:\\tmp\\test.txt"), new Path("/"));
}
文件上传成功
3.5文件下载
/**
* 下载文件:hadoop fs -get hdfs 本地文件
*/
@Test
public void testDownload() throws IOException {
fs.copyToLocalFile(new Path("/idea"), new Path("D:\\tmp"));
}
3.6文件删除
/**
* 文件删除:hadoop fs -rm -rf 路径
*/
@Test
public void testDelete() throws IOException {
fs.delete(new Path("/idea"), true);
}
3.7文件重命名
/**
* 文件重命名:hadoop fs -mv 源文件 目标文件
*/
@Test
public void testRename() throws IOException {
fs.rename(new Path("/test.txt"), new Path("/testRename.txt"));
}
3.8判断路径是否存在
/**
* 判断当前路径是否存在
*/
@Test
public void fileIsExist() throws IOException {
System.out.println(fs.exists(new Path("/idea")));
}
3.9判断路径是目录还是文件
/**
* 判断当前路径是目录还是文件
*/
@Test
public void idDirOrFile() throws IOException {
Path path = new Path("/idea");
FileStatus fileStatus = fs.getFileStatus(path);
System.out.println("是否是目录:" + fileStatus.isDirectory());
System.out.println("是否是文件:" + fileStatus.isFile());
}