1.有一个超级大的文件,一台机器存储或计算无法完成的,里面存储都是ip,每行一个,计算大文件中每一个ip出现的次数以及出现次数最多的ip
这个超级大的文件如何存储?
1)分而治之的思想 分布式存储
将超级大的文件切分成多个小文件 每一个小文件存储在一个服务器上
无限的扩展服务器的个数
横向扩展:服务器的节点个数上扩充
优点:无上限 12000
2)纵向扩展:增加服务器的硬件配置
也可以在一台服务器上 加硬盘
有上限的
摩尔定律:
服务器的硬件性能 18-24月 提升一倍
硬件发展周期 18-24个月
怎么样计算:
1)每一个服务器中计算自己存储的小文件的每一个ip的出现次数
分而治之的思想 分布式计算
代码实现:
1)定义一个输入文件流 BufferedReader 进行文件读取
2)定义一个容器 存储读取的内容
map
3)进行读取 放在map中
判断ip是否已经存在
不存在 第一次放入
map.put(ip,1)
存在:
map.put(ip,上一次次数+1)
2)汇总统计所有服务器的计算结果 得到最终结果
4)在汇总统计的结果上 求出现次数最多 map的value的最大值
作业 实现单个文件中ip的最大次数
2.两个超级大的文件,每个文件存储的都是url,每行一个,求这两个文件中相同的url
两个文件如果都是小文件:
1)创建两个流 BufferedReader 进行读取两个小文件的
2)定义两个容器 分别存储两个文件的内容
set
3)循环遍历一个set集合 另一个set集合中 判断是否包含
包含 则返回
大文件:
分而治之+ 分区
分区:将一个大的数据集 切分成不同的小区域 每一个区域就叫做一个分区
每一个分区切分的原则 分区算法
最终解决思路:
1)去重 先将每一个大文件进行切分
每一个文件切分 按照相同的分区算法
两个文件的每一个文件 分区的数量 相同或者倍数关系
2)对比两个文件对应分区的
3.有一个超级大的文件,里面存储的都是url,每行一个,求:用户给定一个url,快速判断用户给定的url是否在文件中
小文件中:
1)定义一个输入文件流
2)定义一个容器 set
3)进行读取 放在 set集合中
4)判断
set.contains(用户给定的) true false
大文件:
快速查询
数组的查询速度快 索引 下标
访问下标的时候快 6
将url存储在数组的下标中
数组的下标 非负的
url 字符串 url.hash & Integer_Max 取绝对值
数组的真实值 存储的是否存在 boolean true false 1位 0 1
数组类型 bit位数组 bit[] 位图
用于判断的数组的真实元素中存储的就是元素是否存在 0 1
这种方式进行判断的时候 存在严重的 误判
解决误判 方案 多设计几种hash算法
无论设计多少中hash算法 误判问题是不可避免的 只能尽量降低
误判率:
1)数组大小 m
2)hash算法的个数 k
3)数据量 n
当 k== 0.7 m /n 误判率最低的
数组大小 》 数据量
数组大小 是 数据量的 10倍
数据量 10000 数组 100000
k= 0.7*10 =7 个 0.001%
这个时候 进行判断一个元素是否存在
求7次hash 判断7次 有一次返回0 截止了
7次都为1 存在
布隆过滤器 hbase的底层原理
1111011011011 -
& 0111111111111
0111011011011
大数据介绍:
概念:
数据:数据就是数值,也就是我们通过观察、实验或计算得出的结果
数字 图片 视频 。。。。。
数据的分类:
按照结构分:
结构化数据:
mysql表中的数据
excel 表
严格的二维表数据
每一行都有相同的列 每一行对应的列的类型一致的
stu
1,zs,18
1,zs,18
非结构化数据:
没有任何结构的数据
视频 图片 音频 。。。。
二进制存储的
半结构化数据:
有结构 没有严格的二维表结构
html css xml json
标签 进行划分结构的
产生的时间分:
离线数据:
数据已经存在的 静态的
实时数据:
实时产生的数据 动态的
近实时数据:
大数据:
概念大而复杂的数据集 传统的手段无法处理(存储|计算)
数据单位:
1 Byte =8 bit
1 KB = 1,024 Bytes = 8192 bit
1 MB = 1,024 KB = 1,048,576 Bytes(普通用户数据级别) 文本
1 GB = 1,024 MB = 1,048,576 KB
1 TB = 1,024 GB = 1,048,576 MB
1 PB = 1,024 TB = 1,048,576 GB(企业级数据级别)
1 EB = 1,024 PB = 1,048,576 TB
1 ZB = 1,024 EB = 1,048,576 PB(全球数据总量级别)
1 YB = 1,024 ZB = 1,048,576 EB
1 BB = 1,024 YB = 1,048,576 ZB
1 NB = 1,024 BB = 1,048,576 YB
1 DB = 1,024 NB = 1,048,576 BB
注意:
企业数据量 TB PB
5G VR 购物
特点:
容量大
数据量大 现在的数据产生快 数据类型复杂(视频)
种类多
结构 半结构 非结构化
速度快
随时随地都在产生数据
互联网没有秘密的
价值高:
整体价值高 单条数据价值低
价值密度低
真实性
大数据的价值:
用户画像 根据用户的所有的商业行为 给用户打的标签
用户网络商业活动 消费习惯 搜索关注点 人际关系
人物的标签图
精准营销 千人千面
大数据中的几个核心概念:
1.集群
一个任务(存储|计算)需要多个服务器(节点 网络不同)共同完成,这个多个服务器组成的一个集体 叫做集群
集群中的每一个服务器 就叫做一个节点
2.分布式:
一个任务需要多个节点共同完成 这个任务的执行方式就是分布式的
分布式存储
分布式文件系统
一个大的文件 被切分成分多个小文件 每一个小文件被存储在一个节点上 最终这个大文件被存储在了多个节点上
分布式数据库
一个大表 被切分成多个小表 存储在多个节点上
分布式计算
一个计算任务很大 一个节点计算不了 将这个计算任务进行拆分 分别运行在不同的节点上进行计算
3.负载均衡:
一个集群中 各个节点承担的压力(存储)相当
一个项目 5个人 干活的
一个人 90% 4个人 10% 负载不均衡
一个集群 5个节点
存储任务 10T
每一个节点 2T 一定负载均衡吗?
负载均衡一定和每一个节点的硬件配置相关
集群中的每一个节点存储的数据量的占比相当的
情况1:
5个节点硬件配置一样 每个节点2T 负载均衡的
情况2:
3台:
128G 4T
2台:
256G 8T
1:1:1:2:2
前3台 10T /7
后两台 20T /7
前3台:
每一个节点 2T 50%
后2台:
每一台 2T 25% 不均衡
每一台 4T 50% 负载均衡
数据的处理流程:
数据采集----数据存储----数据清洗(ETL)---数据计算---数据存储结果-----web可视化展示
数据采集(数据来源):
1)业务数据 自己的数据
要么自己的业务数据库 自己网站产生的日志
2)爬虫
分析互联网行业的从业者的平均薪资
招聘网站 51job boss 拉钩
反爬虫 反反爬虫
3)数据买卖
个人征信
中国人民银行
放贷
个人征信
数据的处理:
1)缺失字段的数据
1)不影响最终分析结果 删除
网站浏览日志数据
2)对于一些和金钱相关的数据
通过各种计算 补充上 精准
3)要求精密的数据
工业大数据
传感器数据
炼钢 温度 根据经验值补充
2)敏感数据
手机号 身份证号
脱敏处理
将敏感字段进行加密 MD5 uuid
hadoop的介绍
hadoop的产生背景:
google 搜索引擎的
海量的网页数据如何存储的问题?
海量网页数据如何计算?
海量网页数据快速查询?
解决了 并没开源 也没有公开解决思路
Doug Cutting
搜索引擎 lucence
子项目 Nutch 爬虫
和google同样的问题
2003年 google 发布了3篇论文
GFS---- GOOGLE FILE SYSTEM google的文件系统
MAPREDUCE--- google的分布式计算方案
BIGTABLE--- google的分布式数据库
doug cutting 将google的3篇论文 使用java语言实现了 并且开源 贡献给apache
GFS--- HDFS
MAPREDUCE---MAPREDUCE
BIGTABLE---HBASE
将hdfs mapreduce 放在一起 hadoop1
hadoop解决的问题:
海量数据的存储 海量数据的计算
hadoop1.0 分为2个模块的
hdfs
mapreduce
hadoop 是什么?
组成模块:
包含模块(代码结构):
hadoop2.0:
hadoop common: 工具类
hdfs --(hadoop distributed file system): hadoop的分布式文件系统
mapreduce: hadoop的分布式计算服务
yarn :hadoop的分布式资源调度框架
功能分 模块:
hdfs 存储
mapreduce 计算
yarn 资源调度
操作系统 文件系统 计算程序
windows windows NTFS qq,微信
hadoop YARN HDFS MAPREDUCE
hadoop基于普通廉价机的 提供高可用 高扩展 高容错的分布式存储计算服务的
hadoop 设计的时候 考虑到 集群中任何一个节点 任何时间 都有可能出故障 hadoop已经帮你规避了
hadoop的组成:
hdfs: 分布式存储
一主多从 一助理
3个角色
namenode
分布式存储的老大
管理每个节点上存储数据的编号 对应关系
datanode
负责真正的数据存储的
真正干活的
secondarynamenode
namenode的助理
备份namenode的数据 帮助namenode减压
mapreduce:
分布式计算程序
安装完成 没有对应进程
yarn:
服务于计算程序的
主从
resourcemanager:
资源调度的老大
决定哪一个计算任务需要多少资源 在哪一个节点分配资源的
nodemanager :
提供资源运行任务的
hadoop安装完成:
进程 jps
namenode
datanode
secondarynamenode
resourcemanager
nodemanager
hadoop的安装:
1)安装版本:
hadoop2.6 不建议
hadoop2.7.7
不选择最新 不选择老版本
2)安装的模式:
单机
伪分布式
一个节点
完全分布式安装
高可用
联邦
3)集群规划
3台 :硬件 内存 1G 主节点1.5–2G
hdp01 hdp02 hdp03
hdfs namenode
datanode datanode datanode
secondarynamenode
mapreduce
yarn resourcemanager
nodemanager nodemanager nodemanager
注意:
1)namenode secondarynamenode 不能在同一个节点上
2)主节点一般性能高一些 内存 1.5G
4)开始安装:
1)安装准备
1)ip
2)主机名
hostname
3)主机映射
vi /etc/hosts
192.168.191.201 hdp01
192.168.191.202 hdp02
192.168.191.203 hdp03
4)检查防火墙和selinux
关闭防火墙
service iptables status
service iptables stop
selinux linux高级权限管理 运维
sudo vi /etc/sysconfig/selinux
SELINUX=disabled
5)开启普通用户的sudoers权限
vi /etc/sudoers
hadoop ALL=(ALL) ALL
切换为普通用户了
6)修改系统启动级别
修改为3
sudo vi /etc/inittab
id:3:initdefault:
7)进行免密码登录
3台机器之间 都要做
跟用户有关 必须普通用户
ssh-keygen 生成秘钥
ssh-copi-id 主机名
验证:
ssh hdp01
exit
ssh hdp02
exit
ssh hdp03
exit
8)安装jdk
java -version
1.8
9)时间同步
1)手动进行
date -s "时间"
2)和时间服务器同步
sudo ntpdate ntp1.aliyun.com
ntp1.aliyun.com
ntp2.aliyun.com
ntp3.aliyun.com
ntp4.aliyun.com
ntp5.aliyun.com
ntp6.aliyun.com
ntp7.aliyun.com
2)安装hadoop
只需要在一台机器配置完成 远程发送到其他节点
1)上传安装包
2)解压
tar -xvzf hadoop-2.7.6.tar.gz
3)配置环境变量
bin hadoop的各种脚本
etc 配置文件
lib 依赖包
sbin 执行命令脚本
share hadoop中的公共资源
sudo vi /etc/profile
export HADOOP_HOME=/home/hadoop/apps/hadoop-2.7.6
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
生效环境变量
source /etc/profile
检查hadoop的环境变量
hadoop version
4)修改hadoop的配置文件
$HADOOP_HOME/etc/hadoop
/home/hadoop/apps/hadoop-2.7.6/etc/hadoop
1)core-site.xml common
<configuration> 核心配置文件标签
<property> 一个配置项
<name>key</name>
<value>value</value>
</property>
</configuration>
<property>
<!-- hdfs的主节点 namenode 的访问入口 hdfs://hdp01:9000 -->
<name>fs.defaultFS</name>
<value>hdfs://hdp01:9000</value>
</property>
<property>
<!-- hdfs存储数据的目录 配置家目录下某一个目录 -->
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/data/hadoopdata</value>
</property>
2)hdfs-site.xml hdfs
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/data/hadoopdata/name</value>
<description>namenode相关数据的存储目录</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data/hadoopdata/data</value>
<description>datanode相关数据的存储目录</description>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
<description>HDFS 的数据块的副本存储个数</description>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>hdp02:50090</value>
<description>secondarynamenode 运行节点的信息,和 namenode 不同节点</description>
</property>
3)mapred-site.xml mapreduce
cp mapred-site.xml.template mapred-site.xml
vi mapred-site.xml
<property>
<!--配置mapreduce的计算任务的资源调度框架-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
4)yarn-site.xml yarn
vi yarn-site.xml
<property>
<!--配置yarn的主节点-->
<name>yarn.resourcemanager.hostname</name>
<value>hdp03</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>YARN 集群为 MapReduce 程序提供的 shuffle 服务</description>
</property>
5)hadoop-env.sh java环境变量
加载 /etc/profile 启动hadoop hadoop-env.sh
export JAVA_HOME=${JAVA_HOME}
需要改
export JAVA_HOME=/home/hadoop/apps/jdk1.8.0_73
6)slaves 从节点信息
datanode nodemanager
datanode 和 nodemanager 节点相同的
一行一个主机名 不要有多余的空格或换行
hdp01
hdp02
hdp03
5)将hadoop的安装包远程发送到其他节点
scp -r /home/hadoop/apps/hadoop-2.7.6 hdp01:/home/hadoop/apps/
scp -r /home/hadoop/apps/hadoop-2.7.6 hdp03:/home/hadoop/apps/
6)远程发送hadoop的环境变量
sudo scp /etc/profile hdp01:/etc/
sudo scp /etc/profile hdp03:/etc/
source /etc/profile
7)格式化namenode
在namenode节点上 hdp01
hadoop namenode -format
格式化成功的标志:
19/04/29 17:17:22 INFO common.Storage: Storage directory /home/hadoop/data/hadoopdata/name has been successfully formatted.
一定要格式化成功
报错:修正报错 重新格式化
注意:成功的格式化只能一次
8)启动
启动hdfs 在任意节点执行即可 执行一次
start-dfs.sh
jps查看进程
web网页访问
namenode主机名或ip:50070
启动yarn 最好在resourcemanager节点执行
start-yarn.sh
jps查看进程
web页面访问
resourcemanager主机名或ip:8088
注意:启动 可能某一个节点启动不了 重启
格式化成功才能启动了