分布式文件系统HDFS

Hadoop-HDFS
存储模型:字节
文件线性切割成块(Block):偏移量 offset (byte)
Block分散存储在集群节点中
单一文件Block大小一致,文件与 文件可以不一致
Block可以设置副本数,副本分散在不同节点中
副本数不要超过节点数量
文件上传可以设置Block大小和副本数
已上传的文件Block副本数可以调整,大小不变
只支持一次写入多次读取,同一时刻只有一个写入者
可以append追加数据
架构模型:
文件元数据MetaData,文件数据
元数据
数据本身
(主)NameNode节点保存文件元数据:单节点 posix
(从)DataNode节点保存文件Block数据:多节点
DataNode与NameNode保持心跳,提交Block列表
HdfsClient与NameNode交互元数据信息
HdfsClient与DataNode交互文件Block数据
HDFS架构:
分布式文件系统HDFSHDFS设计思想:
分布式文件系统HDFS分布式文件系统HDFS
NameNode(NN)
基于内存存储 :不会和磁盘发生交换
只存在内存中
持久化
NameNode主要功能:
接受客户端的读写服务
收集DataNode汇报的Block列表信息
NameNode保存metadata信息包括
文件owership和permissions
文件大小,时间
(Block列表:Block偏移量),位置信息
Block每副本位置(由DataNode上报)
NameNode持久化
NameNode的metadate信息在启动后会加载到内存
metadata存储到磁盘文件名为”fsimage”
Block的位置信息不会保存到fsimage
edits记录对metadata的操作日志。。。redis
DataNode(DN)
本地磁盘目录存储数据(Block),文件形式
同时存储Block的元数据信息文件
启动DN时会向NN汇报block信息
通过向NN发送心跳保持与其联系(3秒一次),如果NN 10分钟没有收到DN的心跳,则认为其已经lost,并copy其上的block到其它DN
HDFS优点:
高容错性
数据自动保存多个副本
副本丢失后,自动恢复
适合批处理
移动计算而非数据
数据位置暴露给计算框架(Block偏移量)
适合大数据处理
GB 、TB 、甚至PB 级数据
百万规模以上的文件数量
10K+ 节点
可构建在廉价机器上
通过多副本提高可靠性
提供了容错和恢复 机制
HDFS缺点:
低延迟数据访问
比如毫秒级
低延迟与高吞吐率
小文件存取
占用NameNode 大量内存
寻道时间超过读取时间
并发写入、文件随机修改
一个文件只能有一个写者
仅支持append
SecondaryNameNode(SNN)
它不是NN的备份(但可以做备份),它的主要工作是帮助NN合并edits log,减少NN启动时间。
SNN执行合并时机
根据配置文件设置的时间间隔fs.checkpoint.period 默认3600秒
根据配置文件设置edits log大小 fs.checkpoint.size 规定edits文件的最大值默认是64MB
SNN合并流程
分布式文件系统HDFSBlock的副本放置策略
第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。
第二个副本:放置在于第一个副本不同的 机架的节点上。
第三个副本:与第二个副本相同机架的节点。
更多副本:随机节点
分布式文件系统HDFSHDFS写流程
分布式文件系统HDFS
Client:
切分文件Block
按Block线性和NN获取DN列表(副本数)
验证DN列表后以更小的单位流式传输数据
各节点,两两通信确定可用
Block传输结束后:
DN向NN汇报Block信息
DN向Client汇报完成
Client向NN汇报完成
获取下一个Block存放的DN列表。。。。。。
最终Client汇报完成
NN会在写流程更新文件状态
HDFS读流程
分布式文件系统HDFSClient:
和NN获取一部分Block副本位置列表
线性和DN获取Block,最终合并为一个文件
在Block副本列表中按距离择优选取
HDFS文件权限 POSIX
与Linux文件权限类似
r: read; w:write; x:execute
权限x对于文件忽略,对于文件夹表示是否允许访问其内容
如果Linux系统用户zhangsan使用hadoop命令创建一个文件,那么这个文件在HDFS中owner就是zhangsan。
HDFS的权限目的:阻止好人错错事,而不是阻止坏人做坏事。HDFS相信,你告诉我你是谁,我就认为你是谁。
安全模式
namenode启动的时候,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作。
一旦在内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件(这个操作不需要SecondaryNameNode)和一个空的编辑日志。
此刻namenode运行在安全模式。即namenode的文件系统对于客服端来说是只读的。(显示目录,显示文件内容等。写、删除、重命名都会失败)。
在此阶段Namenode收集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的, 在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束
当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数,系统中数据块的位置并不是由namenode维护的,而是以块列表形式存储在datanode中。
集群
角色==进程
namenode
数据元数据
内存存储,不会有磁盘交换
持久化(fsimage,eidts log)
不会持久化block的位置信息
block:偏移量,因为block不可以调整大小,hdfs,不支持修改文件
偏移量不会改变
datanode
block块
磁盘
面向文件,大小一样,不能调整
副本数,调整,(备份,高可用,容错/可以调整很多个,为了计算向数据移动)
SN
NN&DN
心跳机制
DN向NN汇报block信息
安全模式
client
一,操作系统环境
依赖软件ssh,jdk
环境的配置
java_home
免**
时间同步
hosts,hostname
二,hadoop部署
/opt/sxt/
配置文件修改
java_home
角色在哪里启动
Client:

线性上传block
先和NN通信,元数据,获取第一个block的节点信息(3副本,选择机制)
和DN通信:pipeline:C和1stDN有socket,1stDN和2edDN有socket。。。。
小片传输:4K,C给1stDN,1stDN同时本机缓存,瞬间放入下游socket中
当block传输完毕:block自身的网络I/O时间,时间线重叠的艺术
DN会向NN汇报自己新增的block
C向NN汇报blockX传输完成给我下一个block节点信息
全部传输完成,NN更新元数据状态可用

线性读取block,不会有并发,只有一个网卡
距离:择优选取同机架,同节点
NN每次只给一部分block信息
1,jdk安装,配置环境变量
vi /etc/profile
2,ssh免**(本机)
ssh-****** -t dsa -P ‘’ -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
3,上传hadoop.tar.gz到服务器
解压,mv hadoop-2.6.5 /opt/sxt
vi /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0_67
export HADOOP_PREFIX=/opt/sxt/hadoop-2.6.5
export PATH=PATH:PATH:JAVA_HOME/bin:HADOOPPREFIX/bin:HADOOP_PREFIX/bin:HADOOP_PREFIX/sbin
4,/opt/hadoop-2.6.5/etc/hadoop
*-env.sh
JAVA_HOME=/usr/java/jdk1.7.0_67
core-site.xml

fs.defaultFS
hdfs://node01:9000


hadoop.tmp.dir
/var/sxt/hadoop/local

hdfs-site.xml

dfs.replication
1


dfs.namenode.secondary.http-address
node01:50090

slaves
node01
hdfs namenode -format
start-dfs.sh
jps
28341 SecondaryNameNode
28102 NameNode
28207 DataNode
28480 Jps
hdfs dfs -mkdir /user
hdfs dfs -ls /user
hdfs dfs -mkdir /user/root
hdfs dfs -D dfs.blocksize=1048576 -put hadoop-2.6.5.tar.gz

http://192.168.9.11:50070
for i in seq 100000;do echo “hello sxt $i” >> test.txt;done
cat ~/node01.pub >> ~/.ssh/authorized_keys
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
分布式文件系统HDFS
分布式文件系统HDFS
1,每台服务器要:
安装jdk
配置环境变量
免**登陆
控制节点scp自己的id_dsa.pub分发到其他节点
cat ~/node1.pub >> ~/.ssh/authorized_keys
mkdir /opt/sxt
/etc/hosts
2,取一个节点:
配置Hadoop的配置文件
core-site.xml

fs.defaultFS
hdfs://node01:9000


hadoop.tmp.dir
/var/sxt/hadoop/full

hdfs-site.xml

dfs.replication
3


dfs.namenode.secondary.http-address
node02:50090

slaves
node02
node03
node04

3,分发部署包到其他节点
cd /opt/sxt
scp -r hadoop-2.6.5 node02:pwd
scp -r hadoop-2.6.5 node03:pwd
scp -r hadoop-2.6.5 node04:pwd
4,确认之前的hadoop进程是否停到了
jps
5,hdfs namenode -format (node01)
6,start-dfs.sh
7,每个节点jps验证,node01:50070
1,解压部署,添加环境变量
2,将tools目录下的bin目录覆盖部署目录
3,备份eclipse,将hadoop的插件放入eclipse的plugins下
4,启动eclipse,添加map/reduce视图
5,创建hdfs连接:
6,整理部署目录内的jar包:
C:\var\sean\hadoop-2.6.5\share\hadoop
hdfs,common,mapreduce,tools,yarn
目录内的jar包全部拷贝一份出来
7,eclipse创建用户库导入刚才的jar包:
8,新建一个java项目
导入hadoop的jar包
创建一个conf目录
从集群下载core-site.xml hdfs-site.xml
分布式文件系统HDFShdfs 安装:
平台
GNULinux
模式:
local
pseudo
full
依赖:
java
2次配置(系统环境,脚本再次制定)
ssh
免**
下载hadoop
配置:配置文件
1,jdk安装
/etc/profile
~/.bashrc
2,ssh:避免输入密码
ssh-****** -t dsa -P ‘’ -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
scp ~/.ssh/id_dsa.pub [email protected]:pwd/node01.pub
cat node01.pub >> ~/.ssh/authorized_keys
3,,可以不会
for i in seq 4; do
cat k | sed "s/(node0)1(,192.168.9.1)1(.
)/\1KaTeX parse error: Expected 'EOF', got '\2' at position 2: i\̲2̲i\3/gi" >> known_hosts;
done
4,解压缩:
mkdir /opt/sxt/
tar xf hadoop*.tar.gz
5,hadoop/etc/hadoop
*-env.sh
core-site.xml

fs.defaultFS
hdfs://node01:9000


hadoop.tmp.dir
/var/sxt/hadoop-2.6.5

hdfs-site.xml

dfs.replication
1

hdfs dfs namenode -format
start-dfs.sh
完全分布式:
分布式文件系统HDFS
分布式文件系统HDFS
1,jdk
环境变量
. /etc/profile
2,ssh免**
3,下载hadoop包
4,解压
5,配置文件
*-env.sh:jdk
core-site.xml:
fs.defaultFS namenode节点
hadoop.tmp.dir:NN.dir,DN.dir
hdfs-site.xml:副本数
slaves:
datanode节点列表
1,格式化hdfs namenode -format
2,启动hdfs
start-dfs.sh
3, hdfs dfs -mkdir -p /user/root
4,hdfs dfs -D dfs.blocksize=1048576 -put **.
HDFS API
解压hadoop包:不能有中文,空格,特殊字符
创建环境变量,放到PATH
eclipse拷贝一份,备份
将eclipse-hadoop的插件放入eclipse
eclipse:设置:hadoop mr设置:配置你解压的hadoop路径
操作系统:计算机管理:本地用户和族:用户:重命名你登陆的账户为:root
Configuration
true/false
FileSystem
create/open:
FSDataOutputStream
FSDataInputStream
seek();
思路:计算和数据在一起了,但是不要再从头开始读取数据
getFileStatus: FileStatus
getFileBlockLocations: BlockLocation[]
思路:计算向数据移动的参考
HDFS安装

伪分布式安装
完全分布式安装
下载
解压
检查java和ssh的免密码登陆
修改core-site.xml
修改hdfs-site.xml
修改masters文件和slaves文件
格式化namenode
Start-hdfs.sh启动
注意:
/etc/hosts
每个节点都要配置:IP 主机名
分布式文件系统HDFS
1,安装jdk(oracle)1.7
2,JAVA_HOME
3,ssh
ssh-****** -t dsa -P ‘’ -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
node001
ssh-****** -t dsa -P ‘’ -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

cd ~/.ssh
cp authorized_keys a
for i in seq 4 ;
do line=cat a | awk '{print $1" "$2" [email protected]"}' ;
echo linelinei >> authorized_keys ;
done

ssh node001
vi known_hosts
scp ./* [email protected]:pwd

4,ssh登陆所有节点一次,包括localhost:knowhost
5,hadoop安装包路径
6,配置
Hadoop-env.sh 配置java的绝对路径
core-site.xml

fs.defaultFS
hdfs://node001:9000


hadoop.tmp.dir
/var/sxt/hadoop-2.6/fully

注意:hadoop.tmp.dir默认是/tmp/目录,需要手动指定一个持久目录
hdfs-site.xml

dfs.replication
3


dfs.namenode.secondary.http-address
node002:50090

注意:伪分布式,副本数为1
设置SNN的http-address的节点主机名会让SNN去具体的节点启动
slaves
node002
node003
node004

这个配置文件是datanode所在的节点
启动
hdfs namenode –format
去观察hadoop.tmp.dir设置的目录变化
注意,这个目录必须是空的
如果,报错等,想重新格式化,需要先删除

start-dfs.sh
去datanode节点,验证hadoop.tmp.dir目录

注意:HDFS集群有clusterID,datanode启动时会和namenode对比clusterID,如果相同,启动成功,如果不同,自杀进程
hdfs shell
hadoop fs 或者 hdfs dfs
hadoop fs –mkdir –p /user/root
/user目录是用户父目录,用户名做子目录,代表用户家目录
如果使用hdfs shell 缺省hdfs路径的时候,使用该目录
hadoop fs –D dfs.blocksize=1048576 –put hello.txt
for i in seq 100000;do echo “helloi>>hello.txt;doneHDFSshell![](https://imgblog.csdnimg.cn/20190112195428736.png?xossprocess=image/watermark,typeZmFuZ3poZW5naGVpdGk,shadow10,textaHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIwMTc0Mjg1,size16,colorFFFFFF,t70)windows:1hadooptar2hadoopHADOOPUSERNAMEroot3hadoopeclipsepluginseclipseeclipsemapreduce4root5bintoolsbinhadoop.dllc:/windows/system32/API1java2jari”>> hello.txt;done HDFSshell ![在这里插入图片描述](https://img-blog.****img.cn/20190112195428736.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIwMTc0Mjg1,size_16,color_FFFFFF,t_70)windows: 1,解压hadoop的tar包 2,设置hadoop的环境变量 HADOOP_USER_NAME root 3,将hadoop的插件放到eclipse的plugins目录下 *,eclipse重启,设置eclipse选项中mapreduce插件指向上面的路径 4,修改系统用户名为root 5,备份部署目录的bin目录,将tools目录下bin目录内容覆盖进去 将hadoop.dll 放到 c:/windows/system32/ API开发: 1,新建java项目 2,导入jar包:HADOOP_HOME/share/hadoop/{common,hdfs,tools}
3,创建conf目录,放入集群配置文件:core-site.xml,hdfs-site.xml并source
Configuration(true|false)
conf.set()
FileSystem
FSdatainputstream 面向程序
FSdataoutputstream
FileStatus
FsStatus
blocklocation
偏移量
位置 :block副本位置信息
大小
参考:不用实现
修改 主机名和ip的脚本
sed -i “s/(HOSTNAME=)./\1node0$1/gi" /etc/sysconfig/network
sed -i "s/(IPADDR=([1-9]+[0-9]?.){3}).
/\11$1/gi” /etc/sysconfig/network-scripts/ifcfg-eth0