文章目录

  • HDFS启动过程
  • 安全模式
  • 安全模式的管理命令
  • 常用参数
  • HDFS shell命令
  • HDFS读取数据流程
  • JAVA操作HDFS
  • 配置文件的优先级
  • 通过API下载HDFS上的文件


HDFS启动过程

  • 第一次启动
    第一次启动需要格式化namenode, 创建fsimage和edits, 第一次启动只需要加载fsimage
  • 非第一次启动
    如果不是第一次启动, 直接加载edits, fsimage镜像文件,合并成一个新的fsimage文件, 再创建edits 文件记录新的操作行为

安全模式

在启动的过程中, 会存在30秒的等待时间, 这个等待的时间就是安全模式

安全模式的管理命令

$HADOOP_HOME/bin/hdfs dfsadmin -safemode
进入安全模式的管理
[-safemode <enter | leave | get | wait>]

常用参数
get : 获得安全模式的状态
	enter : 进入安全模式, 在安全模式中只允许查询操作,  datanode要向 namenode汇报,块信息,以及数据的完整性
	leave : 离开安全模式
HDFS shell命令
[-appendToFile <localsrc> ... <dst>]
        [-cat [-ignoreCrc] <src> ...]
        [-checksum <src> ...]
        [-chgrp [-R] GROUP PATH...]
        [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
        [-chown [-R] [OWNER][:[GROUP]] PATH...]
        [-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>]
        [-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
        [-count [-q] [-h] <path> ...]
        [-cp [-f] [-p | -p[topax]] <src> ... <dst>]
        [-createSnapshot <snapshotDir> [<snapshotName>]]
        [-deleteSnapshot <snapshotDir> <snapshotName>]
        [-df [-h] [<path> ...]]
        [-du [-s] [-h] <path> ...]
        [-expunge]
        [-find <path> ... <expression> ...]
        [-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
        [-getfacl [-R] <path>]
        [-getfattr [-R] {-n name | -d} [-e en] <path>]
        [-getmerge [-nl] <src> <localdst>]
        [-help [cmd ...]]
        [-ls [-d] [-h] [-R] [<path> ...]]
        [-mkdir [-p] <path> ...]
        [-moveFromLocal <localsrc> ... <dst>]
        [-moveToLocal <src> <localdst>]
        [-mv <src> ... <dst>]
        [-put [-f] [-p] [-l] <localsrc> ... <dst>]
        [-renameSnapshot <snapshotDir> <oldName> <newName>]
        [-rm [-f] [-r|-R] [-skipTrash] <src> ...]
        [-rmdir [--ignore-fail-on-non-empty] <dir> ...]
        [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
        [-setfattr {-n name [-v value] | -x name} <path>]
        [-setrep [-R] [-w] <rep> <path> ...]
        [-stat [format] <path> ...]
        [-tail [-f] <file>]
        [-test -[defsz] <path>]
        [-text [-ignoreCrc] <src> ...]
        [-touchz <path> ...]
        [-truncate [-w] <length> <path> ...]
        [-usage [cmd ...]]
  1. cat和text的区别:
    cat 读取文本内容, text 也是读取文本内容,连个命令都可以读取, cat 读取文本内容, text 也是读取文本内容,连个命令都可以读取, 但是text既可以读取文本文件,也可以读取二进制文件, cat只能读取文本文件
  2. mkdir 创建目录
    如果想要创建多级目录 使用mkdir -p 路径 在HDFS存在/ 和非/ 的情况
    如果在创建目录或者文件的时候,前面加 /
  3. 从本地剪切到hdfs上
moveFromLocal <localsrc> ... <dst>

bin/hdfs dfs -moveFromLocal hello.txt /hello3.txt
  1. 追加文件
-appendToFile <localsrc> ... <dst>
  1. 更改文件权限
[-chgrp [-R] GROUP PATH...]
 [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
 [-chown [-R] [OWNER][:[GROUP]] PATH...]

文件权限



执行

R

w

x

4

2

1

  1. 从本地复制数据到hdfs,本地的数据不删除(同put)
-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>
 bin/hdfs dfs -copyFromLocal c.txt /c.txt
  1. 从hdfs复制数据到本地,hdfs上的数据不删除(同get)
-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>
  1. 从hdfs复制数据到hdfs
cp [-f] [-p | -p[topax]] <src> ... <dst>
  1. 合并下载多个文件,比如hdfs下面存在a.txt, b.txt
bin/hdfs dfs -getmerge /*.txt merge.txt
  1. 删除文件或文件夹
rm -r
  1. 删除空目录(相对于rm -r 更安全,可以防止误删)
rmdir
  1. 查看路径的大小信息
df [-h] [<path> ...]
bin/hdfs dfs -du -s -h /
  1. 查看hdfs系统可用的空间信息
[-du [-s] [-h] <path> ...]
bin/hdfs dfs -df -h /

HDFS读取数据流程

  1. 客户端想namenode请求下载文件, namenode收到请求之后查询元数据信息,如果没有,返回无,如果有, 返回datanode数据块的信息
  2. 客户端挑选一台最近的datanode , 进行请求数据
  3. datanode开始传输数据给客户端, 传输数据是以 packet 为单位进行传输
  4. 客户端接收packet数据, 先在本地缓存, 由于数据量的庞大, packet一边缓存,一边写入到目标文件.

JAVA操作HDFS

  1. 配置链接信息, 并对文件进行上传
import java.io.IOException;

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

public class HDFSClient {

	public static void main(String[] args) throws IOException {
		
		// 第一步 获得与HDFS进行连接 
		
		 //获得文件系统
		Configuration conf=new Configuration();
		
		conf.set("fs.defaultFS", "hdfs://hadoop01:8020");
		FileSystem fs=FileSystem.get(conf);
		
		// 第二步 操作HDFS 文件系统 (上传文件)
		
		fs.copyFromLocalFile(new Path("c:/hello9.txt"), new Path("/hello9.txt"));
		
		
		// 第三步 关闭资源
		
		fs.close();
		
		System.out.println("上传成功");
	}
}
  1. 范例:在客户端可以给定操作HDFS的参数,接下来观察在客户端给定文件副本数
@Test
	public void testCopyFromLocal() throws IOException {
		
		// 第一步 获得与HDFS进行连接 
		
		 //获得文件系统
		Configuration conf=new Configuration();
		
		conf.set("fs.defaultFS", "hdfs://hadoop01:8020");
		conf.set("dfs.replication", "2");
		FileSystem fs=FileSystem.get(conf);
		
	   // 第二步 操作HDFS 文件系统 (上传文件)
		
		fs.copyFromLocalFile(new Path("c:/hello9.txt"), new Path("/hello10.txt"));
		
		// 第三步 关闭资源
		
		fs.close();
		
		System.out.println("上传成功");
	}
配置文件的优先级

通过上面的代码发现,客户端修改的属性,优先级高于集群中配置文件的优先级, 在客户端可以通过配置文件来进行属性的配置, 优先级高于HDFS的集群, 如果说在客户端同时配置了配置文件, 以及程序中配置了相同的属性, 优先级最高的是程序中设置的属性
优先级:
程序设置的属性>>>客户端的配置文件>>>HDFS的自定义配置文件>>>HDFS默认配置文件

  1. 在客户端进行HDFS链接的时候, 默认使用的是windows中的名称, 所以也可以在eclipse中模拟用户进行登录, 或者直接给定用户名进行操作
    (1) 在eclipse中模拟用户进行登录

hdfs启动mysql语句 hdfs启动成功的标识_HDFSAPI

(2) 通过建立链接的时候, 直接给定链接信息, 包括用户名

FileSystemfs=FileSystem.get(new URI("hdfs://hadoop01:8020"),conf,"hadoop");

以上两种方式都是模拟用户操作的方法

通过API下载HDFS上的文件
@Test
	public void copyToLocal() throws IOException, InterruptedException, URISyntaxException {

		// 第一步 获得与HDFS进行连接

		// 获得文件系统
		Configuration conf = new Configuration();

		// conf.set("fs.defaultFS", "hdfs://hadoop01:8020");
		conf.set("dfs.replication", "2");
		FileSystem fs = FileSystem.get(new URI("hdfs://hadoop01:8020"), conf, "hadoop");
		
		
		/**
		 * delSrc 指定是否将源文件删除 HDFS 上的文件 boolean  true  删除  false 不删除
		 * 
		 * src 要下载的文件路径
		 * 
		 * dst 文件下载到的路径
		 * 
		 * useRawLocalFileSystem 是否开启文件校验
		 * 
		 */
		fs.copyToLocalFile(false, new Path("/hello15.txt"), new Path("c:/hello15.txt"), true);
		
		
		fs.close();
		
		
		System.out.println("下载完成");
	}