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 ...]]
- cat和text的区别:
cat 读取文本内容, text 也是读取文本内容,连个命令都可以读取, cat 读取文本内容, text 也是读取文本内容,连个命令都可以读取, 但是text既可以读取文本文件,也可以读取二进制文件, cat只能读取文本文件 - mkdir 创建目录
如果想要创建多级目录 使用mkdir -p 路径 在HDFS存在/ 和非/ 的情况
如果在创建目录或者文件的时候,前面加 / 代表在hdfs根路径上存储 - 从本地剪切到hdfs上
moveFromLocal <localsrc> ... <dst>
bin/hdfs dfs -moveFromLocal hello.txt /hello3.txt
- 追加文件
-appendToFile <localsrc> ... <dst>
- 更改文件权限
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
文件权限
读 | 写 | 执行 |
---|---|---|
R | w | x |
4 | 2 | 1 |
- 从本地复制数据到hdfs,本地的数据不删除(同put)
-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>
bin/hdfs dfs -copyFromLocal c.txt /c.txt
- 从hdfs复制数据到本地,hdfs上的数据不删除(同get)
-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>
- 从hdfs复制数据到hdfs
cp [-f] [-p | -p[topax]] <src> ... <dst>
- 合并下载多个文件,比如hdfs下面存在a.txt, b.txt
bin/hdfs dfs -getmerge /*.txt merge.txt
- 删除文件或文件夹
rm -r
- 删除空目录(相对于rm -r 更安全,可以防止误删)
rmdir
- 查看路径的大小信息
df [-h] [<path> ...]
bin/hdfs dfs -du -s -h /
- 查看hdfs系统可用的空间信息
[-du [-s] [-h] <path> ...]
bin/hdfs dfs -df -h /
HDFS读取数据流程
- 客户端想namenode请求下载文件, namenode收到请求之后查询元数据信息,如果没有,返回无,如果有, 返回datanode数据块的信息
- 客户端挑选一台最近的datanode , 进行请求数据
- datanode开始传输数据给客户端, 传输数据是以 packet 为单位进行传输
- 客户端接收packet数据, 先在本地缓存, 由于数据量的庞大, packet一边缓存,一边写入到目标文件.
JAVA操作HDFS
- 配置链接信息, 并对文件进行上传
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("上传成功");
}
}
- 范例:在客户端可以给定操作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默认配置文件
- 在客户端进行HDFS链接的时候, 默认使用的是windows中的名称, 所以也可以在eclipse中模拟用户进行登录, 或者直接给定用户名进行操作
(1) 在eclipse中模拟用户进行登录
(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("下载完成");
}