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
-
-