大数据的由来
• 大数据
– 随着计算机技术的发展,互联网的普及,信息的积累
已经到了一个非常庞大的地步,信息的增长也在不断
的加快,随着互联网、物联网建设的加快,信息更是
爆炸是增长,收集、检索、统计这些信息越发困难,
必须使用新的技术来解决这些问题
什么是大数据
• 大数据的定义
– 大数据指无法在一定时间范围内用常规软件工具进行捕捉、
管理和处理的数据集合,需要新处理模式才能具有更强的
决策力、洞察发现力和流程优化能力的海量、高增长率和
多样化的信息资产
– 是指从各种各样类型的数据中,快速获得有价值的信息
• 大数据能做什么
– 企业组织利用相关数据分析帮助他们降低成本、提高
效率、开发新产品、做出更明智的业务决策等
– 把数据集合并后进行分析得出的信息和数据关系性,
用来察觉商业趋势、判定研究质量、避免疾病扩散、
打击犯罪或测定即时交通路况等
– 大规模并行处理数据库,数据挖掘电网,分布式文件
系统或数据库,云计算平和可扩展的存储系统等
特性
- 大体量– (V)olume (大体量)
可从数百TB到数十数百PB、甚至EB的规模 - 速度快– (V)elocity(时效性)
很多大数据需要在一定的时间限度下得到及时处理 - 不限种类– (V)ariety(多样性)
大数据包括各种格式和形态的数据 - 统计分析,预测性– (V)alue(大价值)
大数据包含很多深度的价值,大数据分析挖掘和利用将带来巨大
的商业价值 - 真实性– (V)eracity(准确性)
处理的结果要保证一定的准确性
hadoop
开源,基于java开发,提供分布式基础架构, 特点:高可靠性、高扩展性、高效性、高容错性、低成本
• 2003年开始Google陆续发表了3篇论文
– GFS,MapReduce,BigTable
• GFS
– GFS是一个可扩展的分布式文件系统,用于大型的、分布式
的、对大量数据进行访问的应用
– 可以运行于廉价的普通硬件上,提供容错功能
• MapReduce
– MapReduce是针对分布式并行计算的一套编程模型,由
Map和Reduce组成,Map是映射,把指令分发到多个
worker上,Reduce是规约,把worker计算出的结果合并
• BigTable
– BigTable是存储结构化数据
– BigTable建立在GFS,Scheduler,Lock Service和
MapReduce之上
– 每个Table都是一个多维的稀疏图
• GFS、MapReduce和BigTable三大技术被称为
Google的三驾马车,虽然没有公布源码,但发布了
这三个产品的详细设计论
• Yahoo资助的Hadoop,是按照这三篇论文的开源
Java实现的,但在性能上Hadoop比Google要差很多
– GFS - - -> HDFS
– MapReduce - - -> MapReduce
– BigTable - - -> Hbase
Hadoop组件
组件
- HDFS: Hadoop分布式文件系统(核心组件) 存储
- MapReduce: 分布式计算框架(核心组件)
- Yarn: 集群资源管理系统(核心组件)
- Zookeeper: 分布式协作服务
- Hbase: 分布式列存数据库
- Hive: 基于Hadoop的数据仓库
- Sqoop: 数据同步工具
- Pig: 基于hadoop的数据流系统
- Mahout: 数据挖掘算法库
- Flume: 日志收集工具
HDFS
结构
Hadoop体系中数据存储管理的基础,是一个高度容错的系统,用于在低成本的通用硬件上运行
- 角色
client
namenode
secondarynode
datanode
• NameNode
– Master节点,管理HDFS的名称空间和数据块映射信
息(fsimage),配置副本策略,处理所有客户端请求
• Secondary NameNode
– 定期合并fsimage 和fsedits,推送给NameNode
– 紧急情况下,可辅助恢复NameNode
fsedits 变更日志(打补丁)
• 但Secondary NameNode并非NameNode的热备
• DataNode
– 数据存储节点,存储实际的数据
– 汇报存储信息给NameNode
• Client
– 切分文件
– 访问HDFS
– 与NameNode交互,获取文件位置信息
– 与DataNode交互,读取和写入数据
block 每块缺省128MB大小,每块可以多个副本
MapReduce
结构
• 源自于Google的MapReduce论文,JAVA实现的分布式计算框架
• 角色和概念
– JobTracker
Master节点只有一个,管理所有作业/任务的监控、错误处理等
将任务分解成一系列任务,并分派给TaskTracker
– TaskTracker
Slave节点,一般是多台,运行Map Task和Reduce Task
并与JobTracker交互,汇报任务状态
– Map Task
解析每条数据记录,传递给用户编写的
map()并执行,将输出结果写入本地磁盘
– 如果为map-only作业,直接写入HDFS
– Reducer Task
从Map Task的执行结果中,远程读
取输入数据,对数据进行排序,将数据按照分组传递
给用户编写的reduce函数执行
Yarn
结构
Yarn是Hadoop的一个通用的资源管理系统
角色
– Resourcemanager
– 处理客户端请求
– 启动/监控ApplicationMaster
– 监控NodeManager
– 资源分配与调度
– Nodemanager
– 单个节点上的资源管理
– 处理来自ResourceManager的命令
– 处理来自ApplicationMaster的命令
– ApplicationMaster
– 数据切分
– 为应用程序申请资源,并分配给内部任务
– 任务监控与容错
– Container
– 对任务运行行环境的抽象,封装了CPU 、内存等
– 多维资源以及环境变量、启动命令等任务运行相关的信息资源分配与调度
– Client
– 用户与Yarn交互的客户端程序
– 提交应用程序、监控应用程序状态,杀死应用程序等
• Yarn的核心思想
• 将JobTracker和TaskTacker进行分离,它由下面几大构成组件
– ResourceManager一个全局的资源管理器
– NodeManager每个节点(RM)代理
– ApplicationMaster表示每个应用
– 每一个ApplicationMaster有多个Container在NodeManager上运行
• Hadoop的部署模式有三种
– 单机
– 伪分布式
– 完全分布式
- 单机模式
新虚拟机 192.168.5.61 node1
安装 java-1.8.0-openjdk-devel
[root@node1 ~]# jps #测试是否成功
1446 Jps
[root@node1 ~]# tar -xf hadoop-2.7.7.tar.gz
[root@node1 ~]# mv hadoop-2.7.7/ /usr/local/hadoop #保证所有者和所属组为root
[root@node1 ~]# cd /usr/local/hadoop
[root@node1 hadoop]# rpm -ql java-1.8.0-openjdk
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre/ 截取前面相同的路径
[root@node1 hadoop]# ./bin/hadoop verion
Error: JAVA_HOME is not set and could not be found. #找不到java你装哪了,需定义变量指定
[root@node1 hadoop]# vim etc/hadoop/hadoop-env.sh
# The java implementation to use.
export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre"
export HADOOP_CONF_DIR="/usr/local/hadoop/etc/hadoop"
[root@node1 hadoop]# ./bin/hadoop version
[root@node1 ~]# cd /usr/local/hadoop/
[root@node1 hadoop]# mkdir input
[root@node1 hadoop]# ls
bin include lib LICENSE.txt README.txt share
etc input libexec NOTICE.txt output sbin
[root@node1 hadoop]# cp *.txt input/
[root@node1 hadoop]# ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount input output
[root@node1 hadoop]# ls output/
part-r-00000 _SUCCESS
HDFS分布式文件系统
需修改的配置文件
– Hadoop-env.sh
JAVA_HOME
HADOOP_CONF_DIR
– xml文件配置格式
<property>
<name>关键字</name>
<value>变量值</value>
<description> 描述 </description>
</property>
环境准备
192.168.5.60 nn01
192.168.5.61 node1 前面已配置
192.168.5.62 node2
192.168.5.63 node3
修改 /etc/hosts
# ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.5.60 nn01
192.168.5.61 node1
192.168.5.62 node2
192.168.5.63 node3
全部装 java-1.8.0-openjdk-devel
selinux关闭,禁用firewalld
所有机器能被nn01无密码ssh
ssh-keygen 生成密钥,
ssh-copy-id nn01/node1/node2/node3
[root@nn01 ~]# vim /etc/ssh/ssh_config
Host *
StrictHostKeyChecking no 设置第一次ssh时不需要输入yes