暑假第七周总结

暑假第七周还是继续学习hadoop

一、什么是 HDFS

  1. HDFS: 是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。HDFS 的设计适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用。
  2. 文件系统
    • 概念: 文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的法。也指用于存储文件的磁盘或分区,或文件系统种类。
    • 文件系统由三部分组成:与文件管理有关软件、被管理文件以及实施文件管理所需数据结构。从系统角度来看,文件系统是对文件存储器空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。
    • 种类:目前的文件系统一般分为 FAT、NTFS、HFS(由苹果电脑开发,并使用在 Mac OS 上的文件系统)、Ext2、Ext3、Ext4(这 3 个是 Linux 系统中标准的文件系统)文件系统详细说明

二、HDFS 的组成

  • HDFS 集群包括,NameNode 和 DataNode 以及 Secondary Namenode
    • NameNode:负责管理整个文件系统的元数据,以及每一个路径(文件)所对应的数据块信息。
    • DataNode:负责管理用户的文件数据块,每一个数据块都可以在多个 datanode 上存储多个副本。
    • SecondaryNameNode:用来监控 HDFS 状态的辅助后台程序,每隔一段时间获取 HDFS 元数据的快照。

三、HDFS 文件块大小

  1. HDFS 中的文件在物理上是分块存储(block),块的大小可以通过配置参数 (dfs.blocksize) 来规定,默认大小在 hadoop2.x 版本中是 128M,老版本中是 64M;
  2. 块大小的设计

四、HFDS 命令行操作

1.  -help:输出这个命令参数: 
	hdfs dfs -help rm
2.  -ls: 显示目录信息:
	hadoop fs -ls /
3.  -mkdir:在hdfs上创建目录: 
	hadoop fs  -mkdir  -p  /aaa/bbb/cc/dd
4.  -moveFromLocal从本地剪切粘贴到hdfs:
	hadoop  fs  - moveFromLocal /home/hadoop/a.txt  /aaa/bbb/cc/dd
5.  -moveToLocal:从hdfs剪切粘贴到本地:
	hadoop  fs  - moveToLocal   /aaa/bbb/cc/dd  /home/hadoop/a.txt
6.  -appendToFile  :追加一个文件到已经存在的文件末尾:
	hadoop  fs  -appendToFile  ./hello.txt  /hello.txt
7.  -cat :显示文件内容
8.  -tail:显示一个文件的末尾:
	hadoop  fs  -tail  /weblog/access_log.1
9.  -text:以字符形式打印一个文件的内容:
	hadoop  fs  -text  /weblog/access_log.1
10. -chgrp 、-chmod、-chown:linux文件系统中的用法一样,修改文件所属权限:
	hadoop  fs  -chmod  666  /hello.txt
	hadoop  fs  -chown  someuser:somegrp   /hello.txt
11. -copyFromLocal:从本地文件系统中拷贝文件到hdfs路径去
	hadoop  fs  -copyFromLocal  ./jdk.tar.gz  /aaa/
12. -copyToLocal:从hdfs拷贝到本地
	hadoop fs -copyToLocal /aaa/jdk.tar.gz
13. -cp :从hdfs的一个路径拷贝到hdfs的另一个路径
	hadoop  fs  -cp  /aaa/jdk.tar.gz  /bbb/jdk.tar.gz.2
14. -mv:在hdfs目录中移动文件
	hadoop  fs  -mv  /aaa/jdk.tar.gz  /
15. -get:等同于copyToLocal,就是从hdfs下载文件到本地
	hadoop fs -get  /aaa/jdk.tar.gz
16. -getmerge  :合并下载多个文件,比如hdfs的目录 /aaa/下有多个文件:log.1, log.2,log.3,...
	hadoop fs -getmerge /aaa/log.* ./log.sum
17. -put:等同于copyFromLocal
	hadoop  fs  -put  /aaa/jdk.tar.gz  /bbb/jdk.tar.gz.2
18. -rm:删除文件或文件夹
	hadoop fs -rm -r /aaa/bbb/
19. -rmdir:删除空目录
	hadoop  fs  -rmdir   /aaa/bbb/ccc
20. -df :统计文件系统的可用空间信息
	hadoop  fs  -df  -h  /
21. -du统计文件夹的大小信息
	hadoop  fs  -du  -s  -h /aaa/*
22. -count:统计一个指定目录下的文件节点数量
	hadoop fs -count /aaa/
23. -setrep:设置hdfs中文件的副本数量
	hadoop fs -setrep 10 /aaa/jdk.tar.gz
	这里设置的副本数只是记录在namenode的元数据中,是否真的会有这么多副本,还得看datanode的数量。若目前只有3台设备,最多也就3个副本,只有节点数的增加到10台时,副本数才能达到10。

五、HDFS 客户端操作

  1. 此处创建一个 maven 项目
  • 项目结构:
  • hadoop-parent-------->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.ittzg.hadoop</groupId>
    <artifactId>hadoop-parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <hadoop.hdfs.version>2.4.1</hadoop.hdfs.version>
        <hadoop.common.version>2.4.1</hadoop.common.version>
        <hadoop.client.version>2.4.1</hadoop.client.version>
    </properties>
    <modules>
        <module>hadoop-hdfs-client</module>
    </modules>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
  • hadoop-hdfs-client--->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">
    <parent>
        <artifactId>hadoop-parent</artifactId>
        <groupId>com.ittzg.hadoop</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>hadoop-hdfs-client</artifactId>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>${hadoop.hdfs.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>${hadoop.common.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>${hadoop.client.version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
  1. HDFSClient.java----> 以下只是展示一些简单的应用,更多的 API 请自行查询 hadoopAPI 文档,附上链接:http://tool.oschina.net/apidocs/apidoc?api=hadoop
package com.ittzg.hadoop.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;


public class HDFSClient {
    Configuration configuration = new Configuration();
    FileSystem fileSystem = null;

    /**
     * 每次执行添加有@Test注解的方法之前调用
     */
    @Before
    public void init(){
        configuration.set("fs.defaultFs","hadoop-ip-101:9000");
        try {
            fileSystem = FileSystem.get(new URI("hdfs://hadoop-ip-101:9000"),configuration,"hadoop");
        } catch (Exception e) {
            throw new RuntimeException("获取hdfs客户端连接异常");
        }
    }
    /**
     * 每次执行添加有@Test注解的方法之后调用
     */
    @After
    public void closeRes(){
        if(fileSystem!=null){
            try {
                fileSystem.close();
            } catch (IOException e) {
                throw new RuntimeException("关闭hdfs客户端连接异常");
            }
        }
    }

    /**
     * 获取文件系统
     */
    @Test
    public void getFileSystem(){
        System.out.println(fileSystem.toString());
    }

    /**
     * 上传文件
     */
    @Test
    public void putFileToHDFS(){
        try {
            fileSystem.copyFromLocalFile(new Path("I:\\demo.txt"),new Path("/user/hadoop/hello.txt"));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }

    /**
     * 下载文件
     */
    @Test
    public void getFileFromHDFS(){
        try {
            fileSystem.copyToLocalFile(new Path("/user/hadoop/shaoniangexing.txt"),new Path("J:\\少年歌行.txt"));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }
    /**
     * 创建hdfs的目录
     * 支持多级目录
     */
    @Test
    public void mkdirAtHDFS(){
        try {
            boolean mkdirs = fileSystem.mkdirs(new Path("/user/hadoop/input"));
            System.out.println(mkdirs);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 修改hdfs上文件的名称
     */
    @Test
    public void renameFileAtHDFS(){
        try {
            fileSystem.rename(new Path("/user/hadoop/hello.txt"),new Path("/user/hadoop/少年歌行.txt"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 查看hdfs上的文件列表
     */
    @Test
    public void readFileListAtHDFS(){
        try {
            RemoteIterator<LocatedFileStatus> locatedFileStatusRemoteIterator = fileSystem.listFiles(new Path("/"),true);
            while (locatedFileStatusRemoteIterator.hasNext()){
                System.out.println(locatedFileStatusRemoteIterator.next().toString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 转载于:https://my.oschina.net/ittzg/blog/3065312
下周python
 
posted @ 2022-08-13 21:58  zrswheart  阅读(20)  评论(0编辑  收藏  举报