指无法在一定时间范围内用常规软件工具进行捕捉、管理 和处理的巨量数据集合
需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产数据
数据体量巨大。数据量大是大数据的显著特点,按目前的发展趋势看,大数据的体量已经达到 PB 甚至 EB级。
大数据的数据类型多样,以非结构化数据为主。如:网络日志、音频、视频、 图片、地理位置信息、交易数据、社交数据等。
价值密度低。有价值的数据仅占到数据总量相当小的一部分。比如一段监控视频中真正有价值的画面可能只有几秒钟。
产生和要求处理速度快。这是大数据区分于传统数据挖掘最显著的特征。
名称 | 类型 | 说明 |
---|---|---|
Hadoop | 开源 | Apache 基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下, 开发分布式程序,为本门课程重点讲解的系统 |
Spark | 开源 | 类似 Hadoop MapReduce 的并行框架 |
Stom | 开源 | 实时的、分布式以及具备高容错的计算系统 |
MongoDB | 开源 | 面向文档的 NoSql 数据库 |
IBM PureData | 商用 | 基于 Hadoop, 属于 IBM 专家集成系统 PureSystem家族中的组成部分, 主要面向大数据应用 |
Oracle Exadata | 商用 | Oracle 的新一代数据库云服务器 |
SAP Hana | 商用 | 提供高性能的数据查询功能, 用户可以直接对大量实时业务数据进行查询和分析 |
Teradata AsterData | 商用 | 非结构化数据解决方案 |
EMC GreenPlum | 商用 | 采用了大规模并行处理, 支持 50PB 级海量存储与管理 |
HP Vertica | 商用 | 列式大数据分析数据库 |
Hadoop 源自于 Google 在 2003 到 2004 年公布的关于 GFS ( Google File System)、MapReduce 和 BigTable 三篇论文, 创始人是 Doug Cutting。Hadoop 现在是 Apache 基金会顶级项目,“Hadoop”是一个虚构的名字, 由 Doug Cutting 的孩子为其黄色玩具大象所命名。
Hadoop是Apache基金会旗下的分布式系统基础架构
用户可以在不了解分布式底层细节的情况下,开发分布式程序
充分利用集群的威力进行高速运算和存储
高可靠性
高扩展性
高效性
高容错性
低成本
可构建在廉价机器上
单机模式:无须配置, Hadoop 被视为一个非分布式模式运行的独立 Java进程
伪分布式模式:只有一个节点的集群,这个节点既是 Master(主节点、主服务器) 也是 Slave(从节点、从服务器),可在此单节点上以不同的 Java 进程模拟分布式中的各类节点
完全分布式模式:对于 Hadoop,不同的系统会有不同的节点划分方式。在 HDFS 看来分为 NameNode( 管理者) 和 DataNode( 工作者), 其中 NameNode只有一个,DataNode 可有多个;在 MapReduce 看来节点又分为 JobTracker (作业调度者)和 TaskTracker(任务执行者),其中 JobTracker 只有一个, TaskTracker 可以有多个。NameNode 和 JobTracker 可以部署在不同的机器上, 也可以部署在同一机器上。部署 NameNode 和 JobTracker 的机器是Master,其余的机器都是 Slave
Hadoop框架的核心构成
分布式文件系统(HDFS)
分布式计算系统(MapReduce)
分布式资源管理系统(YARN)
Hadoop 生态圈
HDFS:分布式文件系统,是整个 Hadoop 体系的基石。
MapReduce/YARN: 并行编程模型。YARN 是下一代的 MapReduce 框架。从 Hadoop 0.23.01 版 本 后 , MapReduce 被 重 构 。 通 常 YARN 也 称 为MapReduceV2,老版本 MapReduce 称为 MapReduce V1。
Hive: 建立在 Hadoop 上的数据仓库。提供类似 SQL 语言的查询方式查询Hadoop 中的数据。
Pig:一个对大型数据集进行分析、评估的平台。主要作用类似于数据库里的 存储过程。
HBase: 全称 Hadoop Database。Hadoop 分布式、面向列的数据库来源于Google 关于 BigTable 的论文,主要用于需要随机访问、实时读写的大数据。在后面章节还会详细介绍。
ZooKeeper:是一个为分布式应用所设计的协调服务。主要为用户提供同步、 配置管理、分组和命名等服务,减轻分布式应用程序所承担的协调任务。
Sqoop:主要用于 Hadoop 与传统数据库(MySQL 等)间的数据传递。
Flume:日志采集系统。
Spark: 前面提过, 是一个相对独立于 Hadoop 的大数据处理系统, 可单独进行分布式处理。在这里列出来是因为它可以和 HDFS 很好的结合。
Oozie:可以将多个 MapReduce 作业组合到一个逻辑工作单元中,进行工作计划的安排,类似于工作流管理引擎。
Ambari:支持 Hadoop 集群管理、监控的 Web 工具。
是一个主/从体系结构的、以分布式进行存储的分布式文件系统
主要负责群集数据的存储与读取
优点
存储超大文件
标准流式访问
可构建在廉价机器上
缺点
不适合低延迟数据访问
不适合小文件存取
不适合并发写入,文件随机修改
HDFS群集组成 一个NameNode节点 多个DateNode节点
HDFS集群数据读写流程
数据读流程:
1.由客户端向NameNode请求访问某个文件,NameNode返回该文件所在DataNode,然后客户端向DataNode读取数据
数据写流程:
1.客户端向NameNode发出文件写请求,NameNode告诉客户该向哪个DataNode写入文件
2.客户将文件写入该DataNode节点
3.DataNode将自动复制数据到其它DataNode节点上,默认3份拷贝
元数据节点(NameNode) 负责管理文件系统的命名空间 将所有文件和文件夹的元数据保存至一个文件系统树中
元数据存放目录 NameNode节点的hadoop/dfs/name/current目录中 由hdfs-site.xml中的dfs.namenode.name.dir属性指定
目录中包括具体文件类型 fsimage_*、edits_*VERSION、...
数据节点(DateNode) 文件系统中真正存储数据的地方 一个文件被拆分成多个数据块后,分别存储至对应的数据节点上
数据存储目录 DateNode节点的hadoop/dfs/data目录中 由hdfs-site.xml中的dfs.datanode.data.dir属性指定
目录中包括具体文件类型 blk_
从元数据节点(Secondary NameNode) 1.用于周期性备份NameNode节点上的元数据 2.可以用来恢复NameNode节点,但不能作为备用节点 3.为了防止宕机,通常是将Secondary NameNode和NameNode设置为不同的主机 4.使用hdfs-site.xml中配置的dfs.namenode.secondary.http-address属性值可以通过浏览器查看Secondary NameNode运行状态
Hadoop 的 MapReduce 框架源自于 Google 的 MapReduce 论文。在 Google 发表论文时,MapReduce 最大成就是重写了Google 的索引文件系统。现在,MapReduce被广泛地应用于日志分析、海量数据排序、在海量数据中查找特定模式等场景中。
MapReduce是一个实现了并行计算编程模型,用以进行大数据量的计算
MapReduce包括 map(映射):map负责把任务分解成多个任务 reduce(归约):负责把分解后多任务的处理结果进行汇总
MapReduce框架设计包括
执行MapReduce 作业的机器也有两个角色:JobTracker 和 TaskTracker。
JobTracker:是一个 Master 服务,用于作业( Job)的管理和调度工作。一个 Hadoop 集群中只有一台 JobTracker。一般情况下,应该把它部署在单独的机器上。JobTracker 负责创建、调度作业中的每一个子任务( MapTask 或 ReduceTask) 运行于 TaskTracker 上, 并监控它们。如果发现有失败的任务就重新运行它。
TaskTracker : 是 运 行 于 多 个 节 点 上 的 Slave 服 务 , 用 于 执 行 任 务 。TaskTracker 需要运行在 HDFS 的 DataNode 上。
input:由 JobTracker 创建该 Job,并根据 Job 的输入计算输入分片(Input Split)。这里要求待处理的数据集必须可以分解成许多小的数据集, 且每一个小的数据集都可以完全并行地进行处理。输入目录中文件的数量决定了分片的数量,如果对于单个文件超过 HDFS 默认块大小(64MB),将按块大小进行分割。
split:作业调度器获取 Job 的输入分片信息,对输入分片中的记录按照一定规则解析成键值对,“键”(key)是每一行的起始位置,以字节为单位,“值”(value) 是本行文本内容。最后每个分片创建一个 MapTask 并分配到某个 TaskTracker。
map:TaskTracker 开始执行 MapTask,处理输入的每一个键值对。如何处理取决于在该阶段的程序代码,处理完成后产生新的键值对,保存在本地。
shuffle:混洗。将 MapTask 的输出有效地作为 ReduceTask 的输入过程。从图中可以看出该过程会在各 TaskTracker Node 之间进行数据交换, 按照 key 进行分组。
reduce:读取 Shufflling 阶段的输出, 开始执行 ReduceTask, 处理输入的每一个键值对。同样, 如何处理取决于该阶段的程序代码。最后输出最终结果。
编写 MapReduce 程序。包括 Mapper 处理、Reducer 处理以及为执行这些处理而定义的作业,首先将所有这些程序打包后运行作业。
获取作业 ID。
复制作业资源。
提交作业资源。
初始化作业。
获取输入分片。
心跳通信。TaskTracker 运行一个简单的循环来定期发送“心跳”给JobTracker,表明 TaskTracker 是否还存活,同时也充当两者之间的消息通道。
获取作业资源。
分配任务。
运行任务 MapTask 或 ReduceTask,最后输出 MapReduce 任务处理结果。
基础环境
修改主机名
hostnamectl set-hostname node1 hostnamectl set-hostname node2 hostnamectl set-hostname node3
所有节点添加hosts解析
cat >> /etc/hosts << EOF 172.16.10.10 node1 172.16.10.11 node2 172.16.10.12 node3 EOF
关闭防火墙
systemctl stop firewalld systemctl disable firewalld
关闭内核安全机制
sed -i "s/.*SELINUX=.\*/SELINUX=disabled/g" /etc/selinux/config
时间同步
yum -y install chrony systemctl start chronyd chronyc sources -v
所有node节点都需要执行
# 创建Hadoop组 groupadd hadoop # 创建hduser用户 useradd -g hadoop hduser # 为hduser用户设置密码 passwd hduser 更改用户 hduser 的密码 。 新的 密码: 无效的密码: 密码少于 8 个字符 重新输入新的密码: passwd:所有的身份验证令牌已经成功更新。 # 为hduser用户添加sudo权限 vim /etc/sudoers 在 root ALL=(ALL) ALL 下面添加如下内容: hduser ALL=(ALL) NOPASSWD:ALL ## 保存是需要使用 :wq!
所有node节点都需要执行
# 上传安装包并安装 rpm -ivh jdk-8u171-linux-x64.rpm # 配置环境变量 echo 'export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64' >> /etc/profile echo 'export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH' >> /etc/profile echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile # 刷新环境变量 source /etc/profile # 查看Java版本 java -version
仅在node1节点执行
ssh-keygen ssh-copy-id node1 ssh-copy-id node2 ssh-copy-id node3
所有node节点都需要执行
# 安装Hadoop tar zxf hadoop-2.6.5.tar.gz -C /home/hduser/ # 修改目录名 mv /home/hduser/hadoop-2.6.5/ /home/hduser/hadoop # 配置环境变量 cat >> /etc/profile << 'EOF' export HADOOP_HOME=/home/hduser/hadoop export PATH=$HADOOP_HOME/bin:$PATH EOF # 刷新环境变量 source /etc/profile
# 编辑/home/hduser/hadoop/etc/hadoop/hadoop-env.sh 文件 vim /home/hduser/hadoop/etc/hadoop/hadoop-env.sh # 注释掉原本的export JAVA_HOME,然后再添加下面内容: export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64 # 编辑/home/hduser/hadoop/etc/hadoop/yarn-env.sh 文件 vim /home/hduser/hadoop/etc/hadoop/yarn-env.sh # 添加下面内容: export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64 # 编辑/home/hduser/hadoop/etc/hadoop/slaves 文件 vim /home/hduser/hadoop/etc/hadoop/slaves ##清空原内容,然后输入如下内容 node2 node3 # 编辑/home/hduser/hadoop/etc/hadoop/core-site.xml ##该文件是 Hadoop 全局配置 vim /home/hduser/hadoop/etc/hadoop/core-site.xml # 末行添加: # 编辑/home/hduser/hadoop/etc/hadoop/hdfs-site.xml ##该文件是 HDFS 的配置 vim /home/hduser/hadoop/etc/hadoop/hdfs-site.xml # 末行添加: fs.defaultFS hdfs://node1:9000 hadoop.tmp.dir file:/home/hduser/hadoop/tmp # 编辑/home/hduser/hadoop/etc/hadoop/mapred-site.xml ##该文件是 MapReduce的配置,可从模板文件 mapred-site.xml.template 复制 cp /home/hduser/hadoop/etc/hadoop/mapred-site.xml.template /home/hduser/hadoop/etc/hadoop/mapred-site.xml vim /home/hduser/hadoop/etc/hadoop/mapred-site.xml # 末行添加: dfs.namenode.secondary.http-address node1:50090 dfs.namenode.name.dir file:/home/hduser/hadoop/dfs/name dfs.datanode.data.dir file:/home/hduser/hadoop/dfs/data dfs.replication 2 dfs.webhdfs.enabled true # 编辑/home/hduser/hadoop/etc/hadoop/yarn-site.xml ##如果在 mapred-site.xml配置了使用YARN框架,那么YARN框架使用此文件中的配置 vim /home/hduser/hadoop/etc/hadoop/yarn-site.xml # 末行添加: mapreduce.framework.name yarn mapreduce.jobhistory.address node1:10020 mapreduce.jobhistory.webapp.address node1:19888 ## 将修改完的配置文件推送分别到node2、node3节点 scp -r /home/hduser/hadoop/* node2:/home/hduser/ scp -r /home/hduser/hadoop/* node3:/home/hduser/ yarn.nodemanager.aux-services mapreduce_shuffle yarn.nodemanager.aux-services.mapreduce.shuffle.class org.apache.hadoop.mapred.ShuffleHandler yarn.resourcemanager.address node1:8032 yarn.resourcemanager.scheduler.address node1:8030 yarn.resourcemanager.resource-tracker.address node1:8035 yarn.resourcemanager.admin.address node1:8033 yarn.resourcemanager.webapp.address node1:8088
# 切换到Hadoop安装目录下 cd /home/hduser/hadoop/ # 格式化,必须要做的!! bin/hdfs namenode -format # 启动hdfs sbin/start-dfs.sh # 启动yarn sbin/start-yarn.sh # 也可以使用start-all.sh全部启动 sbin/start-all.sh # 全部停止 sbin/stop-all.sh # 查看集群状态 bin/hdfs dfsadmin -report # 查看Java进程 jps # 查看50070端口 netstat -nlpt | grep 50070
# 在/home/hduser/file 目录下创建 file1.txt、file2.txt mkdir /home/hduser/file echo "Hello World hi HADOOP" > /home/hduser/file/file1.txt echo "Hello hadoop hi CHINA" > /home/hduser/file/file2.tx
# 创建 HDFS 目录/input2 bin/hadoop fs -mkdir /input2 bin/hadoop fs -ls / # 将 file1.txt、file2.txt 上传到 HDFS 中 bin/hadoop fs -put /home/hduser/file/file* /input2 # 查看 bin/hadoop fs -ls /input2 bin/hadoop fs -cat /input2/*
# 执行 WordCount 程序 bin/hadoop jar /home/hduser/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar wordcount /input2/ /output2/wordcount1 # 查看执行结果 bin/hadoop fs -ls / bin/hadoop fs -ls /output2 bin/hadoop fs -cat /output2/wordcount1/*