HDFS教程和命令
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 常用命令
-
启动Hadoop集群
#sbin/start-dfs.sh
#sbin/start-yarn.sh
-
-help:输出命令的帮助信息
#hadoop fs -help rm
-
-ls:显示目录信息
#hadoop fs -ls /
-
-mkdir:在HDFS上创建目录
#hadoop fs -mkdir -p /0x01/usr
-
-moveFromLocal:从本地剪切到HDFS
#hadoop fs -moveFromLocal /src /target
-
-appendToFile:追加一个文件到已经存在的文件末尾
#hadoop fs -appendToFile /src /target
-
-cat:显示文件内容
#hadoop fs -cat /0x01/usr/nametest
-
-chgrp、-chmod、-chown:与Linux系统中的用法一致,修改文件所属权限
初始状态:
增加执行权限:
结果如下:
更改组:
结果如下:
更改所属者:结果如下:
-
-copyFromLocal:从本地系统中拷贝文件到HDFS路径中
-
-copyToLocal:从HDFS上拷贝文件到本地
-
-cp:从HDFS的一个路径拷贝到另一个路径
#hadoop fs -cp /src /target
-
-mv:在HDFS路径间移动文件
#hadoop fs -mv /src /target
-
-get:等同于copyFromLocal,就是从HDFS下载文件到本地。
-
-getmerge:合并下载多个文件,比如HDFS的目录/logs下有log.1、log.2、log.3
-
-put:等同于copyFromLocal
#hadoop -put /src /target
-
tail:显示一个文件的结尾
#hadoop fs -tail /0x01/usr/nametest
-
-rmdir:删除空的路径
-
-du:统计文件夹的大小信息
-
-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
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22 -
excel打印预览压线压字怎么办
PHP中文网 06-22