0
点赞
收藏
分享

微信扫一扫

hadoop——day4()

鱼满舱 2022-04-18 阅读 78
hadoop

HDFS

在这里插入图片描述

在这里插入图片描述

1.HDFS概述

1)HDFS定义

HDFS(Hadoop Distributed File System),
它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。

HDFS的使用场景:
适合一次写入,多次读出的场景。一个文件经过创建、写入和关闭之后就不需要改变。

2)优缺点:

优:

  • 高容错
    数据自动北方多个副本
    某个副本丢失,可以自动恢复
  • 适合大数据处理
  • 可以构建在廉价服务器上

缺:

  • 不适合低延时数据访问,毫秒级别做不到(mysql做得到)

  • 无法高效对大量的小文件进行存储

    大量小文件,占用NameNode大量的内存来存储文件目录和信息块,资源有限
    小文件的寻址可能超过读取时间,违背hdfs设计目标

  • 不支持并发写入,不支持文件随机修改(只能追加)

3)架构组成

在这里插入图片描述

  • NameNode(nn): 主管者
    管理hdfs名称空间
    配置副本策略
    管理数据块(block)映射信息
    处理客户端读写信息

  • DataNode:干活的,执行命令的
    存储实际的数据块
    执行数据块的读/写

  • Client: 客户端

    文件切分,文件上传hdfs时候,Client把文件切分为一个个的block,然后上传
    与Namenode交互,获取文件的位置
    与Datenode交互,读/写
    相关命令管理HDFS,比如格式化Namenode

  • SecondaryNameNode(2nn):秘书, 并不是NameNode的热备(NameNode挂掉,他不是马上代替它):
    辅助NameNode,分担工作
    紧急情况恢复NameNode,但不是完全恢复,毕竟是秘书

4)文件块大小(*面试题)

在这里插入图片描述

固态硬盘传输速率 200 - 300M/s 所以块的大小选择256M
机械硬盘:100M/s 块选128M

思考:为什么块的大小不能设置太大,或者太小?

  • 太小,增加寻址时间,
  • 太大,磁盘的传输数据明显大于定位这个块的所需的数据,导致程序程序处理这块数据效率低下

总结:HDFS块的大小取决于磁盘传输速率

2.HDFS的shell操作(*开发重点)

2.1 基本的语法:hadoop fs + 具体命令
或者,hdfs dfs + 具体命令(两者是一样的)

2.2 常用命令操作:

1. 准备工作

1)启动Hadoop集群(方便后续的测试)
2)-help:输出这个命令参数
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -help rm
3)创建/sanguo文件夹
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /sanguo

2. 上传

1)-moveFromLocal:从本地剪切粘贴到HDFS
[atguigu@hadoop102 hadoop-3.1.3]$ vim shuguo.txt
输入:
shuguo

[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -moveFromLocal ./shuguo.txt /sanguo

2)-copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
[atguigu@hadoop102 hadoop-3.1.3]$ vim weiguo.txt
输入:
weiguo

[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -copyFromLocal weiguo.txt /sanguo

3)-put:等同于copyFromLocal,生产环境更习惯用put
[atguigu@hadoop102 hadoop-3.1.3]$ vim wuguo.txt
输入:
wuguo

[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -put ./wuguo.txt /sanguo

4)-appendToFile:追加一个文件到已经存在的文件末尾
[atguigu@hadoop102 hadoop-3.1.3]$ vim liubei.txt
输入:
liubei

[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -appendToFile liubei.txt /sanguo/shuguo.txt

3. 下载

1)-copyToLocal:从HDFS拷贝到本地
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -copyToLocal /sanguo/shuguo.txt ./

2)-get:等同于copyToLocal,生产环境更习惯用get
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -get /sanguo/shuguo.txt ./shuguo2.txt

4. HDFS直接操作

1)-ls: 显示目录信息
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -ls /sanguo

2)-cat:显示文件内容
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -cat /sanguo/shuguo.txt

3)-chgrp、-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -chmod 666 /sanguo/shuguo.txt
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -chown atguigu:atguigu /sanguo/shuguo.txt

4)-mkdir:创建路径
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /jinguo

5)-cp:从HDFS的一个路径拷贝到HDFS的另一个路径
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -cp /sanguo/shuguo.txt /jinguo

6)-mv:在HDFS目录中移动文件
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -mv /sanguo/wuguo.txt /jinguo
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -mv /sanguo/weiguo.txt /jinguo

7)-tail:显示一个文件的末尾1kb的数据
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -tail /jinguo/shuguo.txt

8)-rm:删除文件或文件夹
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -rm /sanguo/shuguo.txt

9)-rm -r:递归删除目录及目录里面内容
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -rm -r /sanguo

10)-du统计文件夹的大小信息
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -du -s -h /jinguo
27 81 /jinguo(因为设置了三台机子副本 27*3=81)

[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -du -h /jinguo
14 42 /jinguo/shuguo.txt
7 21 /jinguo/weiguo.txt
6 18 /jinguo/wuguo.tx
说明:27表示文件大小;81表示27*3个副本;/jinguo表示查看的目录

11)-setrep:设置HDFS中文件的副本数量
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -setrep 10 /jinguo/shuguo.txt

注意:这里设置的副本数只是记录在NameNode的元数据中,是否真的会有这么多副本,还得看DataNode的数量。因为目前只有3台设备,最多也就3个副本,只有节点数的增加到10台时,副本数才能达到10。

3.HDFS的API操作(涉及到Maven操作?一下午学习Maven了)

客户端环境准备

1)找到资料包路径下的Windows依赖文件夹,拷贝hadoop-3.1.0到非中文路径(比如d:\)。
2)配置HADOOP_HOME环境变量
3)配置Path环境变量。
注意:如果环境变量不起作用,可以重启电脑试试。

验证:
Hadoop环境变量是否正常?双击winutils.exe,闪退就是成功了

如果报如下错误。说明缺少微软运行库(正版系统往往有这个问题)。再资料包里面有对应的微软运行库安装包双击安装即可。

4)在IDEA中创建一个Maven工程HdfsClientDemo,并导入相应的依赖坐标+日志添加

<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>3.1.3</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.30</version>
    </dependency>
</dependencies>

报错:version报错:
CSDN上搜索后,把这个项目的pom.xml文件拖到maven的bin目录下,然后cmd到mavenbin目录下,执行mvn clean install 慢慢等他下载。

在项目的src/main/resources目录下,新建一个文件,命名为“log4j.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
5)创建包名:com.atguigu.hdfs
6)创建HdfsClient类
public class HdfsClient {

@Test
public void testMkdirs() throws IOException, URISyntaxException, InterruptedException {

    // 1 获取文件系统
    Configuration configuration = new Configuration();

    // FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration);
    FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration,"atguigu");

    // 2 创建目录
    fs.mkdirs(new Path("/xiyou/huaguoshan/"));

    // 3 关闭资源
    fs.close();
}

}
7)执行程序
客户端去操作HDFS时,是有一个用户身份的。默认情况下,HDFS客户端API会从采用Windows默认用户访问HDFS,会报权限异常错误。所以在访问HDFS时,一定要配置用户。
org.apache.hadoop.security.AccessControlException: Permission denied: user=56576, access=WRITE, inode="/xiyou/huaguoshan":atguigu:supergroup:drwxr-xr-x

举报

相关推荐

-day4

Day4

day4 QT

Qt day4

QT DAY4

ARM day4 作业

Day4:录入、if、switch

QT作业day4

0 条评论