hadoop hdfs
- hdfs特性
首先,它是一个文件系统 用于存储文件的 提供统一命名空间的目录树结构 便于用户操作文件系统
其次,它是一个分布式文件系统 分布式意味着多台机器 当中有不同的角色 各司其职 共同配合。
- master slave 主从架构
- 主角色:namenode 管理文件系统元数据(目录树结构 文件和块的对应信息)
- 从角色:datanode 负责具体数据块存储 定时向nn进行块的汇报
- 分块存储
hadoop 2.x block size = 128M
hadoop 1.x block size = 64M
- 副本机制
- hadoop默认的副本数是3(1 + 2 = 3)
- 一次写入,多次读出
hdfs没有数据修改操作 只要是支持大数据查询分析需求
- hdfs shell命令行操作
- 格式
hadoop fs <args> 文件系统的协议://主机名:host/文件路径
- 具体操作
hadoop fs -ls file:/// 访问是本地系统
hadoop fs -ls hdfs://node-1:8020/ 访问是hdfs文件系统
hadoop fs -ls gfs://node-1:9999/ 访问是谷歌文件系统
hadoop fs -ls / 如果不指定文件系统的协议 就会访问默认文件系统 fs.defaultFS
- 基本操作
- put 上传操作 从本地文件系统复制到目标文件系统
何谓本地文件系统?
执行命令所在的客户端的文件系统
何谓目标文件系统?
hdfs
hadoop fs -put file:///root/example-mr-1.2.jar hdfs://node-1:8020/a/b/c
hadoop fs -put example-mr-1.2.jar /a/b/
- get 下载操作 将文件下载到本地文件系统
何谓本地文件系统?
执行命令所在的客户端的文件系统
hadoop fs -get hdfs://node-1:8020/a/b/c/example-mr-1.2.jar file:///root/
hadoop fs -get /a/b/c/example-mr-1.2.jar ./
- appendToFile 把多个文件追加到已经存在文件的末尾
- 最大用处:hdfs上小文件的合并
hadoop fs -appendToFile 2.txt 3.txt /a/1.txt
- getmerge 下载合并 合并下载多个文件
hadoop fs -getmerge /small/* ./small.txt
- setrep
[root@node-3 test]# hadoop fs -setrep -w 3 /zookeeper.out
Replication 3 set: /zookeeper.out
Waiting for /zookeeper.out .... done
- 注意事项: 可以通过该命令修改hdfs中文件副本个数 在企业中避免使用该操作
- 进行副本设置修改的操作 需要hdfs集群配合文件进行数据复制 降低对外提供正常服务能力
- 通常一批文件设置为几个副本 在上传前就需要决定好
- 文件限额操作
- 可以设置某个文件夹可以用于多少个子文件 或者文件的大小限制
- 强制限制 超过即禁止
hdfs dfsadmin -setQuota 2 /user/root/lisi 开启限制 限制文件个数为2
[root@node-3 test]# hadoop fs -put 1.txt /user/root/lisi
[root@node-3 test]# hadoop fs -put 2.txt /user/root/lisi
put: The NameSpace quota (directories and files) of directory /user/root/lisi is exceeded: quota=2 file count=3 报错 显示已经超过现在
[root@node-3 test]# hdfs dfsadmin -clrQuota /user/root/lisi
[root@node-3 test]# hadoop fs -put 2.txt /user/root/lisi
[root@node-3 test]# hadoop fs -put 3.txt /user/root/lisi 清楚文件超额限制
hdfs dfs -count -q -h /user/root/lisi 查看某个路径是否开启文件超额限制
- NN和DN之间的汇报机制
- 启动集群的时候 首先启动namenode 然后启动datanode
- datanode启动的时候需要进行两件事
- 去namenode进行注册汇报 报告自己启动成功 —>我活了
- 去namenode汇报自己本机持有哪些数据块
- 集群启动之后 正常工作期间 还需要间隔指定的时间进行汇报
- datanode每隔3秒进行心跳 目的:报活
dfs.heartbeat.interval
- datanode每间隔6小时 汇报自己持有块信息
dfs.blockreport.intervalMsec
- 在启动的过程中 hdfs会进入所谓安全模式 数据只可以读不可以写 内部进行数据完整性校验
hdfs java api 操作
- 开发的版本的选择
- 因为服务器环境搭建使用的cdh 版本 ,本地开发jar版本理应也是cdh
- cdh和apache 相同版本中 api 代码 逻辑是没有区别的
- 如果使用cdh 需要手动添加cloudera maven仓库 因为它是商业公司
- 问题1:客户端身份的权限问题
Permission denied: user=AllenWoon, access=WRITE, inode="/":root:supergroup:drwxr-xr-x
- 解决: 在客户端设置访问文件系统身份
- 问题2: hadoop本地环境的问题
- 报错现象
ERROR - Failed to locate the winutils binary in the hadoop binary path
java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
WARN - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
- 原因:hadoop往windows平台进行数据写操作的时候 需要winutils.exe 配合才能交互。winutils.exe来自hadoop源码中C++本地库的支持。
- 解决:把hadoop源码在windows进行编译 得到winutils.exe 达到和本地操作交互的能力
- 安装: 把windows编译的hadoop解压到一个路径(没有中文 没有空格)
- 配置hadoop环境变量
HADOOP_HOME=C:\Work\soft\hadoop-2.6.0-cdh5.14.0
PATH=;%HADOOP_HOME%\bin
- 首先cmd 验证hadoop环境变量是否正确
- 确保之前安装的jdk路径也是没有中文 没有空格的
- 重启idea开发工具
- 跨hdfs集群数据复制
- 命令 distcp
hadoop distcp hdfs://node-1:8020/1.txt hdfs://itcast:8020/test/
- 使用场合
业务中涉及生成环境和开发环境之间某些数据进行交流的时候使用
- hadoop archive的使用
- 产生背景:hdfs架构设计不利于小文件存储 文件不管多小 都需要元数据描述记录 如果集群小文件过多
可能磁盘使用情况很低 但是内存使用确很高 俗称 小文件吃内存 - 档案的功能:通过mr程序 把多个小文件 合并成一个档案文件
- archive的使用
- 档案的创建
hadoop archive -archiveName test.har -p /input /outputdir
档案建立成功 为了优化小文件吃内存的情况 可以把小文件删除
hadoop fs -rm -r /input
- 档案的查看
查看建立档案之后的样子
hadoop fs -ls hdfs://node-1:8020/outputdir/test.har
查看建立档案之前的样子
hadoop fs -ls har://hdfs-node-1:8020/outputdir/test.har
可以查询出该档案是由哪些小文件合并而来
- 档案的提取
串行提取
hadoop fs -cp har:///outputdir/test.har hdfs://node-1:8020/input
hadoop distcp har:///outputdir/test.har hdfs://node-1:8020/input
- 档案的注意事项
- hdfs 快照功能
- 创建快照相当于给hdfs系统设置备份
- 创建快照的前提是文件夹已经存在
- 创建快照需要两步
- 首先允许其设置快照
hdfs dfsadmin -allowSnapshot /small
- 然后再是设置创建快照
hdfs dfs -createSnapshot /small
- 浏览快照
http://node-1:50070/explorer.html#/small/.snapshot