• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

HDFS教程和命令

武飞扬头像
jackalwonder
帮助2

HDFS

HDFS是Hadoop下的分布式文件管理系统,本文是于考试之前整理所写,希望对于即将考试,或是有意愿学习Hadoop的朋友能有所帮助=v=

1.1 HDFS概述

1.1_1 HDFS产生的背景

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

1.1_2 HDFS定义

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

HDFS适用的场景:适合一次写入、多次读出的场景,且不支持文件的修改。适合用于数据分析,不合适用于网盘。

1.2 HDFS优缺点

1.2_1 优点

- 高容错性

数据自动保存多个副本。通过增加副本的形式,提高容错性。某一个副本丢失之后,可以自动恢复。

- 适合处理大数据

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

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

1.2_2 缺点

  • 不适合低延时数据访问,比如毫秒级别的存储数据,是做不到的

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

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

  • 不支持并发写入、文件随即修改
    一个文件只能有一个写,不允许多个线程同时写入。

    仅支持数据追加(append),不支持文件的随机修改。

1.3 HDFS组成架构

学新通

1. NameNode(nn)

NameNode:就是master,是一个主管,管理者

主要功能:

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

2. DataNode(dn)

DataNode:就是slave。NameNode下达命令,DataNode执行命令

主要功能:

  • 存储实际的数据块。
  • 执行数据块的读/写操作。

3. Client

Client:客户端。

主要功能:

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

4. SecondaryNameNode

SecondaryNameNode:并非NameNode的热备。当NameNode挂掉时,不会马上替换NameNode并提供服务。

  • 辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode。
  • 紧急情况下,可以辅助恢复NameNode。

1.4 HDFS文件块的大小

HDFS中的文件在物理上是分块存储的(Block),块的大小可以通过参数dfs.blocksize设置,在Hadoop2.X版本中,默认大小是128MB,老版本是64MB,本地运行是32MB。
学新通
一个规定:当寻址时间为传输时间的1%时,为最佳状态

1.5 HDFS的Shell操作

1.5_1 基本语法

bin/hadoop fs 具体命令bin/hdfs dfs 具体命令,dfs是fs的实现类。

1.5_2 命令手册

在终端中输入 hdfs dfs即可查看

如下图:
学新通

1.5_3 常用命令

  1. 启动Hadoop集群

    #sbin/start-dfs.sh

    #sbin/start-yarn.sh

  2. -help:输出命令的帮助信息

    #hadoop fs -help rm
    学新通

  3. -ls:显示目录信息

    #hadoop fs -ls /学新通

  4. -mkdir:在HDFS上创建目录

    #hadoop fs -mkdir -p /0x01/usr
    学新通

  5. -moveFromLocal:从本地剪切到HDFS

    #hadoop fs -moveFromLocal /src /target
    学新通

  6. -appendToFile:追加一个文件到已经存在的文件末尾
    #hadoop fs -appendToFile /src /target
    学新通

  7. -cat:显示文件内容

    #hadoop fs -cat /0x01/usr/nametest
    学新通

  8. -chgrp、-chmod、-chown:与Linux系统中的用法一致,修改文件所属权限

    初始状态:
    学新通
    增加执行权限:
    学新通
    结果如下:学新通
    更改组:
    学新通
    结果如下:
    学新通
    更改所属者:

    学新通

    结果如下:

学新通

  1. -copyFromLocal:从本地系统中拷贝文件到HDFS路径中

    学新通

  2. -copyToLocal:从HDFS上拷贝文件到本地

    学新通

  3. -cp:从HDFS的一个路径拷贝到另一个路径

    #hadoop fs -cp /src /target

    学新通

  4. -mv:在HDFS路径间移动文件

    #hadoop fs -mv /src /target

    学新通

  5. -get:等同于copyFromLocal,就是从HDFS下载文件到本地。

  6. -getmerge:合并下载多个文件,比如HDFS的目录/logs下有log.1、log.2、log.3

    学新通

  7. -put:等同于copyFromLocal

    #hadoop -put /src /target

  8. tail:显示一个文件的结尾

    #hadoop fs -tail /0x01/usr/nametest
    学新通

  9. -rmdir:删除空的路径

  10. -du:统计文件夹的大小信息

学新通

  1. -setrep:设置HDFS中文件的副本数量

    #hadoop fs -setrep 10 /0x01/usr/nametest

    原始状态:

学新通

执行后状态学新通
学新通
PS:由于我的Hadoop集群只有三台机器 所以副本数量不能设置到3以上。

接下来的内容需要有一定的maven、java基础。可以选择在自己的windows上用IDEA做,或者在linux上编写进行,笔者选择在IDEA上进行,没办法 懒就一个字。开摆!!啊对对对!啊对对对!啊对对对!

1.6 HDFS客户端操作环境准备与测试

客户端分类:

  • Shell
    hadoop fs 以及 hdfs dfs
  • Java API

在自己的机器上安装Maven与JDK,笔者选择的是JDK17,MVN选择的是maven3.8.3。当然也可以选择其他版本,看个人喜好吧!

附上调用JAVA API的POM文件:

<?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>org.example</groupId>
    <artifactId>hadooptest</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <hadoop.version>2.7.2</hadoop.version>
    </properties>
    <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>${hadoop.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>com.young</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>
                                ${project.build.directory}/lib
                            </outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>
学新通

1.7 HDFS的API操作

Mkdir:

package edu.nefu;

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

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class Mkdir
{
    public static void main( String[] args ) throws IOException, Exception, URISyntaxException
    {
        Configuration conf = new Configuration();

        //1 获取hdfs客户端对象
        FileSystem fs = FileSystem.get(new URI("hdfs://hadoop1:9000"), conf, "root");

        //2 在hdfs上创建路径
        fs.mkdirs(new Path("/0x00/usr/root"));

        //3 关闭资源
        fs.close();
        System.out.println( "HDFS mkdir!" );
    }
}
学新通

Delete:

package edu.nefu;

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

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class Delete 
{
    public static void main( String[] args ) throws IOException, Exception, URISyntaxException
    {
	Configuration conf = new Configuration();

	//1 获取hdfs客户端对象
	FileSystem fs = FileSystem.get(new URI("hdfs://hadoop1:9000"), conf, "root");

	//2 文件删除 
	fs.delete(new Path("/0x00"), true);

	//3 关闭资源
	fs.close();
        System.out.println( "HDFS delete" );
    }
}

学新通

CopyFromLocal:

package edu.nefu;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

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

public class CopyFromLocal
{
    public static void main( String[] args ) throws IOException, Exception, URISyntaxException
    {
        Configuration conf = new Configuration();
        conf.set("dfs.replication","2");
        //1 获取hdfs客户端对象
        FileSystem fs = FileSystem.get(new URI("hdfs://hadoop1:9000"), conf, "root");

        //2 将本地文件上传到hdfs上
        fs.copyFromLocalFile(new Path("C:\\Users\\jackalwonder\\Workplace\\MavenProjects\\hadooptest\\pom.xml"),new Path("/0x00"));
        //3 关闭资源
        fs.close();
        System.out.println( "HDFS copy from local!" );
    }
}
学新通

CopyToLocal

package edu.nefu;

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

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class CopyToLocal 
{
    public static void main( String[] args ) throws IOException, Exception, URISyntaxException
    {
	Configuration conf = new Configuration();

	//1 获取hdfs客户端对象
	FileSystem fs = FileSystem.get(new URI("hdfs://hadoop1:9000"), conf, "root");

	//2 下载操作
	fs.copyToLocalFile(new Path("/0x00/pom.xml"), new Path("C:\\Users\\jackalwonder\\Workplace\\MavenProjects\\hadooptest\\src\\main"));

	//3 关闭资源
	fs.close();
        System.out.println( "HDFS copy to local" );
    }
}

学新通

Rename:

package edu.nefu;

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

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class Rename 
{
    public static void main( String[] args ) throws IOException, Exception, URISyntaxException
    {
	Configuration conf = new Configuration();

	//1 获取hdfs客户端对象
	FileSystem fs = FileSystem.get(new URI("hdfs://hadoop1:9000"), conf, "root");

	//2 文件更名
	fs.rename(new Path("/pom-r-1.xml"), new Path("/pom-r-x.xml"));

	//3 关闭资源
	fs.close();
        System.out.println( "HDFS rename" );
    }
}
ListFiles:
```java
package edu.nefu;

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

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.BlockLocation;

public class ListFiles 
{
    public static void main( String[] args ) throws IOException, Exception, URISyntaxException
    {
	Configuration conf = new Configuration();

	//1 获取hdfs客户端对象
	FileSystem fs = FileSystem.get(new URI("hdfs://hadoop1:9000"), conf, "root");

	//2 查看文件详情
	RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
	while (listFiles.hasNext())
	{
		LocatedFileStatus fileStatus = listFiles.next();
		// 查看文件名称、权限、长度、块信息
		System.out.println(fileStatus.getPath().getName());
		System.out.println(fileStatus.getPermission());
		System.out.println(fileStatus.getLen());
		BlockLocation[] blockLocations = fileStatus.getBlockLocations();
		for (BlockLocation blockLocation: blockLocations) 
		{
			String[] hosts = blockLocation.getHosts();
			for (String host: hosts) 
			{
				System.out.println(host);
			}
		}
        	System.out.println( "----------" );
	}

	//3 关闭资源
	fs.close();
        System.out.println( "HDFS list files" );
    }
}

学新通

ListStatus

package edu.nefu;

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

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.BlockLocation;

public class ListStatus 
{
    public static void main( String[] args ) throws IOException, Exception, URISyntaxException
    {
	Configuration conf = new Configuration();

	//1 获取hdfs客户端对象
	FileSystem fs = FileSystem.get(new URI("hdfs://hadoop1:9000"), conf, "root");

	//2 判断操作
	FileStatus[] listStatus = fs.listStatus(new Path("/"));
	for (FileStatus fileStatus: listStatus) 
	{
		if (fileStatus.isFile()) 
		{
			// 文件
        		System.out.println("f: " fileStatus.getPath().getName());
		} else
		{
			// 文件夹
        		System.out.println("d: " fileStatus.getPath().getName());
		}
	}

	//3 关闭资源
	fs.close();
        System.out.println( "HDFS list status" );
    }
}

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhibfcgg
系列文章
更多 icon
同类精品
更多 icon
继续加载