一 概念
1 生产背景
- 管理多台机器上的文件,这就是分布式文件管理系统
- HDFS 是分布式文件管理系统中一种
2 定义
- 文件系统用于存储文件,通过目录(树)来定位文件,其次它是分布式的,由很多服务器联合起来体现其功能,集群中的服务器有各自的角色
3 应用场景
- 适合一次写入 多次读出场景(不支持文件修改,支持文件追加)—适合做数据分析
4* 优缺点
- 优点
- 1 高容错性:通过自己保存多个副本形式(副本->服务器)&自动恢复
- 2 适合处理大数据:数据规模(GB-PB)级别的数据&文件规模(百万规模以上的文件数量)
- 3 可构建在“廉价”机器上,通过多副本机制,提供可靠性
- 缺点
- 1 不适合低/延数据访问,比如毫秒级的存储数据
- 2 无法高效对大量小文件进行存储
- 3 不支持并发写入,文件随机修改
二 HDFS 文件块大小
块大好还是小好
- 如果太小会增加寻址时间
- 如果太大从磁盘传输数据的时间,会明显大于定位这个块开始位置所需时间,导致程序处理这个块数据时会特别慢
- 总结:HDFS 块大小设置 主要取决于磁盘传输速率(128M/工业生产256&512M)
三 * HDFS 之 Shell 操作
1 基本语法:
- bin/hadoop fs == bin/hdfs dfs
2 常用命令实操
- 启动Hadoop集群(方便后续的测试)
sbin/start-dfs.sh
sbin/start-yarn.sh
- -help:输出这个命令参数
hadoop fs -help rm # 看一下 rm 是做什么的 参数是什么
- -ls: 显示目录信息
hadoop fs -ls / 查看根目录下目录信息
- -mkdir:在HDFS上创建目录
hadoop fs -mkdir -p /XXX/XXXX
- -moveFromLocal:从本地剪切粘贴到HDFS
- -appendToFile:追加一个文件到已经存在的文件末尾
- -cat:显示文件内容
- -chgrp 、-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限
- -copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
- -copyToLocal:从HDFS拷贝到本地
- -cp :从HDFS的一个路径拷贝到HDFS的另一个路径
- -mv:在HDFS目录中移动文件
- -get:等同于copyToLocal,就是从HDFS下载文件到本地
- -getmerge:合并下载多个文件,比如HDFS的目录 /user/atguigu/test下有多个文件:log.1, log.2,log.3,…
hadoop fs -getmerge /user/xxx/test/* ./zaiyiqi.txt 把HDFS 中test下所有文件 合并下载到本地 zaiyiqi.txt
- -put:等同于copyFromLocal
- -tail:显示一个文件的末尾
简单监控
hadoop fs -tail -f /input/xxx
123
aaa
我们往xxx 文件写入
hadoop fs -appendToFile -(标准输入) /input/xxx
666
666
666
^C
在另一个服务器就能看到 xxx 文件下面 多了 3行666
- -rm:删除文件或文件夹
- -rmdir:删除空目录
- -du统计文件夹的大小信息
- -setrep:设置HDFS中文件的副本数量
四 * HDFS 客户端操作前准备
1 .m2 配置
- 自定义默认仓库设置
- 1 直接放在c 盘–用户—skiin
- 2 在IDEA 中 Maven 【local respository】 设置创新项目的默认 maven 仓库地址 (而不是每次创建新项目值默认是C 盘 中.m2文件目录)
2.配置PC客户端hadoop 环境变量
配置环境变量
- 将hadoop 解压到一个盘里 复制其地址,在环境变量 添加
PATH 中增加
3 检查是否配置成功
- 在cmd执行 winutils 报找不到MSVCR100.dll
- https://www.microsoft.com/zh-TW/download/confirmation.aspx?id=13523 下载并执行
- 如果还报错 再下载 https://www.microsoft.com/zh-TW/download/details.aspx?id=8328 执行
- cmd 再次输入 winutils 只要不报错 显示一堆东西 就OK 了
4 安装依赖库 在本地使用API 执行
- 打开IDEA --new—project—Maven----next----命名(com.jiazeng)—存放地(不要存在根目录下)
<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>
5 添加依赖格式文件
需要在项目的src/main/resources目录下,新建一个文件,命名为“log4j.properties”,在文件中填入
(就是告诉log 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
6 客户端java 操作HDFS
src—main----java—创建一个包名(new package)com.jiazeng.hdfs-----创建主类HDFSClient
五* HDFS 的API 操作
1 新建文件
package com.jiazeng.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
public class HDFSClient {
@Test
public void mkdir() throws IOException,InterruptedException {
Configuration configuration = new Configuration();
//configuration.set("dfs.replication", "2");
FileSystem fs = FileSystem.get(URI.create("hdfs://hadoop102:9000"), configuration, "root");
// 2 新建文件 --操作集群
boolean mkdirs = fs.mkdirs(new Path("/test"));
if (mkdirs){
System.out.println("OK");
}else{
System.out.println("false");
}
}
}
2 优先级
本地(代码) > 依赖 > 默认
3 HDFS 文件夹删除
public class HDFSClient{
@Test
public void delete() throws IOException, InterruptedException {
// 1 获取FS 集群对象
Configuration configuration = new Configuration();
//configuration.set("dfs.replication", "2");
FileSystem fs/我们的集群 = FileSystem.get(new URI/统一资源标识符("hdfs://hadoop102:9000")/告诉客户端是哪个, configuration/new Configuration()(配置xml), user:"root/用户名");
// 2 新建文件 --操作集群
fs.delete(new Path("/log"),recursive:true/递归删除)
}
}
4 HDFS 查看
@Test
public void ls () throws IOException, InterruptedException,{
// 1获取文件系统
Configuration configuration = new Configuration();
FileSystem fs/我们的集群 = FileSystem.get(new URI/统一资源标识符("hdfs://hadoop102:9000")/告诉客户端是哪个, configuration/new Configuration()(配置xml), user:"root/用户名");
// 2 获取文件详情
FileStatus[] fileStatuses = fs.listStatus(new Path("/"))
for (FileStatus fileStatus:fileStatuses){
System.out.println("========================")
System.out.println('路径'+fileStatus.getPath())
System.out.println('大小'+fileStatus.getLen())
System.out.println('权限'+fileStatus.getPermission())
}
}
5 HDFS 查看文件(不能看到文件夹)
@Test
public void lf () throws IOException, InterruptedException,{
// 1获取文件系统
Configuration configuration = new Configuration();
FileSystem fs/我们的集群 = FileSystem.get(new URI/统一资源标识符("hdfs://hadoop102:9000")/告诉客户端是哪个, configuration/new Configuration()(配置xml), user:"root/用户名");
// 2 获取文件详情
RemoteIterator<LocatedFileStatus> files = fs.listFiles(new Path("/"),recursive:false);
while(listFiles.hasNext()){
LocatedFileStatus file = files.next(); 先取出来
// 输出详情
// 文件名称
System.out.println(status.getPath().getName());
// 长度
System.out.println(status.getLen());
// 权限
System.out.println(status.getPermission());
// 分组
System.out.println(status.getGroup());
// 获取存储的块信息
BlockLocation[] blockLocations = status.getBlockLocations();
}
6* Listfiles & ListStatus 取别
ListStatus :ls 可以显示文件夹 但是不能递归显示文件夹里面东西
Listfiles : 只能显示文件,但是可以递归显示所有子文件夹里的文件
hdfs:文件存在 datanode 上,文件夹不存在 (根据Hadoop UI 页面 replication 副本数 看到)
FileStatus 可以判断是文件还是文件夹
FileSystem 可以获取块信息