Hadoop——第六章 : 分布式文件系统HDFS
6-1HDFS课程概述
HDFS
Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。HDFS是Apache Hadoop Core项目的一部分。
HDFS有着高容错性(fault-tolerant)的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements)这样可以实现流的形式访问(streaming access)文件系统中的数据。
课程概述
一、操作HDFS
1、Web Console:端口50070
2、命令行
3、Java API
二、HDFS输出数据原理
1、数据上传的原理(过程)
2、数据下载的原理(过程)
三、HDFS的高级特性 1、回收站
2、快照snapshot:备份
3、配额quota:
(1)名称配额
(2)空间配额
4、HDFS安全模式: safemode
5、HDFS的权限
6、HDFS的集群:
(1)联盟Federation
(2)HA
四、HDFS底层原理
1、Java的动态代理
2、RPC:remote procedure call 远程过程调用
启动HDFS
1.start-dfs.sh
2.jps查看一下进程是否启动
3.如果没有启动成功,就去hadoop目录下看看对应的日志文件
通过WebConsole操作HDFS
Web Console:端口50070
在浏览器访问:192.168.157.11:50070
需要注意的地方:
Overview中的
Datanode(由于是为分布模式,所以只有一个DataNode)
Startup Progress
启动HDFS的过程
来自:《(林子雨)大数据技术原理与应用》
命令行
(1)普通操作命令: hdfs dfs ****** 命令 -mkdir:在HDFS上创建目录 hdfs dfs -mkdir /aaa hdfs dfs -mkdir /bbb/ccc 如果父目录不存在,使用-p参数先创建父目录 -ls 查看HDFS的某个目录 -ls -R 查看HDFS的某个目录,包含子目录 简写: -lsr -put 上传数据 -copyFromLocal 上传数据 -moveFromLocal 上传数据,相当于ctrl+x -copyToLocal 下载数据 -get 下载数据 举例: hdfs dfs -get /input/data.txt . -rm: 删除目录 -rmr: 删除目录,包括子目录 hdfs dfs -rmr /bbb -getmerge:把某个目录下的文件,合并后再下载 -cp:拷贝 hdfs dfs -cp /input/data.txt /input/data2.txt -mv:移动 hdfs dfs -cp /input/data.txt /aaa/a.txt -count: 举例:hdfs dfs -count /students -du: 类似-count,信息更详细 hdfs dfs -du /students 例子: [root@bigdata11 ~]# hdfs dfs -count /students 1 2 29 /students [root@bigdata11 ~]# hdfs dfs -ls /students Found 2 items -rw-r--r-- 1 root supergroup 19 2017-12-08 20:35 /students/student01.txt -rw-r--r-- 1 root supergroup 10 2017-12-08 20:35 /students/student02.txt [root@bigdata11 ~]# hdfs dfs -du /students 19 /students/student01.txt 10 /students/student02.txt -text、-cat: 查看文本的内容 hdfs dfs -cat /input/data.txt balancer:平衡操作 hdfs balancer (2)管理命令:hdfs dfsadmin ****** -report: 打印HDFS的报告 举例:hdfs dfsadmin -report -safemode:安全模式 hdfs dfsadmin -safemode Usage: hdfs dfsadmin [-safemode enter | leave | get | wait] [root@bigdata11 ~]# hdfs dfsadmin -safemode get Safe mode is OFF [root@bigdata11 ~]# hdfs dfsadmin -safemode enter Safe mode is ON [root@bigdata11 ~]# hdfs dfs -mkdir /dddd mkdir: Cannot create directory /dddd. Name node is in safe mode. [root@bigdata11 ~]# hdfs dfsadmin -safemode leave Safe mode is OFF
Java API
通过 HDFS 提供的 JavaAPI,我们可以完成以下的功能:
1. 在 HDFS 上创建目录
2. 通过 FileSystemAPI 读取数据(下载文件)
3. 写入数据(上传文件)
4. 查看目录及文件信息
5. 查找某个文件在 HDFS 集群的位置
6. 删除数据
7. 获取 HDFS 集群上所有数据节点信息
(1)创建一个目录:mkdir ----> 告诉:权限的问题
(2)上传数据、下载数据
(3)查询数据的元信息
依赖的jar包:
/root/training/hadoop-2.7.3/share/hadoop/common
/root/training/hadoop-2.7.3/share/hadoop/common/lib
/root/training/hadoop-2.7.3/share/hadoop/hdfs
/root/training/hadoop-2.7.3/share/hadoop/hdfs/lib
1.运行WinSCP,登录到环境当中。
2.在windows中新建lib/hdfs,并将所需要jar包从linux下载进去。
3.打开eclipse,新建工程
4.在新建号的项目下建立一个lib文件夹
5.把所有的jar包都放到lib文件夹里
6.选中所有jar包,添加到path
7.新建一个package
8.写入示例代码,并运行
示例代码
package demo; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.junit.Test; /* * 使用HDFS的Java API创建一个目录 * * 权限的问题: * org.apache.hadoop.security.AccessControlException: Permission denied: * user=lenovo, access=WRITE, inode="/folder1":root:supergroup:drwxr-xr-x * * 四种办法解决: * 1、设置执行程序的用户是:root(HADOOP_USER_NAME) * 2、使用Java的-D参数: HADOOP_USER_NAME * 3、使用命令改变目录的权限:hdfs dfs -chmod 777 /folder2 * 4、参数:dfs.permissions ---> false */ public class TestDemo1 { @Test public void test1() throws Exception{ //办法一:设置执行程序的用户是:root System.setProperty("HADOOP_USER_NAME", "root"); //指定NameNode地址 Configuration conf = new Configuration(); //如果要使用主机名,需要配置Windows的host文件 //C:\Windows\System32\drivers\etc\hosts文件 conf.set("fs.defaultFS", "hdfs://bigdata11:9000"); /* * 还有一种写法:IP地址 * conf.set("fs.defaultFS", "hdfs://192.168.157.11:9000"); */ //创建一个HDFS的客户端 FileSystem client = FileSystem.get(conf); //创建目录 client.mkdirs(new Path("/folder1")); //关闭客户端 client.close(); } @Test public void test2() throws Exception{ //指定NameNode地址 Configuration conf = new Configuration(); //如果要使用主机名,需要配置Windows的host文件 //C:\Windows\System32\drivers\etc\hosts文件 conf.set("fs.defaultFS", "hdfs://bigdata11:9000"); /* * 还有一种写法:IP地址 * conf.set("fs.defaultFS", "hdfs://192.168.157.11:9000"); */ //创建一个HDFS的客户端 FileSystem client = FileSystem.get(conf); //创建目录 client.mkdirs(new Path("/folder2")); //关闭客户端 client.close(); } @Test public void test3() throws Exception{ //指定NameNode地址 Configuration conf = new Configuration(); //如果要使用主机名,需要配置Windows的host文件 //C:\Windows\System32\drivers\etc\hosts文件 conf.set("fs.defaultFS", "hdfs://bigdata11:9000"); /* * 还有一种写法:IP地址 * conf.set("fs.defaultFS", "hdfs://192.168.157.11:9000"); */ //创建一个HDFS的客户端 FileSystem client = FileSystem.get(conf); //创建目录 client.mkdirs(new Path("/folder2/folder3")); //关闭客户端 client.close(); } @Test public void test4() throws Exception{ //指定NameNode地址 Configuration conf = new Configuration(); //如果要使用主机名,需要配置Windows的host文件 //C:\Windows\System32\drivers\etc\hosts文件 conf.set("fs.defaultFS", "hdfs://bigdata11:9000"); /* * 还有一种写法:IP地址 * conf.set("fs.defaultFS", "hdfs://192.168.157.11:9000"); */ //创建一个HDFS的客户端 FileSystem client = FileSystem.get(conf); //创建目录 client.mkdirs(new Path("/folder4")); //关闭客户端 client.close(); } }