hadoop(三) - HDFS分布式存储系统

大数据技术 专栏收录该内容
15 篇文章 0 订阅

一. 分布文件系统和HDFS:

其实我们可以把分布式文件系统HDFS理解为windows文件系统, 可以在文件夹里面分门别类地存放文件, 只不过HDFS通过网络把文件存放在多台主机上


二. HDFS的shell操作:

HDFS是存取数据的分布式文件系统, 对HDFS的操作就是文件系统的基本操作, 比如文件的创建、修改、删除、修改权限等

对HDFS的操作命令类似Linux的shell对文件的操作, 如: ls、mkdir、rm等

注意:hadoop没有当前目录的概念,也没有cd命令

HDFS命令选项:

1.  - ls 显示当前目录结构

命令: hadoop fs -ls /

root@zhangdongping:/usr# hadoop fs -ls /
Found 3 items
drwxr-xr-x   - root supergroup          0 2014-11-11 20:53 /d1
-rw-r--r--   1 root supergroup         20 2014-11-11 20:54 /d2
drwxr-xr-x   - root supergroup          0 2014-11-11 20:34 /usr
root@zhangdongping:/usr#
首字母表示文件夹(如果是“d”) 或文件(如果是“-”);
后面的9 位字符表示权限;
后面的数字或者“-”表示副本数。如果是文件,使用数字表示副本数;文件夹没有副本;
后面的“root”表示属主;
后面的“supergroup”表示属组;
后面的“0”、“6176”、“37645”表示文件大小,单位是字节;
后面的时间表示修改时间,格式是年月日时分;
最后一项表示文件路径。


2. -lsr递归显示目录

命令: hadoop fs -lsr /usr

该命令选项表示递归显示当前路径的目录结构, 后面跟hdfs路径

root@zhangdongping:/usr# hadoop fs -lsr /usr
drwxr-xr-x   - root supergroup          0 2014-11-11 20:48 /usr/local
drwxr-xr-x   - root supergroup          0 2014-11-11 20:48 /usr/local/hadoop
drwxr-xr-x   - root supergroup          0 2014-11-11 20:48 /usr/local/hadoop/tmp
drwxr-xr-x   - root supergroup          0 2014-11-18 22:55 /usr/local/hadoop/tmp/mapred
drwx------   - root supergroup          0 2014-11-18 22:55 /usr/local/hadoop/tmp/mapred/system
-rw-------   1 root supergroup          4 2014-11-18 22:55 /usr/local/hadoop/tmp/mapred/system/jobtracker.info

3. -du 统计目录下各文件大小

命令: hadoop fs -du /usr

该命令显示指定路径下的文件大小, 单位是字节

root@zhangdongping:/usr# hadoop fs -du /usr
Found 1 items
4           hdfs://zhangdongping:9000/usr/local

4. -dus 汇总统计目录下文件大小

命令: hadoop fs -dus /usr

该命令显示指定路径的文件大小, 单位是字节

root@zhangdongping:/usr# hadoop fs -dus /usr
hdfs://zhangdongping:9000/usr   4

5. -count 统计文件(夹)数量

命令: hadoop fs -count /usr

该命令显示指定路径下的文件夹数量、文件数量、文件总大小信息

root@zhangdongping:/usr# hadoop fs -count /usr
           6            1                  4 hdfs://zhangdongping:9000/usr
root@zhangdongping:/usr# hadoop fs -lsr /usr
drwxr-xr-x   - root supergroup          0 2014-11-11 20:48 /usr/local
drwxr-xr-x   - root supergroup          0 2014-11-11 20:48 /usr/local/hadoop
drwxr-xr-x   - root supergroup          0 2014-11-11 20:48 /usr/local/hadoop/tmp
drwxr-xr-x   - root supergroup          0 2014-11-18 22:55 /usr/local/hadoop/tmp/mapred
drwx------   - root supergroup          0 2014-11-18 22:55 /usr/local/hadoop/tmp/mapred/system
-rw-------   1 root supergroup          4 2014-11-18 22:55 /usr/local/hadoop/tmp/mapred/system/jobtracker.info


6. -mv 移动

命令: hadoop fs -mv /usr/root/abc  /usr

该命令表示移动hdfs的文件到指定的hdfs目录中, 后面跟两个路径, 第一个表示源文件, 第二个表示目的目录


7. -cp 复制

命令: hadoop fs -cp /usr/abc   /usr/root

该命令表示复制hdfs指定的文件到指定的hdfs目录中, 后面跟两个路径, 第一个是被复制的文件, 第二个是目的地


8. -rm 删除文件/空白文件夹

命令: hadoop fs -rm /usr/abc

该命令表示删除指定的文件或者空目录


9. -rmr 递归删除

命令: hadoop fs -rmr /usr

该命令表示递归删除指定目录下的所有子目录和文件


10. -put 上传文件

命令: hadoop fs -put hbase-env.sh /

该命令表示把linux上的文件复制到hdfs中


11. -copyFromLocal 从本地复制

操作与-put一致


12. -moveFromLocal 从本地移动

命令: hadoop fs -moveFromLocal install.log

该命令表示把文件从linux上移动到hdfs中


13. getmerge 合并到本地

命令: hadoop fs -getmerge /hbase abc

该命令表示把hdfs指定目录下的所有文件内容合并到本地linux文件中


14. -cat 查看文件内容

命令: hadoop fs -cat /hbase-env.sh

该命令是查看文件内容


15. -text 查看文件内容

该命令作用和用法可以认为和-cat相同


16. -mkdir 创建空白文件夹

命令: hadoop fs -mkdir /abc

该命令表示创建文件夹, 后面跟的路径是在hdfs中将要创建的文件夹


17. -setrep 设置副本数量

命令: hadoop fs -setrep 2  /install.log

该命令是修改已保存文件的副本数量, 后面跟副本数量, 再跟文件路径


18. -touchz 创建空白文件

命令: hadoop fs -touchz /emptyfiles

该命令是在hdfs中创建空白文件


19. -stat 显示文件的统计信息

命令: hadoop fs -statu  '%b %n %o %r %Y' /install.log

该命令显示文件的一些统计信息


20. -tail 查看文件尾部内容

命令: hadoop fs -tail /install.log

该命令显示文件最后1k字节的内容, 一般用于查看日志, 如果带有选项-f, 那么当文件内容变化时, 也会自动显示


21. -chmod 修改文件权限

命令: hadoop fs -chmod 755 /emptyfile

该命令使用类似于linux shell中的chmod用法, 作用是修改文件的权限

如果加上选项-R, 可以对文件夹中所有文件修改权限:  hadoop fs -chmod -R  700  /usr

root@zhangdongping:~/Desktop# hadoop fs -lsr /
-rw-r--r--   1 root supergroup         20 2014-11-11 20:54 /d2
-rw-r--r--   2 root supergroup         20 2014-11-19 21:16 /install.log
drwxr-xr-x   - root supergroup          0 2014-11-19 21:15 /user
drwxr-xr-x   - root supergroup          0 2014-11-19 21:15 /user/root
-rw-r--r--   1 root supergroup         20 2014-11-19 21:15 /user/root/d2
drwxr-xr-x   - root supergroup          0 2014-11-18 22:55 /usr
drwxr-xr-x   - root supergroup          0 2014-11-18 22:55 /usr/local
drwxr-xr-x   - root supergroup          0 2014-11-18 22:55 /usr/local/hadoop
drwxr-xr-x   - root supergroup          0 2014-11-19 20:42 /usr/local/hadoop/tmp
drwxr-xr-x   - root supergroup          0 2014-11-19 21:07 /usr/local/hadoop/tmp/mapred
drwx------   - root supergroup          0 2014-11-19 21:07 /usr/local/hadoop/tmp/mapred/system
-rw-------   1 root supergroup          4 2014-11-19 21:07 /usr/local/hadoop/tmp/mapred/system/jobtracker.info
root@zhangdongping:~/Desktop#
root@zhangdongping:~/Desktop#
root@zhangdongping:~/Desktop#
root@zhangdongping:~/Desktop# hadoop fs -chmod -R  700  /usr
root@zhangdongping:~/Desktop#
root@zhangdongping:~/Desktop#
root@zhangdongping:~/Desktop# hadoop fs -lsr /
-rw-r--r--   1 root supergroup         20 2014-11-11 20:54 /d2
-rw-r--r--   2 root supergroup         20 2014-11-19 21:16 /install.log
drwxr-xr-x   - root supergroup          0 2014-11-19 21:15 /user
drwxr-xr-x   - root supergroup          0 2014-11-19 21:15 /user/root
-rw-r--r--   1 root supergroup         20 2014-11-19 21:15 /user/root/d2
drwx------   - root supergroup          0 2014-11-18 22:55 /usr
drwx------   - root supergroup          0 2014-11-18 22:55 /usr/local
drwx------   - root supergroup          0 2014-11-18 22:55 /usr/local/hadoop
drwx------   - root supergroup          0 2014-11-19 20:42 /usr/local/hadoop/tmp
drwx------   - root supergroup          0 2014-11-19 21:07 /usr/local/hadoop/tmp/mapred
drwx------   - root supergroup          0 2014-11-19 21:07 /usr/local/hadoop/tmp/mapred/system
-rw-------   1 root supergroup          4 2014-11-19 21:07 /usr/local/hadoop/tmp/mapred/system/jobtracker.info


22. -chown 修改属主

命令: hadoop fs -chown itcast /emptyfile

该命令表示修改文件的属主为itcast,  如果带有选项-R, 意味着可以递归修改文件夹中的所有文件的属主、属组信息

把文件emptyfile的属主和属组都修改为itcast         hadoop fs -chown itcast:itcast /emptyfile

只修改文件emptyfile的属组为itcast                       hadoop fs -chown :itcast /emptyfile


23. -chgrp 修改属组

命令: hadoop fs -chgrp supergroup /emptyfile

该命令的作用是修改文件的属组


24. -help 帮助

命令: hadoop fs -help rm

该命令会显示帮助信息, 后面跟上需要查询的命令即可.


三. HDFS体系结构与基本概念:

我们通过hadoop shell上传的文件时存放在DataNode的block中, 可以用一句话描述HDFS: 把客户端的大文件存放在很多节点的数据块中.

1. NameNode: 

NameNode是HDFS的守护进程,负责记录文件时如何分割成数据块的,以及这些数据块分别被存储到那些数据节点上,它的主要功能是对内存及I/O进行集中管理


2. DataNode:

DataNode是HDFS中真正存储数据的, DataNode在存储数据的时候是按照block为单位读写数据的, block是hdfs读写数据的基本单位, 每64MB字节划分为一个block, 这个64MB是配置在core-default.xml中的.

副本就是备份, 目的是为了安全, 副本分配在不同的DataNode服务器中, HDFS中每个数据块都有3份, 配置在hdfs-default中.

注意: 我们从linux磁盘上传一个完整的文件到hdfs中, 这个文件在linux是可以看到的, 但上传到hdfs后, 就不会有一个对应的文件存在, 而是被划分成很多的block存在的.


3. Secondary NameNode:

Secondary NameNode是一个用来监控HDFS状态的辅助后台程序,它不接受或记录任何实时的数据变化,但是,它会与NameNode进行通信,以便定时地保存HDFS元数据的快照,由于NameNode是单点的,通过Secondary NameNode的快照功能,可以将NameNode的宕机时间和数据损失降低到最小。同时,如果NameNode发生问题,Secondary NameNode可以及时地作为备用NameNode使用。


4. 读取数据流程:

客户端要访问HDFS的一个文件, 首先从namenode获取组成这个文件的数据块位置列表,根据列表知道存储数据块的datanode;

访问datanode获取数据,Namenode并不参与数据实际传输。



5. 写入数据流程:

客户端请求namenode创建新文件,然后客户端将数据写入DFSOutputStream,并建立pipeline依次将目标数据块写入各个datanode,建立多个副本。



四. HDFS的web接口:

HDFS对外提供了可供访问的http server, 开放了很多端口, 下面介绍几个常用的端口:

1.  50070端口, 查看NameNode状态:    http://hadoop0:50070    该端口的定义位于core-default.xml

2. 50075端口, 查看DataNode的:  http://hadoop0:50075     该端口的定义位于hdfs-default.xml

3. 50090端口, 查看SecondaryNameNode的  http://hadoop0:50090

4. 50030端口, 查看JobTracker状态的  http://hadoop0:50030  该端口的定义位于mapred-default.xml

4. 50060端口, 查看TaskTracker  http://hadoop0:50060  该端口的定义位于mapred-default.xml

五. HDFS的Java访问接口:

通过本地Eclipse种的Java代码访问远程linux中的hdfs, 需要保证以下几点:

a. 确保宿主机与客户机的网络互通

b. 确保宿主机和客户机的防火墙都关闭

c. 确保宿主机与客户机使用的JDK版本一直, 否则会报不支持的版本的错误

d. 宿主机的登陆用户名必须与客户机的用户名一致, 否则会报权限异常


1. 第一个测试代码:

public class App1 {
	static final String PATH = "hdfs://zhangdongping:9000/hello.txt";
	public static void main(String[] args) throws Exception {
		URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
		
		final URL url = new URL(PATH);
		final InputStream in = url.openStream();
		
		// in 表示输入流, out 表示输出流, buffSize	表示缓冲大小, close 表示在传输结束后是否关闭流
		IOUtils.copyBytes(in, System.out, 1024, true);
	}
}


2. 使用FileSystem  api读写数据:

public class App2 {
	static final String HDFS_PATH = "hdfs://zhangdongping:9000/"; 
	static final String DIR_PATH = "/d11"; 
	static final String FILE_PATH = "/d11/hello.txt"; 

	public static void main(String[] args) throws Exception {
		FileSystem fileSystem = getFileSystem();
		
		// 创建文件夹 hadoop fs -mkdir /d11
		mkdir(fileSystem);
		
		// 上传文件 hadoop fs -put src des
		putData(fileSystem);
		
		// 下载文件 hadoop fs -get src des
		getData(fileSystem);
		
		// 浏览文件夹 hadoop fs -ls /
		list(fileSystem);
		
		// 删除文件夹 hadoop fs -rm /d11/hello.txt
		remove(fileSystem);
	}
	
	public static FileSystem getFileSystem() throws Exception {
		return FileSystem.get(new URI(HDFS_PATH), new Configuration());
	}
	
	// 创建文件夹
	public static void mkdir(FileSystem fileSystem) throws Exception {
		fileSystem.mkdirs(new Path(DIR_PATH));
	}
	
	// 上传文件
	public static void putData(FileSystem fileSystem) throws Exception{
		final FSDataOutputStream out = fileSystem.create(new Path(FILE_PATH));
		final FileInputStream in = new FileInputStream("D:/readme.txt");
		IOUtils.copyBytes(in, out, 1024, true);
	}
	
	// 下载文件
	public static void getData(FileSystem fileSystem) throws Exception {
		final FSDataInputStream in = fileSystem.open(new Path(FILE_PATH));
		IOUtils.copyBytes(in, System.out, 1024, true);
	}
	
	// 列出文件
	public static void list(FileSystem fileSystem) throws IOException {
		final FileStatus[] listStatus = fileSystem.listStatus(new Path("/"));
		for (FileStatus fileStatus : listStatus) {
			String isDir = fileStatus.isDir() ? "文件夹" : "文件";
			final String permission = fileStatus.getPermission().toString();
			final short replication = fileStatus.getReplication();
			final long len = fileStatus.getLen();
			final String path = fileStatus.getPath().toString();
			System.out.println(isDir + "\t" + permission + "\t" + replication + "\t" + len + "\t" + path);
		}
	}
	
	// 删除文件
	public static void remove(FileSystem fileSystem) throws Exception {
		fileSystem.delete(new Path(DIR_PATH), true);
	}
}


六. Hadoop2 RPC:

所谓的RPC(Remote Procedure Call) 就是不同进程之间的方法调用, 走的还是RMI

RPC它是一种通过网络从远程计算机程序上请求服务, 而不需要了解底层网络技术的协议, RPC跨越了传输层和应用层.

RPC采用客户机/服务器模式, 请求程序就是一个客户机, 而服务提供程序就是一个服务器. 首先, 客户机调用进程发送一个有进程参数的调用信息到服务进程, 然后等待应答程序. 在服务器端, 进程保持睡眠状态指导调用信息到达为止. 当一个调用信息到达, 服务器获得进程参数, 计算结果, 发送答复信息, 然后等待下一个调用信息, 最后, 客户端调用进程答复信息. 获得结果.

下面用一个程序模拟一下:

1. 代理类和被代理类要实现同一个接口:

public interface Barty {
	public static final long versionID = 10010;
	public String sayHi(String name);
}

2. 服务端:

public class RPCServer implements Barty{
	public static void main(String[] args) throws Exception {
		Server server = new RPC.Builder(new Configuration())
			.setInstance(new RPCServer())
			.setBindAddress("192.168.8.100")
			.setPort(9527)
			.setProtocol(Barty.class)
			.build();
		server.start();
	}

	@Override
	public String sayHi(String name) {
		return "HI~" + name;
	}
}

3. 客户端:

public class RPCClient {

	public static void main(String[] args) throws Exception {
		Barty proxy = RPC.getProxy(Barty.class, 10010,
				new InetSocketAddress("192.168.8.100", 9527), new Configuration());
		String sayHi = proxy.sayHi("tomcat");
		System.out.println(sayHi);
	}
}




  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值