大数据---Hadoop集群搭建之HDFS

一 概念

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 文件下面 多了 3666
    
  • -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 可以获取块信息

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值