- namenode会保存元数据
- 元数据: 文件数据 块数据 datanode数据
- 在服务运行过程中元数据保存在内存上
- 使用持久化将元数据保存在磁盘上
- secondarynamenode可以帮助namenode将元数据持久化存储到磁盘上
- 根据存储的方式不同将元数据分为:内存元数据和文件元数据
- 文件元数据分为两种文件形式
- edits 操作日志文件
- hdfs oev -i 转化的文件 -o 输出的文件名
- fsimage 记录了存储文件相关信息,注意:块数据和datanode信息数据不保存在fsimage
- hdfs oiv -i 转化的文件 -o 输出的文件名 -p xml
- edits 操作日志文件
- secondarynamenode什么时候进行持久化存储操作
- 按照配置文件指定的时间进行持久化 默认时间 1h
- 按照指定的操作次数进行持久化 默认次数 100万次
- 可以在core-site.xml中进行修改
- secondarynamenode默认情况下每间隔一分钟询问一下namenode是否要持久化
-
对大量的小文件数据进行归档
- hdfs是按块存储,每块大小为128m,大量存储小文件会浪费存储空
- 小文件归档后并不会删除原始文件。如果需要释放空间,需要手动删除原始文件
-
归档–本质是一个目录文件压缩过程,生成一个后缀为har的文件
- hadoop archive --archiveName 压缩文件名 -p 压缩文件位置 存放位置
hdsf dfs -ls /ming/a.har/part-0 直接查看part-0文件是数据合并后的文件,如果需要分别查看压缩前的文件,需要换成
hdfs dfs -ls har:///ming/a.har
HDFS的安全机制- 安全是为了保证数据在没有备份之前不允许进行移动删除等事务操作
- 触发机制
- 副本数量,默认情况必须保证所有副本都存储完成才能对应进行后续操作
- 可以手动指定触发的副本数量,假设有四个副本,可以直接指定达到2个副本时退出安全机制,安装比率进行指定 0.75 3/4=0.75 ,默认的比率 0.99
- 达到要求不是立马退出安全机制,需要等待30s
- 副本数量,默认情况必须保证所有副本都存储完成才能对应进行后续操作
- 在安全模式是可已进行数据获取
分布式计算框架
计算思想: 靠近数据源计算
设计思路:分而治之
- Map
- 数据拆分 key-value
- huawei xiaomi oppo huawei vivo xioami
- huawei:1 xiaomi:1 oppo:1 huawei:1 vivo:1 xiaomi:1
- shuffle:分区,排序,规约,合并 huawei:[1,1],xiaomi:[1,1]
- Reduce 对合并的数据求和 huawei:2 xiaomi:2
蒙特卡洛法 模拟法 概率统计
圆周率计算:统计投点数概率
假设圆周率为:p 设定一个半径r=1的圆 面积:pr2
设定一个以圆半径为边长的正方形 面积:1
词频计算hdfs创建input
hdfs dfs -mkdir /input
上传数据文件到/input
hdfs dfs -put /root/a.txt /input
/export/server/hadoop-3.3.0/share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples-3.3.0.jar wordcount /input /output
Python 实现词频计算实现map和Reduce方法
- 创建mapper.py实现map过程
- 将原始的字符串数据转为key value形式
- key是单词 value是1 key和value使用t分割
- 数据计算传输过程使用是二进制流形式
- sys.stdin可以获取流式数据,按照行获取数据
import sys
for line in sys.stdin:
line = line.strip()
worlds = line.split()
for world in worlds:
print('%st%d'%(world,1))
验证
cat a.txt | python mapper.py
- 创建reducer.py实现reduce过程
- reduce从map输出结果中对数据进行合并计算
- 按行获取流式数据
- 数据的前后空格去除
- 数据的切割
- 数据计算
- 数据输出
- dict[key] dict.get()
import sys
data_dict={}
for line in sys.stdin:
line = line.strip()
# xiaomi 1 [xiaomi,1]
data = line.split()
key_world=data[0]
value_count=data[1]
# 合并计算
if key_world in data_dict:
data_dict[key_world]+=int(value_count)
else:
data_dict[key_world]=int(value_count)
for key,value in data_dict.items():
print('%st%d'%(key,value))
- 使用mapreduce执行写好的代码
hadoop jar /export/server/hadoop-3.3.0/share/hadoop/tools/lib/hadoop-streaming-3.3.0.jar -D mapred.reduce.tasks=1 -mapper "python mapper.py" -reducer "python reducer.py" -file mapper.py -file reducer.py -input /input/* -output /outpy
hive工具 可使用sql语法进行数据计算,原理是hive将sql的计算过程转为了mapreduce过程
mapreduce计算流程分析 Hadoop的yarn服务资源管理服务
- 提供计算资源(cpu,内存)
- 只负责资源提供,不参与计算过程
- resourcemanager
- 负责管理nodemanager
- 负责协调整个集群服务的资源分配
- 所有资源请求都需要交给resourcemanager
- 单点故障
- resourcemanager不参与具体的计算过程,也不参与计算过程中的资源管理
- nodemanager
- 负责监控机器的运行资源
- 定时将自己的信息告知给resourcemanager
- 完成对分配好的资源再分配–对运行程序的资源进行分配管理



