hadoop海量数据实现原理
如何将机器学习与hadoop对接 不考虑安装二次开发运行
数据是机器学习的核心 hadoop框架
谷歌100亿网页 2011年谷歌100万台服务器 双十一购物信息统计机
java+hadoop是大数据工程师
运行和监控是运维工程师 能够会安装部署监控hadoop的运维工程师是云架构工程师
程序员为了分布式系统改造程序和数据
云计算平台 按小时计费的租赁计算系统 大量数据 海量数据处理计算 自己组建hadoop成本高
微软 亚马逊 华为 腾讯 阿里 费用昂贵
节点 机架 通过switch连接组成集群
集群是多个节点干一件事 分布式是多个节点分工干一件事 分布式集群通过hadoop调度将海量数据分解成块 并行处理 聚合
map reduce思想核心如何处理大规模数据 map任务key一般只有一个 1.map逐行 分解 预聚合 2.group by 排序 3.reduce key聚合 value聚合
hadoop 并行 yarn调度监控各个 子节点对数据块进行遍历 一个块一个map 一个任务一个reduce
提高并行效率 调整map reduce默认处理文件大小 map进行预处理 远大于全部reduce集中处理数并行效率
节点故障 map所有此任务节点重启map reduce待完成未完成重启reduce name节点呼叫管理员
spark 框架底层mapreduce 内存运行高效适用计算学习占内存处理效率高 稳定性不如map map适用数据准备占硬盘io
hive数据查询提供hql底层mapreduce 效率高于用Mapreduce进行数据查询 需要装hadoop 或spark mysql适用频繁修改hive适用数据库查询
关联规则基本概念
1.项目 每一个数据样本 一件商品
2.事物 项目的集合 购物车
3.*项集 有意义的项目集合叫项集 面包牛奶搭配经常出现 叫二项集
*参数
4.阀值 支持度高到一定程度才会有观测的意义
5.支持度 项集出现的频繁程度 1000个购物单中牛奶和面包同时出现的次数
6.频繁项集 项集的支持度超过预设阀值 1.先找到频繁项集 确认哪些是经常出现的 2.找到有意义规则
7.信任度 频繁项集中产出规则 查看谁对谁的影响更大 一个出现时另一个出现的概率 1000单中面包出现时牛奶出现的次数 或者相反
关联规则常用挖掘算法
1.*Apriori
apriori算法缺点 验证过程是性能瓶颈 可用spark代替mapreduce
1.交易数据量非常大
2.例如频集10个需要扫描整个数据集10遍
3.很大io负载
2.*FPGrowth 关联规则挖掘算法 特点速度快 在spark模块内有机器学习自动实现 不生成候选集直接生成频繁模式
美团大数据架构 海量数据日志 分析 挖掘 推荐 战略目标定制
1.最早数据处理hive为主 mapreduce yarn hdfs
2.机器学习mapereduce多轮迭代支持不给力占用磁盘Io效率低 业务量庞大严重影响执行效率 hdfs要求数据结构化
3.业务量增长与复杂
4.业务复杂情况下数据是半结构或非结构化 需要对数据清洗和转换etl e提取t转化l加载
5.加入了spark 后来spark业务比例占80% 效率比Hive提高10倍运算效率
6.spark 分布式计算框架 底层map reduce 是map reduce替代方案
7.兼容hdfs和hive 与map reduce运算时写入hdfs不同是写入内存中
**优化方向 启动多少reduce和map任务 优化 云架构工程师和程序员合作优化
实操经验
优化并行
**设置map的mapred.max.split.size定义map处理文件大小默认256m 减小处理文件大小 任务会变多 利于任务分配均衡
**设置reduce修改hive.exec.reducers.bytes.per.reducer修改默认处理文件大小 减小
**改进combiners map在map进行预处理 map任务更适合并行化并发处理 map节点多 比集中到reduce处理更好
1.Map数正常情况下远大于节点数
2.通常设定一个分布式数据块对应一个map任务
3.提升加载平衡 加速节点故障恢复速度
4.正常拿到数据会出现数据块分布不均情况 会出现有些节点负载过重情况 会拖慢系统
6.很多时候一个map任务是同一个Key产生的键值对 将reduce一部分任务拿到map处理 做预合并
7.合并器combiner预先合并了单个map节点的键值对
节点工作流程 网游类似 客户端向服务器上传心跳数据
1.datanode启动后向namenode注册 注册成功被namenode监控
2.datanode启动后每小时会向namenode上报本地所有块的元数据信息 不是数据
3.心跳每3秒一次 向主节点发送子节点当前状态 空闲则安排任务 超过10分钟没收到子节点心跳 则认为该节点不可用 将任务安排给其他节点容灾
总结
1.reduce函数需要写 map函数有时候不用写
2.程序员承担的任务对已有算法mapreduce化
3.map主要工作修改key 将单线程文件kv切分转化为多线程kv文件 reduce主要修改values 将得出结果归总计算
4.spark 框架 底层也是map reduce 内存中计算 占用内存资源 速度快 稳定性不如map 只读一次
5.handoop 是map reduce 在hdfs上不断迭代输入输出 中间结果在磁盘里操作 占用磁盘io资源
6.map reduce数据处理适用 提取 转换 处理 写入 机器学习适合用spark因为不停迭代
7.特征工程用map reduce 导出特征机器学习训练学习用spark
8.hadoop用 hadoop streaming模块编写map reduce 支持任何语言
三方工具hive 从hadoop数据仓库hdfs快捷提取数据 类似sql语句的方法效率更高
1.安装hive需要有hadoop 在windows安装比linux麻烦
2.hive提取hadoop数据基于底层mapreduce功能的一种封装 通过driver生成任务查看数据
3.可以将结构化的数据映射为一张表 并提供简单的sql查询功能 简单的map统计 学习成本低
4.架构介绍三种接口 cli cliernt客户端 wui网页版
5.cli模式类似命令行 需要下载hive server客户端 需要同时安装mysql 会存放hdfs的元数据 名 大小 时间戳
6.hql语句生成的查询细化存储在hdfs中 并有map调用执行
7.hadoop与mysql区别 mysql数据经常改变 hadoop数据不经常修改进行分析统计
8.无hive查看数据要写mapreduce 有hive写sql语句就能查看数据 数据库管理员管理查看数据 hadoop基本都配备hive
hadoop map 并行处理 按块节点机架同时进行得到中间键值对
经过分区函数决定传到哪处理
reduce 并行处理 并行处理能力远不如map 需要在map中就进行处理
拓展知识mapreduce的运行环境 hadoop还需解决
1.对原始数据进行区分partition 分块 分节点 中间值移动和分区数据移到计算端reduce
2.调度程序在一系列机器集群上并行 yarn分布式资源调度
3.执行中间过程的group by key步骤 不用写hadoop自动
4.处理运行过程中的突发节点故障 如何补
5.处理并行运行过程中的节点和节点之间的通信 调度器完成
hadoop数据流在哪里
输入和输出包括map得到的中间数据都被存储在分布式文件系统hdfs上 变量在内存中
实际调度时yarn会尽可能少的移动数据 一个mapreduce结果能够作为另一个mapreduce的输入
主节点概念
namenode 控制子节点数据块
1.主节点负责系统的协调 执行yarn功能
2.map任务的执行启动等待 汇总到哪个reduce任务数据传输交换
3.保证任务高效并发执行 每个节点的任务状态有三种 等待初始 正在执行 完成
4.当一个节点任务完成会再转换为等待初始 接受等待任务
5.一个map任务完成后会向主节点发送它产生的r各中间文件的路径和大小通过运算决定传递给谁 每个文件对应一个reduce任务
hadoop节点之间关系
**节点分为1.namenode主节点 2.datanode子节点 3.子节点上会有n个block数据块
数据块以文件形式存储分为2部分 数据本身和此数据的元数据
元数据是用来描述整个数据的长度效验和时间戳
hadoop单节点故障对系统造成什么影响
1.map节点 所有其他map节点都会被重置为待初始 将所有待初始的Map任务重新分配到能工作的节点上
2.reduce节点 只有运行中和未完成的reduce任务被设定为待初始 这些待初始任务被重新分配至其他节点上
3.主节点故障 整个mapreduce中断 同时通知服务器管理员
数据挖掘是一项从大量数据记录中提取有价值的 人们感兴趣的知识
取知识一般可表示为 概念concepts 规律regular ides
1.*关联规则rules 样本和样本间的关联性 一个样本出现概率很高另一个样本也随之出现
2.*模型patterns 通过特征经过函数得到结构
关联规则是当前数据挖掘研究的主要方法之一 反应一个事物与其他事物之间相互依存性和关联性
典型的关联规则发现问题是对超市中的购物车数据进行分析
通过发现顾客放入购物车不同商品之间的关系来分析客户的购买习惯 沃尔玛发现男顾客买啤酒后买尿不湿
关联规则发现数据中的规律
1.超市中什么产品会一起购买 组合推荐 相关优惠推荐
2.顾客在购买了一台Pc之后下一步会购买 搭配推荐 类目和类目关联推荐T恤牛仔裤
3.哪种dna对此类药物敏感 医学相信实际统计 不相信机器学习 关联规则属于统计学是被信任的样本与样本的联系
4.如何对文档自动分类
5.论文查重
关联规则基本概念
1.项目 每一个数据样本 一件商品
2.事物 项目的集合 购物车
3.*项集 有意义的项目集合叫项集 面包牛奶搭配经常出现 叫二项集
*参数
4.阀值 支持度高到一定程度才会有观测的意义
5.支持度 项集出现的频繁程度 1000个购物单中牛奶和面包同时出现的次数
6.频繁项集 项集的支持度超过预设阀值 1.先找到频繁项集 确认哪些是经常出现的 2.找到有意义规则
7.信任度 频繁项集中产出规则 查看谁对谁的影响更大 一个出现时另一个出现的概率 1000单中面包出现时牛奶出现的次数 或者相反
强关联规则 支持度和信任度 都满足用户 预给定阀值的规则
例
id 交易购买的物品
20 a b c
10 a c
40 a d
50 b e f
设置最小支持度s50% 最小可信度c50%可得到
分析 频繁项集a c 4单出现2次支持率50% a出现3次 c出现2次 c出现时a都出现了可信度100% a出现时c有一次没出现可信度2/3
a–>c(s50%,c66%)a推出c c–>a(s50%,c100%)c推出a
关联规则常用挖掘算法
1.*Apriori 关联规则挖掘算法基础 Agrawal等人提出的AIS,Apriori 和AprioriTid
2.*FPGrowth 关联规则挖掘算法 特点速度快 在spark模块内有机器学习自动实现 2000年左右han等人提出的不生成候选集直接生成频繁模式
Apriori源于算法使用了频繁项集性质的先验prior知识 先验有数据推导出结果 后验先假设再用数据论证
步骤 1.通过迭代检索频繁项集 2.在频繁项集内找到符合最小信任度的规则 第一步是核心占计算量的大部分
1.abc为频繁项集那么ab与ac一定也是频繁项集
2.efg是非频繁项集那么efga肯定也是非频繁项集
有几个项目称为几项集 k项集
3.剪枝步Ck 过滤到所有未达到阀值的项集 从单项集开始 然后二项集 然后三项集
4.连接步Lk 找到组合再剪枝执行k次 拿到信任度
例a b c d e 五种商品交易记录表 找出三种交易关联情况 最小支持率50%
交易号 商品
10 a c d
20 b c e
30 a b c e
40 b e
分析支持率 k1 4次交易个元素出现次数 a2/4 b 3/4 c3/4 d1/4 e3/4 排除d
k2 ab1/4 ac2/4 ae1/4 bc2/4 be3/4 ce2/4 排除ab ae
k3 组合查看出现概率ac bc abc ac ce ace bc be bce bc ce bce be ce bce bce>50
apriori算法缺点 验证过程是性能瓶颈 可用spark代替mapreduce
1.交易数据量非常大
2.例如频集10个需要扫描整个数据集10遍
3.很大io负载
集群概念
单点结构 节点 单机
1.cpu memory disk 成为处理海量数据的限制
运算都在内存里进行 模型使用复杂算法运算速度慢 实际使用中算法和数据更复杂更多
械硬盘零散数据读取慢 十几兆几十兆每秒 固态硬盘几十兆一百多兆每秒 读取以tb为单位的数据困难
集群架构 将集群内节点的内存·存储·运算都可以作为集群
1.分布式 是不同节点针对同一业务分工 集群不是分布式
2.集群 是多个节点运行同一业务
3.节点 一个节点是一台单机 小单位一般一个机架是1-4个节点
5.机架rack 多台服务器节点被一个switch交换机控制 成为一个机架rack 一个机架rack一般有16-64个linux节点
6.switch交换机 连接多个rack或swith组成集群
7.节点之间带宽1gbps换算除8 switch之间带宽2-10gbps
集群面临问题
1.节点故障 千台平均每天一台故障 100万平均每天千台故障
2.数据持续性 多台进行同一工作时一节点故障 能不影响整个集群的业务进行 不让多台等一台
3.长时间集群运行 如何应对不同节点的故障
4.传输速率 网络带宽瓶颈 带宽1gbps 移动10tb数据将花费1天
5.分布式编程非常复杂 集群和分布式在一个集群中是同时存在的 需要简单的模型隐去所有的复杂性
6.scrapy解决了分布式爬虫问题
hadoop分布式集群架构
hadoop 集群架构 解决了分布式的存储和计算问题 三方软件架构优化
1.hadoop 集合了分布式和集群的软件框架 依据mapreduce原理 底层用java语言实现的分布式处理机制 不用关心底层java程序
2.mapreduce是hadoop中的一个数据运算核心模块 也是中心思想 可以用py调用使用 能够对大量数据进行分布式处理的软件框架
3.MapReduce是一种编程模型思维 目的能够方便的把代码放入分布式架构取执行 将传统单机代码用mapreduce思维改造
5.google的MapReduce编程模型和框架 能够把应用程序分割成许多小的工作单元 并把这些单元放到任何集群节点执行
hadoop为什么能解决集群遇到的问题 节点宕机 传输效率低 #用map reduce解决
1.可以在多节点上冗余的存储数据 保证数据或业务的持续性 冗余就是重复重叠 废话
2.计算移动到数据端 判断大多数数据存在哪个节点 在该节点计算最大程度减少数据移动
3.简单的模型隐藏所有的复杂性 类似fit transform 不用考虑底层
冗余化数据存储结构
1.分布式文件存储系统 例如google的GFS hadoop的HDFS
提供全局文件命名空间 冗余度和可获取性
命名空间是 由变量 函数 类 块 包 形成一个路径 用于定位数据存放的位置
冗余度 将数据copy了很多份 散布存到文件系统的不同位置
2.典型的应用场景与模式
超大级的数据量100G-100Tb
3.是不是所有的文件都适用分布式文件系统
适用数据格式尽量统一
最好是表结构 数据之间耦合性低 每行是一个数据 格式固定 容量大小可以均分
不适用情况 数据为程序代码 程序代码很多 在最后一行还需要调用第一行的代码 所以程序要分块
4.分布式文件系统限制
数据很少被全部替换 数据替换很慢需要算分多少块
最常见的操作为读取和追加 例如京东淘宝网站商品信息
分布式文件系统特点 将数据打包分成块 在多台机器上重复存储 保证数据的持续性和随时可取性
1.服务器块同时也用作计算服务器 把运算挪向数据处
根据路径调取最近数据一般rack以内 在存储需求块最多的服务器上进行计算
2.服务器块 所有操作系统都是文件操作系统 linux下任何东西都是由文件组成的
文件被分作16-64大小的连续块 每个块会被重复存储2-3次 尽量保证重复的数据块在不同的机架上
3.主节点
hadoop里的hdfs叫做name节点命名空间/路径 通过存储元数据记录文件存储结构和地址 最常见操作为读取和追加数据
4.文件访问的客户端库 通过分布式系统找文件
询问主节点name获取块服务器地址 直接连接响应服务器块获取数据
hadoop核心 mapreduce变换数据 数据分析 数据处理 数据挖掘 机器学习
海量数据通过分布式软件进行分布式处理
hadoop分为四大模块
1.Hadoop Common 工具包 为其他hadoop模块提供基础设施 基础类库基础工具包
2.Hadoop HDFS 分布式文件系统 对海量数据存储
3.Map-Reduce 是分布式文件系统的处理策略 编程模型 对海量数据处理 帮助我们读写分布式文件 分布式计算
4.Yarn 调度中心 分布式资源管理调度 数据块计算块移动调度 在哪个节点进行计算
编程思想Map-Reduce大规模数据如何处理
案例超大文本统计文本中词出现频率
场景.文件本身太大无法全部加载入内存 2.所有词和频次统计超出了内存空间 3.运算速度缓慢
目的
1.web服务器日志中高频url 哪个客户地址或哪个url经常访问或者黑客潮水攻击
2.搜索词统计 客户经常搜索什么
3.区分垃圾邮件和短信
4 评论舆情分析 用户关注点
编程人员需要定义2个函数 map函数和reduce函数
MapReduce运行逻辑 要根据具体问题具体实现
1.Map 分散 对整个架构里相关的文件块逐个文件块逐行扫描遍历 扫描同时抽取我们感兴趣的内容keys
2.Group by key 洗牌排序和洗牌 相同的排到一起
3.Reduce 汇总 将相同的key聚合运算 总结 过滤或转换 写入结果 在不同的节点上进行运算归拢
map reduce 运行原理 把项目(可迭代集合)发散到多个节点同时运行 对每个元素执行指定的方法 产生一系列中间兼值对
1.通过输入的k文件名 v文件路径(一个键值对) 通过map将超大文件按行拆分
–迭代每行得到其中每行的词k和对应出现次数v
每行k单词 v
单词出现次数 可以对每行聚合或不聚合
2.Group by key 洗牌排序和洗牌 相同的排到一起
3.reduce 汇聚输入从各块map得到的中间键值对k和v
所有的相同k合成一个k
对所有v进行聚合运算输出k
和v``
在map中进行每行预处理 速度高于完全依赖reduce汇总
map reduce思想核心如何处理大规模数据 逐行 分解 排序 key聚合 value聚合
ubuntu模拟操作案例
cat 打开 cat doc.txt | python map.py | sort | python reduce.py > myout
| 管道符号 将前面参数传递给后面的方法
sort 系统自带排序 相当于group by key
> 输出后面跟文件名
map.py
import os
import sys
import re
if if name == ‘main’:
handler =sys.stdin
for line in handler:#按行
if not line:#没有就下一行
continue
terms =line.strip().split(’ ')#去头尾空格以空格切分
for i in terms :
print(i)
reduce.py
import os
import sys
import re
if if name == ‘main’:
handler = sys.stdin
word_dict={}#字典
for line in handler:#value
if not line:
continue
terms = line.strip().split(" ")
for i in terms:
if i in word_dict:#计数
word_dict[i]+=1
else:
word_dict=1
for j in word_dict:#key
print(j,word_dict[j])#字母 计数
#找出共同朋友
#导入数据
import os
path = os.path.join(os.getcwd(), ‘group.txt’)
with open(path, ‘r’) as f:
data = f.read()
#data
#实现
import os
import sys
import re
def map_friend(data):
handler =data.strip().split(’\n’)
grouped={}
for line in handler:#按行
line_no_space=[]
for i in line:
if (i==’ '):#去空格
continue
line_no_space.append(i)
name=line_no_space[0]
friends=line_no_space[1:]
grouped[name]=friends#按人分组
return grouped
grouped=map_friend(data)
#建立一个朋友集合 a have e b have e c have e e是a b c的朋友 abc 共同朋友e
#多个reduce节点枚举不能用
reduced=reduce_friend(grouped)
friend_list_combine=[]
#groupd.get(key)
for one in grouped:
#print(grouped.get(one))
friends=grouped.get(one)
for friend in friends:
if friend in friend_list_combine:#去重
continue
friend_list_combine.append(friend)
print(friend_list_combine)
name_index={name:index+1 for index,name in enumerate(friend_list_combine)}枚举
print(name_index)
for one in grouped:
friends=grouped.get(one)
print(friends)
for friend in friends:
print(friend)
friend_num=name_index[friend]
print(friend_num)
def reduce_friend(grouped):
name_exists=[]
for k1,v1 in grouped.items():#.items()同时遍历出key value
# print(k1,v1)
name_exists.append(k1)
# print(name_exists)
for k2,v2 in grouped.items():
if k2 in name_exists:#跳过出现过的 跳过自己
continue
every_list=[]
for n in v2:
if n in v1:#有交集
every_list.append(n)#朋友列表
if every_list:#不为空
print(’%s与%s共同的朋友是%s’%(k1,k2,str(every_list)))
reduced=reduce_friend(grouped)