Hadoop学习笔记(二)Hadoop 分布式文件系统 HDFS:1.HDFS基础

  • 第1章 HDFS概述

    • 1.1 HDFS产出背景及定义

      • 1.1.1 HDFS产生背景
        随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种。

      • 1.1.2 HDFS定义
        HDFS(Hadoop Distributed File System),它是一个文件系,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由于很多服务器联合起来实现其功能,集群中的服务器有各自的角色
        HDFS的使用场景:适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用。

    • 1.2 HDFS优缺点

      • 1.2.1 优点
        1)高容错性

          ① 数据自动保存多个副本
          ② 某一个副本丢失以后,它可以自动恢复
        

        2)适合处理大数据

          ①数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据;
          ②文件规模:能够处理百万规模以上的文件数量,数量相当之大
        

        3)可构建在廉价机器上,通过多副本机制,提高可靠性

      • 1.2.2 缺点
        1)不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。
        2)无法高效的对大量小文件进行存储

          ①存储大量小文件的话,它会占用NameNode大量的内存来存储文件目录和块信息。这样是不可取的,因为NameNode的内存总是有限的
          ②小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标
        

        3)不支持并发写入,文件随机修改

          ①一个文件只能有一个写,不允许多个线程同时写入
          ②仅支持数据append(追加),不支持文件的随机修改
        
    • 1.3 HDFS组成架构
      1)NameNode(nn):就是Master,它是一个主管、管理者

        ①管理HDFS的名称空间
        ②配置副本策略
        ③管理数据块(Block)映射信息
        ④处理客户端读写请求
      

    2)DataNode:就是Slave。NameNode下达命令,DataNode执行实际的操作

     	①存储实际的数据块
     	②执行数据块读/写操作
    

    3)Client:就是客户端

     	①文件切分。文件上传HDFS的时候,Client将文件切分成一个个的Block,然后进行上传
     	②与NameNode交互,获取文件的位置信息
     	③与DataNode交互,读取或者写入数据
     	④Client提供一些命令来管理HDFS,比如NameNode格式化
     	⑤Client可以通过一些命令来访问HDFS,比如对HDFS增删查改操作
    

    4)SecondaryNameNode:并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。

     	①在辅助NamNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode
     	②在紧急情况下,可辅助恢复NameNode
    
    • 1.4 HDFS文件文件块大小(面试重点)

      HDFS中的文件在物理上是分块存储(Block),块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在Hadoop2.x版本中是128M,老版本中是64M。
      在这里插入图片描述
      思考:为什么块的大小不能设置太小,也不能设置太大?

      ①HDFS的块太小,会增加寻址时间,程序一直在找块的开始位置
      ②如果块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序在处理这块数据时,会非常慢。

      总结:HDFS块的大小设置主要取决于磁盘传输速率。

  • 第2章HDFS的Shell操作(开发重点)

    • 1.基本语法

    bin/hadoopfs 具体命令 或者 bin/hdfsdfs 具体命令
    dfs是fs的实现类。

    • 2.常用命令实操

    (0)启动Hadoop集群(方便后续的测试)

    [hadoop@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
    [hadoop@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh
    

    (1)-help:输出这个命令参数

    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -help rm
    

    (2)-ls:显示目录信息

    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -ls /
    

    (3)-mkdir:在HDFS上创建目录

    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -mkdir -p /sanguo/shuguo
    

    (4)-moveFromLocal:从本地剪切粘贴到HDFS

    [hadoop@hadoop102 hadoop-2.7.2]$ touch kongming.txt
    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -moveFromLocal ./kongming.txt /sanguo/shuguo
    

    (5)-appendToFile:追加一个文件到已经存在的文件末尾

    [hadoop@hadoop102 hadoop-2.7.2]$ touch liubei.txt
    [hadoop@hadoop102 hadoop-2.7.2]$ vi liubei.txt
    输入
    san gu mao lu
    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -appendToFile liubei.txt /sanguo/shuguo/kongming.txt
    

    (6)-cat:显示文件内容

    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -cat /sanguo/shuguo/kongming.txt
    

    (7)-chgrp、-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限

    [hadoop@hadoop 102hadoop-2.7.2]$ hadoop fs -chmod 666 /sanguo/shuguo/kongming.txt
    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -chown hadoop:hadoop /sanguo/shuguo/kongming.txt
    

    (8)-copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去

    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -copyFromLocal README.txt /
    

    (9)-copyToLocal:从HDFS拷贝到本地

    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -copyToLocal /sanguo/shuguo/kongming.txt ./
    

    (10)-cp:从HDFS的一个路径拷贝到HDFS的另一个路径

    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -cp /sanguo/shuguo/kongming.txt /zhuge.txt
    

    (11)-mv:在HDFS目录中移动文件

    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -mv/zhuge.txt /sanguo/shuguo/
    

    (12)-get:等同于copyToLocal,就是从HDFS下载文件到本地

    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -get /sanguo/shuguo/kongming.txt ./
    

    (13)-getmerge:合并下载多个文件,比如HDFS的目录/user/hadoop/test下有多个文件:log.1,log.2,log.3,…

    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -getmerge /user/hadoop/test/* ./zaiyiqi.txt
    

    (14)-put:等同于copyFromLocal

    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -put ./zaiyiqi.txt /user/hadoop/test/
    

    (15)-tail:显示一个文件的末尾

    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -tail /sanguo/shuguo/kongming.txt
    

    (16)-rm:删除文件或文件夹

    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -rm /user/hadoop/test/jinlian2.txt
    

    (17)-rmdir:删除空目录

    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -mkdir /test
    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -rmdir /test
    

    (18)-du统计文件夹的大小信息

    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -du -s -h /user/hadoop/test
    2.7 K /user/hadoop/test
    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -du -h /user/hadoop/test
    1.3  K  /user/hadoop/test/README.txt
    15        /user/hadoop/test/jinlian.txt
    1.4  K  /user/hadoop/test/zaiyiqi.txt
    

    (19)-setrep:设置HDFS中文件的副本数量

    [hadoop@hadoop102 hadoop-2.7.2]$ hadoop fs -setrep 10 /sanguo/shuguo/kongming.txt
    

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


  • 第三章 HDFS客户端操作(开发重点)

    • 1. HDFS客户端环境准备

      • 1.1、请参考文章:
        Windows10下搭建eclipse开发hadoop的开发环境
        其中的第一至四步骤。
      • 1.2、请参考文章:
        maven的安装、路径配置、修改库文件路径和eclipse中的配置,解决Eclipse使用Maven下载慢的问题
      • 1.3、创建一个maven工程HDFS
      • 1.4、 导入相应的依赖坐标加日志添加
        <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>
        
        添加完依赖后可能会有人的dependencies报jdk错误,原因在于JAVA_HOME配置里面有空格(这是不允许的)
        注意:如果Eclipse/Idea打印不出日志,在控制台上只显示
        1.log4j:WARN No appender scould be found for logger (org.apache.hadoop.util.Shell).
        2.log4j:WARN Please initialize the log4j system properly.
        3.log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#
        noconfig for more info.
        
        需要在项目的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
        
      • 1.5、创建包名:com.ali.hdfs
      • 1.6、 创建HdfsClient类
        public class HDFSClient {
        	public static void main(String[] args) throws IOException, Exception, URISyntaxException {
        
        		Configuration conf = new Configuration();
        //		conf.set("fs.defaultFS", "hdfs://192.168.220.201:9000");
        
        		// 1.获取hdfs客户端对象
        //		FileSystem fs = FileSystem.get(conf );
        		FileSystem fs = FileSystem.get(new URI("hdfs://192.168.220.201:9000"), conf, "hadoop");
        		//这一行代码相当于上面注释的两行代码
        		
        		// 2.在hdfs上创建路径
        		fs.mkdirs(new Path("/0219/table/output"));
        
        		// 3.关闭资源
        		fs.close();
        
        		System.out.println("over");
        		
        		FileSystem fileSystem = FileSystem.get(conf);
        	}
        }
        
      • 1.7、 执行程序
        运行时需要配置用户名称:右键->run as -> run configurations
        在这里插入图片描述
        注意:一定要先点一下Java Application创建一个新的HDFSClient(1)把老的HDFSClient删除掉。
        客户端去操作HDFS时,是有一个用户身份的。默认情况下,HDFS客户端API会从JVM中获取一个参数来作为自己的用户身份:
        -DHADOOP_USER_NAME=hadoop,hadoop为用户名称。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值