hdfs的设计思想
1)分块存储
默认128M hadoop2
太大 负载不均衡
太小 namenode的压力过大
注意: 一个块 不够128M 单独成一个块
200M
2)冗余存储
默认每一个块 3个副本 每一个块 总共存储3份
副本: 相同地位 互为副本 没有优先级
注意:
1)同一个块的不同副本 存储在不同节点的
2)默认副本3个 有一个宕机了 复制出来一个
3)默认副本3 宕机 启动 副本4个 删除
4)默认副本3 2个节点 存储2个 剩下一个记账
hdfs的架构 :
总:一主多从
主:
namenode :
1)存储元数据信息
元数据:描述数据的数据 描述的datanode存储的数据的数据
类似于 目录
1)抽象目录树
2)数据和块的对应关系
3)块的存储位置
目录:自己配置的 hdfs-site
2)接受客户端的读写请求
从:
datanode :
1)真正的存储数据
按照块进行存储的 每一个数据块 id
/home/hadoop/data/hadoopdata/data/current/BP-1453129122-192.168.191.201-1556592207649/current/finalized/subdir0/subdir0
2)真正的处理客户端的读写请求的
助理:
secondarynamenode:
1)备份namenode的元数据信息的
2)帮助namenode减轻压力的
hdfs的优缺点:
缺点:
1)延迟性高 离线 磁盘落地
2)不适合大量小文件存储
1)namenode压力过大
2)寻址时间过长
3)不支持文件修改 支持追加
优点:
批量
离线
流式访问
hdfs的使用
shell
==========================
命令行
在hadoop集群中的任意一个节点都可以启动命令行
hadoop fs
hadoop 启动hadoop的客户端 连接hadoop集群
fs 打开hadoop的(文件系统)filesystem的客户端
命令集合:
-真正的执行命令
[-appendToFile … ]
[-cat [-ignoreCrc] …]
[-checksum …]
[-chgrp [-R] GROUP PATH…]
[-chmod [-R] <MODE[,MODE]… | OCTALMODE> PATH…]
[-chown [-R] [OWNER][:[GROUP]] PATH…]
[-copyFromLocal [-f] [-p] [-l] … ]
[-copyToLocal [-p] [-ignoreCrc] [-crc] … ]
[-count [-q] [-h]
[-cp [-f] [-p | -p[topax]] … ]
[-createSnapshot []]
[-deleteSnapshot ]
[-df [-h] [
[-du [-s] [-h]
[-expunge]
[-find
[-get [-p] [-ignoreCrc] [-crc] … ]
[-getfacl [-R]
[-getfattr [-R] {-n name | -d} [-e en]
[-getmerge [-nl] ]
[-help [cmd …]]
[-ls [-d] [-h] [-R] [
[-mkdir [-p]
[-moveFromLocal … ]
[-moveToLocal ]
[-mv … ]
[-put [-f] [-p] [-l] … ]
[-renameSnapshot ]
[-rm [-f] [-r|-R] [-skipTrash] …]
[-rmdir [–ignore-fail-on-non-empty]
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>}
[-setfattr {-n name [-v value] | -x name}
[-setrep [-R] [-w]
[-stat [format]
[-tail [-f] ]
[-test -[defsz]
[-text [-ignoreCrc] …]
[-touchz
[-truncate [-w]
[-usage [cmd …]]
1)查看hdfs的目录结构
hadoop fs -ls -R hdfs的目录 查看给定的hdfs的目录的子目录
-R 级联查看
hadoop fs -ls -R /
hadoop fs -lsr /
注意:在hdfs中所有的路径只有绝对路径的访问形式 必须从 /开始
2)创建文件夹
hadoop fs -mkdir -p 需要创建的目录
-p 级联创建
hadoop fs -mkdir -p /aa/bb/cc
hadoop fs -mkdir /testin
3)文件上传
hdfs不支持文件修改的
在hdfs不能先创建一个空文件 在进行编辑
只能本地编辑完成文件 上传到hdfs存储
或者将本地的文件进行直接存储在hdfs上
文件上传 :将本地的文件 传到hdfs存储 进行分布式存储的
hadoop fs -copyFromLocal 本地文件路径 hdfs路径
将本地文件 拷贝到hdfs上
对应API
hadoop fs -moveFromLocal 本地文件路径 hdfs路径
将本地文件 移动到hdfs上
hadoop fs -put 本地文件路径 hdfs路径
同 -copyFromLocal 提倡
hadoop fs -put hadoop-2.7.7.tar.gz /testin
hadoop fs -moveFromLocal hadoop-2.7.7.tar.gz / 剪切|移动
注意: 本地路径 客户端所在本地
测试:
hadoop fs -put hadoop-2.7.6.tar.gz /hadoop6
注意: 文件上传的时候 如果给定的是hdfs的目录 将本地文件 传到hdfs的给定目录下 如果给的是一个hdfs不存在的文件|目录 将本地文件传到hdfs上 但是会重命名 命名为给定的文件,名
4)文件下载
hadoop fs -copyToLocal|moveToLocal|get hdfs路径 本地路径
将hdfs文件 下载到本地
hadoop fs -copyToLocal|get 将hdfs拷贝到本地
-get 推荐
hadoop fs -get /hadoop-2.7.7.tar.gz .
hadoop fs -moveToLocal 将hdfs的移动到本地
hadoop fs -moveToLocal /hadoop-2.7.7.tar.gz /home/hadoop/hadoop2
报错:
Option '-moveToLocal' is not implemented yet.
这个命令还不支持
5)查看文件内容
hadoop fs -cat hdfs文件路径
hadoop fs -cat /hdfs-site.xml
查看hdfs文件的所有内容
hadoop fs -tail hdfs文件路径
hadoop fs -tail /hdfs-site.xml
查看hdfs给定文件的末尾1kb的数据
6)创建文件
hadoop fs -touch hdfs文件名 创建空文件
hadoop fs -touchz /test_bd1901
注意:在hdfs中大小为0kb的文件 不进行实际存储的 datanode中不存储的
只在namenode中进行元数据存储
7)删除文件 或目录
hadoop fs -rm -f -r 需要删除hdfs的目录或文件
-f force 强制删除
-r 级联删除 用于删除目录的时候
删除文件
hadoop fs -rm -f /hadoop-2.7.7.tar.gz
删除目录
hadoop fs -rm -r -f /aa
8)修改hdfs文件或目录的读写权限
chmod -R 777 文件或目录
-R 级联修改目录下的所有子文件的权限的
hadoop fs -chmod -R 777 /testin
9)修改文件所属用户 和 组
chown -R 用户:组 文件或目录
hadoop fs -chown -R 用户:组 文件或目录
hadoop fs -chown -R hadoop:hadoop /testin
10)修改hdfs文件的副本个数
hdfs配置文件 hdfs-site 中 设置的副本个数 2
有一个文件很重要 需要将这个文件的副本---》 3个
-setrep [-R] [-w] set replication 修改副本的
-R 级联修改目录下的所有文件
-w wait 等待新副本的复制完成|删除完成 阻塞
hadoop fs -setrep 3 /hadoop6
只能修改hdfs上已经存在的文件或目录
对于新上传的文件 副本个数 hdfs-site 配置文件中的作用的
hdfs的存储文件的副本的修改:
1)配置文件 全局
hdfs-default.xml 3
hdfs-site.xml 2
2)命令 单个文件或目录的
hadoop fs -setrep
加载:
hdfs-default 3
---> hdfs-site 2
--->setrep 3
最后加载的最终生效
11)查看磁盘占有情况
du df
hadoop fs -du -h hdfs目录
hadoop fs -du -h /
统计hdfs的每一个文件夹|文件的大小
hadoop fs -df -h hdfs目录
hadoop fs -df -h /
查看指定路径的磁盘占有率
12)其他
1)-appendToFile 追加 了解
hadoop fs -appendToFile 本地文件 hdfs文件
将本地文件 追加到指定的hdfs文件的末尾
hadoop fs -appendToFile hdfs-site.xml /slaves 不建议使用的
2)-cp|-mv
用法:
hadoop fs -cp|-mv hdfs路径 hdfs路径
将hdfs的(目录)文件 拷贝 | 移动 hdfs另一个文件路径中
hadoop fs -cp /slaves /sl01 了解
hadoop fs -mv /slaves /sl02 重命名 掌握
3) -getmerge 合并下载 归并下载
将hdfs上的多个文件 合并为一个文件下载
hadoop fs -getmerge hdfs路径1 hdfs路径2 。。。。 本地路径
将hdfs的多个路径 合并下载到本地
hadoop fs -getmerge /sl01 /sl02 /home/hadoop/testmetge
这个命令 默认将最后一个目录识别为本地路径
4)-count 文件统计
5)-text 将文件以文本显示
hadoop fs -text /hadoop6
补充:
1)hdfs的所有路径权限定名:
namenode的访问路径+需要访问的路径
core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://hdp01:9000</value>
</property>
hdfs://hdp01:9000/
简写 /
全写:hadoop fs -ls hdfs://hdp01:9000/
hdfs --》 协议
hdp01 namenode 主节点
9000 端口号
hdfs有两个端口:
9000 :
datanode和namenode通信访问的端口 内部
rpc协议的
50070 客户端访问web界面的http协议端口
http://hdp01:50070/explorer.html#/
2) hadoop fs -命令 老
hdfs dfs - 命令 新
hdfs dfs -ls /
级联—递归
API
配置eclipse本地开发环境
1)将hadoop的插件放在eclipse的安装目录的 plugins下
C:\soft\eclipse\eclipse\plugins
2)配置windows的hadoop环境
winutils.exe 将linux下的hadoop的安装包兼容windows平台
1)将hadoop的linux下的安装包 windows下解压
注意:解压目录 1.不能有中文 2.不能有空格
2)将winutils.exe放在hadoop的安装包的 bin目录下
3)配置windows下hadoop的环境变量
属性–》高级系统设置—》环境变量—》系统变量–》
添加
HADOOP_HOME C:\soft\hadoop-2.7.6
添加
PATH 末尾追加 ;%HADOOP_HOME%\bin;%HADOOP_HOME%\sbin
检查 cmd
hadoop version
4)将hadoop.dll 放在windows的 C:\Windows\System32
3)配置eclipse的可视化连接界面
注意:如果eclipse已经启动的 必须重启
window–> show view —>other --> 搜索map–>点击Map/Reduce Locations --> ok
单机蓝色小象
配置 如图
到此为止 配置完成了
创建工程 并导包:
1)在工程下 创建一个lib的文件夹 将所有的依赖放在lib下 build path
缺点:无法解决jar包冲突问题 工程臃肿
优点:工程移动比较方便
2)maven的方式
org.apache.hadoop
hadoop-client
2.7.7
优点:工程比较规整 可以解决jar包冲突
缺点:代码移动时候 需要重新构建依赖的
3)本地工程下 构建library
右键–》 build path —》 configuration …–>libraries —>
—> add library …—> user library —> next —> user libraries … --> new … —> 指定library 名 —》添加jar包
hadoop的开发依赖包
/home/hadoop/apps/hadoop-2.7.6/share/hadoop
hdfs common
缺点:
1.多个library中的jar包不能去重 很多包重复导入
2.不能解决jar包冲突
优点:
再次进行创建工程的时候 可以重复利用library的