导图社区 Hadoop超详细总结
Hadoop超详细总结与梳理,Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序,充分利用集群的威力进行高速运算和存储。
编辑于2021-08-13 20:20:51Hadoop
大数据概述
大数据概念
大数据概述
大数据(big data):指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 主要解决,海量数据的存储和海量数据的分析计算问题。 按顺序给出数据存储单位:bit、Byte、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB。 1Byte = 8bit 1K = 1024Byte 1MB = 1024K 1G = 1024M 1T = 1024G 1P = 1024T
大数据的特点
Volume(大量)
截至目前,人类生产的所有印刷材料的数据量是200PB,而历史上全人类总共说过的话的数据量大约是5EB。当前,典型个人计算机硬盘的容量为TB量级,而一些大企业的数据量已经接近EB量级。
Variety(多样)
这种类型的多样性也让数据被分为结构化数据和非结构化数据。相对于以往便于存储的以数据库/文本为主的结构化数据,非结构化数据越来越多,包括网络日志、音频、视频、图片、地理位置信息等,这些多类型的数据对数据的处理能力提出了更高要求。
Value(低价值密度)
价值密度的高低与数据总量的大小成反比。比如,在一天监控视频中,我们只关心宋宋老师晚上在床上健身那一分钟,如何快速对有价值数据“提纯”成为目前大数据背景下待解决的难题。
企业数据部业务流程分析
1,产品人员提需求(统计总用户数、日活跃用户数、回流用户数等)
2,数据部门搭建数据平台、分析数据指标
3,数据可视化(报表展示、邮件发送、大屏幕展示等)
企业数据部组织架构
Hadoop简介
Hadoop思想
思想思考案例:1TB的数据如何实现秒级别的计算?
分布式并行计算,数据向计算移动
Hadoop思想之源Google
面对海量的数据和计算难题
大量的网页怎么存储
搜索算法的计算
开源技术
GFS对应HDFS
分布式存储
提供了高可靠性,高扩展性和高吞吐率的数据存储服务
Map—Reduce
分布式计算框架(计算向数据移动)
具有易于编程,高容错性和高扩展性等优点
BigTable对应Hbase
设计思想
分布式存储和计算
分而治之:并行计算
计算向数据移动
Hadoop生态
Hadoop是什么
1)Hadoop是一个由Apache基金会所开发的分布式系统基础架构
2)主要解决,海量数据的存储和海量数据的分析计算问题。
3)广义上来说,HADOOP通常是指一个更广泛的概念——HADOOP生态圈
Hadoop发展历史
1)Lucene--Doug Cutting开创的开源软件,用java书写代码,实现与Google类似的全文搜索功能,它提供了全文检索引擎的架构,包括完整的查询引擎和索引引擎
2)2001年年底成为apache基金会的一个子项目
3)对于大数量的场景,Lucene面对与Google同样的困难
4)学习和模仿Google解决这些问题的办法 :微型版Nutch
5)可以说Google是hadoop的思想之源(Google在大数据方面的三篇论文)
GFS --->HDFS
Map-Reduce --->MR
BigTable --->Hbase
6)2003-2004年,Google公开了部分GFS和Mapreduce思想的细节,以此为基础Doug Cutting等人用了2年业余时间实现了DFS和Mapreduce机制,使Nutch性能飙升
7)2005 年Hadoop 作为 Lucene的子项目 Nutch的一部分正式引入Apache基金会。2006 年 3 月份,Map-Reduce和Nutch Distributed File System (NDFS) 分别被纳入称为 Hadoop 的项目中
8)名字来源于Doug Cutting儿子的玩具大象
9)Hadoop就此诞生并迅速发展,标志这云计算时代来临
Hadoop三大发行版本
Apache、Cloudera、Hortonworks
1)Apache版本最原始(最基础)的版本,对于入门学习最好。
官网地址:http://hadoop.apache.org/releases.html 下载地址:https://archive.apache.org/dist/hadoop/common/
2)Cloudera在大型互联网企业中用的较多。
官网地址:https://www.cloudera.com/downloads/cdh/5-10-0.html 下载地址:http://archive-primary.cloudera.com/cdh5/cdh/5/ (1)2008年成立的Cloudera是最早将Hadoop商用的公司,为合作伙伴提供Hadoop的商用解决方案,主要是包括支持、咨询服务、培训。 (2)2009年Hadoop的创始人Doug Cutting也加盟Cloudera公司。Cloudera产品主要为CDH,Cloudera Manager,Cloudera Support (3)CDH是Cloudera的Hadoop发行版,完全开源,比Apache Hadoop在兼容性,安全性,稳定性上有所增强。 (4)Cloudera Manager是集群的软件分发及管理监控平台,可以在几个小时内部署好一个Hadoop集群,并对集群的节点及服务进行实时监控。Cloudera Support即是对Hadoop的技术支持。 (5)Cloudera的标价为每年每个节点4000美元。Cloudera开发并贡献了可实时处理大数据的Impala项目。
3)Hortonworks文档较好。
官网地址:https://hortonworks.com/products/data-center/hdp/ 下载地址:https://hortonworks.com/downloads/#data-platform (1)2011年成立的Hortonworks是雅虎与硅谷风投公司Benchmark Capital合资组建。 (2)公司成立之初就吸纳了大约25名至30名专门研究Hadoop的雅虎工程师,上述工程师均在2005年开始协助雅虎开发Hadoop,贡献了Hadoop80%的代码。 (3)雅虎工程副总裁、雅虎Hadoop开发团队负责人Eric Baldeschwieler出任Hortonworks的首席执行官。 (4)Hortonworks的主打产品是Hortonworks Data Platform(HDP),也同样是100%开源的产品,HDP除常见的项目外还包括了Ambari,一款开源的安装和管理系统。 (5)HCatalog,一个元数据管理系统,HCatalog现已集成到Facebook开源的Hive中。Hortonworks的Stinger开创性的极大的优化了Hive项目。Hortonworks为入门提供了一个非常好的,易于使用的沙盒。 (6)Hortonworks开发了很多增强特性并提交至核心主干,这使得Apache Hadoop能够在包括Window Server和Windows Azure在内的microsoft Windows平台上本地运行。定价以集群为基础,每10个节点每年为12500美元。
Hadoop组成
概述
1)Hadoop HDFS:一个高可靠、高吞吐量的分布式文件系统。
2)Hadoop MapReduce:一个分布式的离线并行计算框架。
3)Hadoop YARN:作业调度与集群资源管理的框架。
4)Hadoop Common:支持其他模块的工具模块。
Hadoop组成.pptx
2.5.1 HDFS架构概述
HDFS架构概述.pptx
2.5.2 YARN架构概述
1)ResourceManager(rm):
处理客户端请求、启动/监控ApplicationMaster、监控NodeManager、资源分配与调度;
2)NodeManager(nm):
单个节点上的资源管理、处理来自ResourceManager的命令、处理来自ApplicationMaster的命令;
3)ApplicationMaster:
数据切分、为应用程序申请资源,并分配给内部任务、任务监控与容错。
4)Container:
对任务运行环境的抽象,封装了CPU、内存等多维资源以及环境变量、启动命令等任务运行相关的信息。
YARN架构.pptx
2.5.3 MapReduce架构概述
MapReduce将计算过程分为两个阶段:Map和Reduce
1)Map阶段并行处理输入数据
2)Reduce阶段对Map结果进行汇总
mapreudce架构概述.jpg
上图简单的阐明了map和reduce的两个过程或者作用,虽然不够严谨,但是足以提供一个大概的认知,map过程是一个蔬菜到制成食物前的准备工作,reduce将准备好的材料合并进而制作出食物的过程。
大数据技术生态体系
上图中涉及的技术名词解释如下: 1)Sqoop:sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle 等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。 2)Flume:Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。 3)Kafka:Kafka是一种高吞吐量的分布式发布订阅消息系统,有如下特性: (1)通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。 (2)高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒数百万的消息 (3)支持通过Kafka服务器和消费机集群来分区消息。 (4)支持Hadoop并行数据加载。 4)Storm:Storm为分布式实时计算提供了一组通用原语,可被用于“流处理”之中,实时处理消息并更新数据库。这是管理队列及工作者集群的另一种方式。 Storm也可被用于“连续计算”(continuous computation),对数据流做连续查询,在计算时就将结果以流的形式输出给用户。 5)Spark:Spark是当前最流行的开源大数据内存计算框架。可以基于Hadoop上存储的大数据进行计算。 6)Oozie:Oozie是一个管理Hdoop作业(job)的工作流程调度管理系统。Oozie协调作业就是通过时间(频率)和有效数据触发当前的Oozie工作流程。 7)Hbase:HBase是一个分布式的、面向列的开源数据库。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。 8)Hive:hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。 10)R语言:R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。 11)Mahout: Apache Mahout是个可扩展的机器学习和数据挖掘库,当前Mahout支持主要的4个用例: 推荐挖掘:搜集用户动作并以此给用户推荐可能喜欢的事物。 聚集:收集文件并进行相关文件分组。 分类:从现有的分类文档中学习,寻找文档中的相似特征,并为无标签的文档进行正确的归类。 频繁项集挖掘:将一组项分组,并识别哪些个别项会经常一起出现。 12)ZooKeeper:Zookeeper是Google的Chubby一个开源的实现。它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、 分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
大数据技术生态体系.pptx
推荐系统框架图
推荐系统框架图.pptx
Hadoop运行环境搭建
3.1 虚拟机网络模式设置为NAT
大数据技术之虚拟机网络模式设置为NAT.doc
3.2 克隆虚拟机
大数据技术之克隆虚拟机.doc
3.3 修改为静态ip
大数据技术之修改为静态ip.doc
3.4 修改主机名
大数据技术之修改主机名.doc
3.5 关闭防火墙
1)查看防火墙开机启动状态
chkconfig iptables --list
2)关闭防火墙
chkconfig iptables off
3.6 在opt目录下创建文件
大数据技术之在opt目录下创建文件.doc
3.7 安装jdk
1)卸载现有jdk
(1)查询是否安装java软件: [root@hadoop101 opt]# rpm -qa|grep java (2)如果安装的版本低于1.7,卸载该jdk: [root@hadoop101 opt]# rpm -e 软件包
2)用SecureCRT工具将jdk、Hadoop-2.7.2.tar.gz导入到opt目录下面的software文件夹下面
导入jdk.png
导入hadoop.png
3)在linux系统下的opt目录中查看软件包是否导入成功。
[root@hadoop101opt]# cd software/ [root@hadoop101software]# ls hadoop-2.7.2.tar.gz jdk-8u144-linux-x64.tar.gz
4)解压jdk到/opt/module目录下
[root@hadoop101software]# tar -zxvf jdk-8u144-linux-x64.tar.gz -C /opt/module/
5)配置jdk环境变量
(1)先获取jdk路径:
[root@hadoop101 jdk1.8.0_144]# pwd /opt/module/jdk1.8.0_144
(2)打开/etc/profile文件:
[root@hadoop101 jdk1.8.0_144]# vi /etc/profile 在profie文件末尾添加jdk路径: ##JAVA_HOME export JAVA_HOME=/opt/module/jdk1.8.0_144 export PATH=$PATH:$JAVA_HOME/bin
(3)保存后退出:
:wq
(4)让修改后的文件生效:
[root@hadoop101 jdk1.7.0_79]# source /etc/profile
(5)重启(如果java –version可以用就不用重启):
[root@hadoop101 jdk1.8.0_144]# sync [root@hadoop101 jdk1.8.0_144]# reboot
(6)测试jdk安装成功
6)测试jdk安装成功
[root@hadoop101 jdk1.8.0_144]# java -version java version "1.8.0_144"
3.8 安装Hadoop
1)进入到Hadoop安装包路径下:
[root@hadoop101 ~]# cd /opt/software/
2)解压安装文件到/opt/module下面
[root@hadoop101 software]# tar -zxf hadoop-2.7.2.tar.gz -C /opt/module/
3)查看是否解压成功
[root@hadoop101 software]# ls /opt/module/ hadoop-2.7.2
4)在/opt/module/hadoop-2.7.2/etc/hadoop路径下配置hadoop-env.sh
(1)Linux系统中获取jdk的安装路径:
[root@hadoop101 jdk1.8.0_144]# echo $JAVA_HOME /opt/module/jdk1.8.0_144
(2)修改hadoop-env.sh文件中JAVA_HOME 路径:
[root@hadoop101 hadoop]# vi hadoop-env.sh 修改JAVA_HOME如下 export JAVA_HOME=/opt/module/jdk1.8.0_144
5)将hadoop添加到环境变量
(1)获取hadoop安装路径:
[root@ hadoop101 hadoop-2.7.2]# pwd /opt/module/hadoop-2.7.2
(2)打开/etc/profile文件:
root@ hadoop101 hadoop-2.7.2]# vi /etc/profile 在profie文件末尾添加jdk路径:(shitf+g) ##HADOOP_HOME export HADOOP_HOME=/opt/module/hadoop-2.7.2 export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin
(3)保存后退出:
:wq
(4)让修改后的文件生效:
root@ hadoop101 hadoop-2.7.2]# source /etc/profile
(5)重启(如果hadoop命令不能用再重启):
[root@ hadoop101 hadoop-2.7.2]# sync [root@ hadoop101 hadoop-2.7.2]# reboot
6)修改/opt目录下的所有文件所有者为hadoop
[root@hadoop101 opt]# chown atguigu:atguigu -R /opt/
7)切换到hadoop用户
[root@hadoop101 opt]# su atguigu
Hadoop运行模式
概述
1)官方网址
(1)官方网站:
http://hadoop.apache.org/
(2)各个版本归档库地址
https://archive.apache.org/dist/hadoop/common/hadoop-2.7.2/
(3)hadoop2.7.2版本详情介绍
http://hadoop.apache.org/docs/r2.7.2/
2)Hadoop运行模式
(1)本地模式(默认模式):
不需要启用单独进程,直接可以运行,测试和开发时使用。
(2)伪分布式模式:
等同于完全分布式,只有一个节点。
(3)完全分布式模式:
多个节点一起运行。
4.1 本地文件运行Hadoop 案例
4.1.1 官方grep案例
1)创建在hadoop-2.7.2文件下面创建一个input文件夹
[atguigu@hadoop101 hadoop-2.7.2]$mkdir input
2)将hadoop的xml配置文件复制到input
[atguigu@hadoop101 hadoop-2.7.2]$cp etc/hadoop/*.xml input
3)执行share目录下的mapreduce程序
[atguigu@hadoop101 hadoop-2.7.2]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'dfs[a-z.]+'
4)查看输出结果
[atguigu@hadoop101 hadoop-2.7.2]$ cat output/*
4.1.2 官方wordcount案例
1)创建在hadoop-2.7.2文件下面创建一个wcinput文件夹
[atguigu@hadoop101 hadoop-2.7.2]$mkdir wcinput
2)在wcinput文件下创建一个wc.input文件
[atguigu@hadoop101 hadoop-2.7.2]$cd wcinput [atguigu@hadoop101 wcinput]$touch wc.input
3)编辑wc.input文件
[atguigu@hadoop101 wcinput]$vim wc.input 在文件中输入如下内容 hadoop yarn hadoop mapreduce atguigu atguigu 保存退出::wq
4)回到hadoop目录/opt/module/hadoop-2.7.2
5)执行程序:
[atguigu@hadoop101 hadoop-2.7.2]$hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount wcinput wcoutput
6)查看结果:
[atguigu@hadoop101 hadoop-2.7.2]$cat wcoutput/part-r-00000 atguigu 2 hadoop 2 mapreduce 1 yarn 1
4.2 伪分布式运行Hadoop 案例
4.2.1 启动HDFS并运行MapReduce 程序
1)分析:
(1)准备1台客户机
(2)安装jdk
(3)配置环境变量
(4)安装hadoop
(5)配置环境变量
(6)配置集群
(7)启动、测试集群增、删、查
(8)执行wordcount案例
2)执行步骤
(1)配置集群
(a)配置:hadoop-env.sh
Linux系统中获取jdk的安装路径:
[root@ hadoop101 ~]# echo $JAVA_HOME /opt/module/jdk1.8.0_144
修改JAVA_HOME 路径:
export JAVA_HOME=/opt/module/jdk1.8.0_144
(b)配置:core-site.xml
fs.defaultFS hdfs://hadoop101:9000> hadoop.tmp.dir /opt/module/hadoop-2.7.2/data/tmp
(c)配置:hdfs-site.xml
dfs.replication 1
(2)启动集群
(a)格式化namenode(第一次启动时格式化,以后就不要总格式化)
[atguigu@hadoop101 hadoop-2.7.2]$ bin/hdfs namenode -format
(b)启动namenode
[atguigu@hadoop101 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
(c)启动datanode
[atguigu@hadoop101 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
(3)查看集群
(a)查看是否启动成功
[atguigu@hadoop101 hadoop-2.7.2]$ jps 13586 NameNode 13668 DataNode 13786 Jps
(b)查看产生的log日志
当前目录:/opt/module/hadoop-2.7.2/logs [atguigu@hadoop101 logs]$ ls hadoop-atguigu-datanode-hadoop.atguigu.com.log hadoop-atguigu-datanode-hadoop.atguigu.com.out hadoop-atguigu-namenode-hadoop.atguigu.com.log hadoop-atguigu-namenode-hadoop.atguigu.com.out SecurityAuth-root.audit [atguigu@hadoop101 logs]# cat hadoop-atguigu-datanode-hadoop101.log
(c)web端查看HDFS文件系统
http://192.168.1.101:50070/dfshealth.html#tab-overview 注意:如果不能查看,看如下帖子处理 http://www.cnblogs.com/zlslch/p/6604189.html
(4)操作集群
(a)在hdfs文件系统上创建一个input文件夹
[atguigu@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -mkdir -p /user/atguigu/input
(b)将测试文件内容上传到文件系统上
[atguigu@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -put wcinput/wc.input /user/atguigu/input/
(c)查看上传的文件是否正确
[atguigu@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -ls /user/atguigu/input/ [atguigu@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -cat /user/atguigu/ input/wc.input
(d)运行mapreduce程序
[atguigu@hadoop101 hadoop-2.7.2]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/atguigu/input/ /user/atguigu/output
(e)查看输出结果
命令行查看:
[atguigu@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -cat /user/atguigu/output/*
浏览器查看
浏览器查看.png
(f)将测试文件内容下载到本地
[atguigu@hadoop101 hadoop-2.7.2]$ hadoop fs -get /user/atguigu/ output/part-r-00000 ./wcoutput/
(g)删除输出结果
[atguigu@hadoop101 hadoop-2.7.2]$ hdfs dfs -rmr /user/atguigu/output
4.2.2 YARN上运行MapReduce 程序
1)分析:
(1)准备1台客户机
(2)安装jdk
(3)配置环境变量
(4)安装hadoop
(5)配置环境变量
(6)配置集群yarn上运行
(7)启动、测试集群增、删、查
(8)在yarn上执行wordcount案例
2)执行步骤
(1)配置集群
(a)配置yarn-env.sh
配置一下JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144
(b)配置yarn-site.xml
yarn.nodemanager.aux-services mapreduce_shuffle yarn.resourcemanager.hostname hadoop101
(c)配置:mapred-env.sh
配置一下JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144
(d)配置: (对mapred-site.xml.template重新命名为) mapred-site.xml
[atguigu@hadoop101 hadoop]$ mv mapred-site.xml.template mapred-site.xml [atguigu@hadoop101 hadoop]$ vi mapred-site.xml mapreduce.framework.name yarn
(2)启动集群
(a)启动前必须保证namenode和datanode已经启动
(b)启动resourcemanager
[atguigu@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh start resourcemanager
(c)启动nodemanager
[atguigu@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager
(3)集群操作
(a)yarn的浏览器页面查看
http://192.168.1.101:8088/cluster
(b)删除文件系统上的output文件
[atguigu@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -rm -R /user/atguigu/output
(c)执行mapreduce程序
[atguigu@hadoop101 hadoop-2.7.2]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/atguigu/input /user/atguigu/output
(d)查看运行结果
[atguigu@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -cat /user/atguigu/output/*
4.2.3 修改本地临时文件存储目录
1)停止进程
[atguigu@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh stop nodemanager [atguigu@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh stop resourcemanager [atguigu@hadoop101 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode [atguigu@hadoop101 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop namenode
2)修改hadoop.tmp.dir
[core-site.xml]
hadoop.tmp.dir /opt/module/hadoop-2.7.2/data/tmp
3)将/opt/module/hadoop-2.7.2路径中的logs文件夹删除掉
[atguigu@hadoop101 hadoop-2.7.2]$ rm -rf logs/
4)进入到tmp目录将tmp目录中hadoop-atguigu目录删除掉
[atguigu@hadoop101 tmp]$ rm -rf hadoop-atguigu/
5)格式化NameNode
[atguigu@hadoop101 hadoop-2.7.2]$ hadoop namenode -format
6)启动所有进程
[atguigu@hadoop101 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode [atguigu@hadoop101 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode [atguigu@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh start resourcemanager [atguigu@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager
5)查看/opt/module/hadoop-2.7.2/data/tmp这个目录下的内容。
4.2.4 历史服务配置启动查看
1)配置mapred-site.xml
[atguigu@hadoop101 hadoop]$ vi mapred-site.xml mapreduce.jobhistory.address hadoop101:10020 mapreduce.jobhistory.webapp.address hadoop101:19888
2)查看启动历史服务器文件目录:
[atguigu@hadoop101 hadoop-2.7.2]$ ls sbin/ | grep mr mr-jobhistory-daemon.sh
3)启动历史服务器
[atguigu@hadoop101 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh start historyserver
4)查看历史服务器是否启动
[atguigu@hadoop101 hadoop-2.7.2]$ jps
5)查看jobhistory
http://192.168.1.101:19888/jobhistory
4.2.5 日志的聚集
日志聚集概念:应用运行完成以后,将日志信息上传到HDFS系统上。
开启日志聚集功能步骤:
(1)配置yarn-site.xml
[atguigu@hadoop101 hadoop]$ vi yarn-site.xml yarn.log-aggregation-enable true yarn.log-aggregation.retain-seconds 604800
(2)关闭nodemanager 、resourcemanager和historymanager
[atguigu@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh stop resourcemanager [atguigu@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh stop nodemanager [atguigu@hadoop101 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh stop historyserver
(3)启动nodemanager 、resourcemanager和historymanager
[atguigu@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh start resourcemanager [atguigu@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager [atguigu@hadoop101 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh start historyserver
(4)删除hdfs上已经存在的hdfs文件
[atguigu@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -rm -R /user/atguigu/output
(5)执行wordcount程序
[atguigu@hadoop101 hadoop-2.7.2]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/atguigu/input /user/atguigu/output
(6)查看日志
http://192.168.1.101:19888/jobhistory
history1.png
history2.png
history3.png
4.2.6 Hadoop配置文件说明
Hadoop配置文件分两类:默认配置文件和自定义配置文件,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值。
(1)默认配置文件:存放在hadoop相应的jar包中
[core-default.xml] hadoop-common-2.7.2.jar/ core-default.xml [hdfs-default.xml] hadoop-hdfs-2.7.2.jar/ hdfs-default.xml [yarn-default.xml] hadoop-yarn-common-2.7.2.jar/ yarn-default.xml [core-default.xml] hadoop-mapreduce-client-core-2.7.2.jar/ core-default.xml
(2)自定义配置文件:存放在$HADOOP_HOME/etc/hadoop
core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml
4.3 完全分布式部署Hadoop
分析:
1)准备3台客户机(关闭防火墙、静态ip、主机名称)
2)安装jdk
3)配置环境变量
4)安装hadoop
5)配置环境变量
6)安装ssh
7)配置集群
8)启动测试集群
4.3.1 虚拟机准备
详见3.2-3.3章。
4.3.2 主机名设置
详见3.4章。
4.3.3 scp
1)scp可以实现服务器与服务器之间的数据拷贝。
2)案例实操
(1)将hadoop101中/opt/module目录拷贝到hadoop102、hadoop103和hadoop104上。
[root@hadoop101 /]# scp -r /opt/module/ root@hadoop102:/opt [root@hadoop101 /]# scp -r /opt/module/ root@hadoop103:/opt [root@hadoop101 /]# scp -r /opt/module/ root@hadoop104:/opt
(2)将hadoop101服务器上的/etc/profile文件拷贝到hadoop102、hadoop103和hadoop104上。
[root@hadoop102 opt]# scp root@hadoop101:/etc/profile /etc/profile [root@hadoop103 opt]# scp root@hadoop101:/etc/profile /etc/profile [root@hadoop104 opt]# scp root@hadoop101:/etc/profile /etc/profile
(3)在hadoop103上操作将hadoop101中/opt/software/目录拷贝到hadoop102的/opt目录上。
[root@hadoop103 opt]# scp -r root@hadoop101:/opt/software root@hadoop102:/opt/
4.3.4 SSH无密码登录
1)配置ssh
(1)基本语法
ssh 另一台电脑的ip地址
(2)ssh连接时出现Host key verification failed的解决方法
问题再现
[atguigu@hadoop102 opt] $ ssh 192.168.1.103 The authenticity of host '192.168.1.103 (192.168.1.103)' can't be established. RSA key fingerprint is cf:1e:de:d7:d0:4c:2d:98:60:b4:fd:ae:b1:2d:ad:06. Are you sure you want to continue connecting (yes/no)? Host key verification failed.
解决办法
直接输入yes后,再输入密码
2)无密钥配置
(1)进入到我的家目录
[atguigu@hadoop102 opt]$ cd ~/.ssh
(2)生成公钥和私钥:
[atguigu@hadoop102 .ssh]$ ssh-keygen -t rsa 然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
(3)将公钥拷贝到要免密登录的目标机器上
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop103 [atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop104
免密登录原理.pptx
3).ssh文件夹下的文件功能解释
(1)~/.ssh/known_hosts :记录ssh访问过计算机的公钥(public key)
(2)id_rsa :生成的私钥
(3)id_rsa.pub :生成的公钥
(4)authorized_keys :存放授权过得无秘登录服务器公钥
4.3.5 rsync
rsync远程同步工具,主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
(1)查看rsync使用说明
man rsync | more
(2)基本语法
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir 命令 命令参数 要拷贝的文件路径/名称 目的用户@主机:目的路径
选项
-r 递归
-v 显示复制过程
-l 拷贝符号连接
(3)案例实操
把本机/opt/tmp目录同步到hadoop103服务器的root用户下的/opt/tmp目录
[root@hadoop102 opt]# rsync -rvl /opt/tmp root@hadoop103:/opt/
4.3.6 编写集群分发脚本xsync
1)需求分析:循环复制文件到所有节点的相同目录下。
(1)原始拷贝:
rsync -rvl /opt/module root@hadoop103:/opt/
(2)期望脚本:
xsync 要同步的文件名称
(3)在/usr/local/bin这个目录下存放的脚本,可以在系统任何地方直接执行。
2)案例实操:
(1)在/usr/local/bin目录下创建xsync文件
[root@hadoop102 bin]# touch xsync [root@hadoop102 bin]# vi xsync #!/bin/bash #1 获取输入参数个数,如果没有参数,直接退出 pcount=$# if((pcount==0)); then echo no args; exit; fi #2 获取文件名称 p1=$1 fname=`basename $p1` echo fname=$fname #3 获取上级目录到绝对路径 pdir=`cd -P $(dirname $p1); pwd` echo pdir=$pdir #4 获取当前用户名称 user=`whoami` #5 循环 for((host=103; host #echo $pdir/$fname $user@hadoop$host:$pdir echo --------------- hadoop$host ---------------- rsync -rvl $pdir/$fname $user@hadoop$host:$pdir done
(2)修改脚本 xsync 具有执行权限
[root@hadoop102 bin]# chmod 777 xsync [root@hadoop102 bin]# chown atguigu:atguigu xsync
(3)调用脚本形式:xsync 文件名称
[atguigu@hadoop102 opt]$ xsync tmp/
4.3.7 编写分发脚本xcall(选学)
1)需求分析:在所有主机上同时执行相同的命令
xcall +命令
2)具体实现
(1)在/usr/local/bin目录下创建xcall文件
[root@hadoop102 bin]# touch xcall [root@hadoop102 bin]# vi xcall #!/bin/bash pcount=$# if((pcount==0));then echo no args; exit; fi echo -------------localhost---------- $@ for((host=101; host echo ----------hadoop$host--------- ssh hadoop$host $@ done
(2)修改脚本 xcall 具有执行权限
[root@hadoop102 bin]# chmod 777 xcall [root@hadoop102 bin]# chown atguigu:atguigu xcall
(3)调用脚本形式: xcall 操作命令
[root@hadoop102 ~]# xcall rm -rf /opt/tmp/
4.3.8 配置集群
1)集群部署规划
hadoop102 hadoop103 hadoop104 HDFS NameNode SecondaryNameNode DataNode DataNode DataNode YARN NodeManager NodeManager NodeManager ResourceManager
2)配置文件
(1)core-site.xml
[atguigu@hadoop102 hadoop]$ vi core-site.xml fs.defaultFS hdfs://hadoop102:9000 hadoop.tmp.dir /opt/module/hadoop-2.7.2/data/tmp
(2)Hdfs
hadoop-env.sh
[atguigu@hadoop102 hadoop]$ vi hadoop-env.sh export JAVA_HOME=/opt/module/jdk1.8.0_144
hdfs-site.xml
dfs.replication 3 dfs.namenode.secondary.http-address hadoop104:50090
slaves
hadoop102 hadoop103 hadoop104
(3)yarn
yarn-env.sh
[atguigu@hadoop102 hadoop]$ vi yarn-env.sh export JAVA_HOME=/opt/module/jdk1.8.0_144
yarn-site.xml
[atguigu@hadoop102 hadoop]$ vi yarn-site.xml yarn.nodemanager.aux-services mapreduce_shuffle yarn.resourcemanager.hostname hadoop103
(4)mapreduce
mapred-env.sh
[atguigu@hadoop102 hadoop]$ vi mapred-env.sh export JAVA_HOME=/opt/module/jdk1.8.0_144
mapred-site.xml
[atguigu@hadoop102 hadoop]$ vi mapred-site.xml mapreduce.framework.name yarn
3)在集群上分发以上所有文件
[atguigu@hadoop102 hadoop]$ pwd /opt/module/hadoop-2.7.2/etc/hadoop [atguigu@hadoop102 hadoop]$ xsync /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml [atguigu@hadoop102 hadoop]$ xsync /opt/module/hadoop-2.7.2/etc/hadoop/yarn-site.xml [atguigu@hadoop102 hadoop]$ xsync /opt/module/hadoop-2.7.2/etc/hadoop/slaves
4)查看文件分发情况
[atguigu@hadoop102 hadoop]$ xcall cat /opt/module/hadoop-2.7.2/etc/hadoop/slaves
4.3.9 集群启动及测试
1)启动集群
(0)如果集群是第一次启动,需要格式化namenode
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -format
(1)启动HDFS:
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh [atguigu@hadoop102 hadoop-2.7.2]$ jps 4166 NameNode 4482 Jps 4263 DataNode [atguigu@hadoop103 hadoop-2.7.2]$ jps 3218 DataNode 3288 Jps [atguigu@hadoop104 hadoop-2.7.2]$ jps 3221 DataNode 3283 SecondaryNameNode 3364 Jps
(2)启动yarn
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-yarn.sh
注意:Namenode和ResourceManger如果不是同一台机器,不能在NameNode上启动 yarn,应该在ResouceManager所在的机器上启动yarn。
2)集群基本测试
(1)上传文件到集群
上传小文件
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -mkdir -p /user/atguigu/input [atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -put wcinput/wc.input /user/atguigu/input
上传大文件
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -put /opt/software/hadoop-2.7.2.tar.gz /user/atguigu/input
(2)上传文件后查看文件存放在什么位置
文件存储路径
[atguigu@hadoop102 subdir0]$ pwd /opt/module/hadoop-2.7.2/data/tmp/dfs/data/current/BP-938951106-192.168.10.107-1495462844069/current/finalized/subdir0/subdir0
查看文件内容
[atguigu@hadoop102 subdir0]$ cat blk_1073741825 hadoop yarn hadoop mapreduce atguigu atguigu
(3)拼接
-rw-rw-r--. 1 atguigu atguigu 134217728 5月 23 16:01 blk_1073741836 -rw-rw-r--. 1 atguigu atguigu 1048583 5月 23 16:01 blk_1073741836_1012.meta -rw-rw-r--. 1 atguigu atguigu 63439959 5月 23 16:01 blk_1073741837 -rw-rw-r--. 1 atguigu atguigu 495635 5月 23 16:01 blk_1073741837_1013.meta [atguigu@hadoop102 subdir0]$ cat blk_1073741836>>tmp.file [atguigu@hadoop102 subdir0]$ cat blk_1073741837>>tmp.file [atguigu@hadoop102 subdir0]$ tar -zxvf tmp.file
(4)下载
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -get /user/atguigu/input/hadoop-2.7.2.tar.gz
3)集群性能测试
写海量数据
读海量数据
4.3.10 Hadoop启动停止方式
1)各个服务组件逐一启动
(1)分别启动hdfs组件
hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode
(2)启动yarn
yarn-daemon.sh start|stop resourcemanager|nodemanager
2)各个模块分开启动(配置ssh是前提)常用
(1)整体启动/停止hdfs
start-dfs.sh
stop-dfs.sh
(2)整体启动/停止yarn
start-yarn.sh
stop-yarn.sh
3)全部启动(不建议使用)
start-all.sh
stop-all.sh
4.3.11 集群时间同步
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。
配置时间同步实操:
1)时间服务器配置(必须root用户)
(1)检查ntp是否安装
[root@hadoop102 桌面]# rpm -qa|grep ntp ntp-4.2.6p5-10.el6.centos.x86_64 fontpackages-filesystem-1.41-1.1.el6.noarch ntpdate-4.2.6p5-10.el6.centos.x86_64
(2)修改ntp配置文件
[root@hadoop102 桌面]# vi /etc/ntp.conf 修改内容如下 a)修改1(设置本地网络上的主机不受限制。) #restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap为 restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap b)修改2(设置为不采用公共的服务器) server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst为 #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst c)添加3(添加默认的一个内部时钟数据,使用它为局域网用户提供服务。) server 127.127.1.0 fudge 127.127.1.0 stratum 10
(3)修改/etc/sysconfig/ntpd 文件
[root@hadoop102 桌面]# vim /etc/sysconfig/ntpd 增加内容如下(让硬件时间与系统时间一起同步) SYNC_HWCLOCK=yes
(4)重新启动ntpd
[root@hadoop102 桌面]# service ntpd status ntpd 已停 [root@hadoop102 桌面]# service ntpd start 正在启动 ntpd:
(5)执行:
[root@hadoop102 桌面]# chkconfig ntpd on
2)其他机器配置(必须root用户)
(1)在其他机器配置10分钟与时间服务器同步一次
[root@hadoop103 hadoop-2.7.2]# crontab -e 编写脚本 */10 * * * * /usr/sbin/ntpdate hadoop102
(2)修改任意机器时间
[root@hadoop103 hadoop]# date -s "2017-9-11 11:11:11"
(3)十分钟后查看机器是否与时间服务器同步
[root@hadoop103 hadoop]# date
4.3.12 配置集群常见问题
1)防火墙没关闭、或者没有启动yarn
INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
2)主机名称配置错误
/etc/hosts
3)ip地址配置错误
4)ssh没有配置好
root
为了使用xsync脚本
atguigu
为了集群启动
5)root用户和atguigu两个用户启动集群不统一
6)配置文件修改不细心
7)未编译源码
Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 17/05/22 15:38:58 INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
8)datanode不被namenode识别问题
Namenode在format初始化的时候会形成两个标识,blockPoolId和clusterId。新的datanode加入时,会获取这两个标识作为自己工作目录中的标识。 一旦namenode重新format后,namenode的身份标识已变,而datanode如果依然持有原来的id,就不会被namenode识别。 解决办法,删除datanode节点中的数据后,再次重新格式化namenode。
9)不识别主机名称
java.net.UnknownHostException: hadoop102: hadoop102 at java.net.InetAddress.getLocalHost(InetAddress.java:1475) at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:146) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415)
解决办法:
(1)在/etc/hosts文件中添加192.168.1.102 hadoop102
(2)主机名称不要起hadoop hadoop000等特殊名称
10)datanode和namenode进程同时只能工作一个。
datanode和namenode进程同时只能有一个工作问题分析.pptx
11)执行命令不生效,粘贴word中命令时,遇到-和长–没区分开。导致命令失效
解决办法:尽量不要粘贴word中代码。
12)jps发现进程已经没有,但是重新启动集群,提示进程已经开启。原因是在linux的根目录下/tmp目录中存在启动的进程临时文件,将集群相关进程删除掉,再重新启动集群。
13)jps不生效。
原因:全局变量hadoop java没有生效,需要source /etc/profile文件。
14)8088端口连接不上
[atguigu@hadoop102 桌面]$ cat /etc/hosts 注释掉如下代码 #127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 #::1 hadoop102
Hadoop编译源码
大数据技术之Hadoop编译源码.doc
HDFS
HDFS概述
简介
简介:根据Google的GFS的开源实现,Hadoop分布式文件系统
特点
优点
高容错性
数据自动保存为多个副本
副本丢失后自动恢复
block元数据信息 + 心跳
多副本,提供容错机制,副本丢失或宕机自动恢复,默认存3份
适合批处理
移动计算而非数据
数据位置暴露给计算框架(Block偏移量)
适合大数据处理
GB,TB甚至PB级别的数据
HDFS的block机制适合大数据
HDFS默认会将文件分割成Block,Block默认64M
将Block按键值对存储在HDFS上,并将键值对的映射存储到内存中
小文件太多,NameNode内存压力大
百万规模以上的文件数量
10K+节点
可构建在廉价机器上
通过多副本提高可靠性
提供了容错和恢复机制
缺点
低延迟数据访问
比如毫秒级
低延迟与搞吞吐率
小文件存取
占用NameNode大量内存
寻道时间超过读取时间
并发写入,文件随机修改
一个文件只能有一个写者,只支持append
如何使用Append实现数据的CRUD?追加+标记+删除更改
版本
HDFS1.0
HDFS1.0:SecondaryNameNode
HDFS2.0
HDFS2.0:主备设计(active/standby)
HDFS存储模型:Block
文件线性切割成块(Block):偏移量offset(byte)
Block分散存储在集群节点中
单一文件Block大小一致,文件与文件可以不一致
block可以设置副本数,副本分散在不同的节点中,副本数不要超过节点数
文件上传可以设置Block大小和副本数
已经上传的文件Block大小和副本数可以调整,大小不变
只支持一次写入多次读取,同一时刻只有一个写入者
可以Append追加数据
HDFS架构
Hadoop1.0 HDFS架构
Master/Slave架构
HDFS-1.0架构图
架构组件
NameNode
Master节点
管理数据块映射:处理客户端的读写请求
配置副本策略:管理HDFS的名称空间
NN有一个虚拟的文件系统,类Linux的根目录
SecondaryNameNode:HDFS未做高可用
SecondaryNameNode的冷备份
合并fsimage和fsedits并发回给NameNode
fsimage
元数据镜像文件(文件系统的目录树)
fsedits
元数据的操作日志(针对文件系统做的修改操作记录)
SecondaryNameNode的合并流程解析
合并图解
SecondaryNameNode的合并流程
合并流程详解
1:NameNode将元数据镜像文件fsimage和fsedits落成磁盘文件,新的操作日志会写入到edits文件中,当达到checkpoint触发的条件的时候,SecondaryNameNode开始工作
2:当触发一个checkpoint操作时,NameNode会生成一个新的edits即上图中的edits.new文件,同时SecondaryNameNode会将edits文件和fsimage复制到本地
3:SecondaryNameNode将本地的fsimage文件加载到内存中,然后再与edits文件进行合并生成一个新的fsimage文件即上图中的fsimage.ckpt文件
4:SecondaryNameNode将新生成的Fsimage.ckpt文件复制到NameNode节点
5:再NameNode节点的edits.new文件和Fsimage.ckpt文件会替换掉原来的edits文件和Fsimage文件,至此,刚好是一个轮回,即在NameNode中又是edits和fsimage文件了
6:等待下一次checkpoint触发SecondaryNameNode进行工作,一直这样循环操作
总结:创建新的edits文件-->复制fsimage和fsedits文件到SNN-->将这两个文件加载到内存中合并成一个fsimage文件-->将合并后的fsimage复制到NN替换掉原来的fsimage文件和edits文件-->达到触发条件SNN开始运行
checkpoint触发的条件
fs.checkpoint.period,指定连续两次检查点的最大时间间隔,默认是1小时
fs.checkpoint.size,默认是64m,edits日志文件大于这个值则强制触发合并
配置文件:core-site.xml
SecondaryNameNode是Hadoop1.x中HDFS HA的一个解决方案
DataNode
Slave节点
负责存储client发来的数据块Block,执行数据块的读写操作
存储Block块的元数据信息
MD5或者CRC的数据验证
注意
热备份和冷备份之间的区别
热备份能随时顶替挂掉的节点工作
冷备份在节点挂掉后,只是节点挂掉之前的部分数据源
Hadoop1.0版本的时候:NameNode内存中存储的是fsimage+edits
Fsimage
内存快照
Edits
日志文件
注意区别
Hadoop1.X之hdfs安装详解
hdfs安装详细步骤.docx
Hadoop2.0 HDFS架构
HDFS2.0概述
背景
Hadoop1.0中HDFS和MapReduce在高可用,扩展性等方面存在问题
HDFS存在问题
NameNode单点故障,难以应用于在线场景
NameNode压力过大,且内存受限,影响系统扩展
MapReduce存在的问题
JobTracker访问压力大,影响系统扩展性
难以支持除MapReduce之外的计算框架,比如Spark,Storm等
Hadoop1.X与Hadoop2.X
区别
解决HDFS1.0种单点故障和内存受限问题
解决单点故障
HDFS HA :通过主备NameNode解决
如果主NameNode发生故障,则切换到备NameNode
解决内存受限问题
HDFS Federation(联邦)
水平扩展,支持多个NameNode
每个NameNode分管一部分目录
所有NameNode共享所有DataNode存储资源
Hadoop2.X由HDFS,MapReduce和Yarn三个分支构成
HDFS:NN Federation(联邦), HA
2.X:只支持2个节点HA,3.0实现了一主多从
MapReduce:运行在YARN上的MR
离线计算,基于磁盘I/O计算
YARN:资源管理系统
2.X仅仅是架构上发生了变化,使用方式不变,对HDFS使用者透明
HDFS 1.X中的命令和API仍可以使用
Hadoop2.0-HA HDFS架构
架构设计图
架构解析
主备NameNode
解决单点问题
主NameNode对外提供服务,备NameNode同步主NameNode元数据,以待切换
所有DataNode同时向两个NameNode汇报数据块信息
两种切换选择
手动切换:通过命令实现主备之间的切换,可以用HDFS升级等场合
自由切换:基于Zookeeper实现
Zookeeper FailOver Controller :监控NameNode健康状态并向Zookeeper注册NameNode
NameNode挂掉后,ZKFC为NameNode竞争锁,获得ZKFC锁的NameNode变为active
JN
ZKFC
Hadoop2.X Federation
概述
通过多个NameNode/NameSpace把元数据的存储和管理分散到多个节点中,使到NameNode/NameSpace可以通过增加机器来进行水平扩展
能把单个NameNode的负载分散到多个节点中,在HDFS数据规模较大的时候不会也降低HDFS的性能。可以通过多个NameSpace来隔离不同类型的应用,把不同类型应用的HDFS元数据的存储和管理分派到不同的NameNode中
架构设计
HDFS架构设计
HDFS Federation HA 详解
Hadoop2.X版本的HDFS HA的搭建
HDFS HA高可用.docx
HDFS工作原理
HDFS写操作原理以及流程
HDFS的写操作图解
底层采用的是TCP的通信传输协议
写的过程中会返回传输的成功与否的信息
断点续传
写的过程中断如何处理?继续写+心跳+重新尝试连接+获取新的节点+拷贝数据
HDFS写操作流程详解
HDFS写流程
Client:切分文件Block
Client:按Block线性和NN获取ND列表(副本数)
Client:验证DN列表后以更小的单位流式传输数据--各个节点,两两通信确定可用
Block传输结束后: 1DN向NN汇报Block信息,2DN向Client汇报完成,3Client向NN汇报完成
获取下一个Block存放的DN列表
。。。。。。。重复上面步骤
最终Client汇报完成
NN会在写流程更新文件状态
HDFS的读操作的原理以及流程
HDFS的读操作图解
按距离优先读取的实现
数据本地化
使用的是HDFS自己实现的IO流
能根据偏移量来读取
HDFS读操作流程详解
Client:和NN获取一份Block副本位置列表
线性和DN获取Block,最终合并为一个文件
在Block副本列表中按距离择优选取
HDFS文件权限:POSIX文件权限
与Linux文件权限类似
r :read;w:write;x:execute
权限x对于文件忽略,对于文件夹表示是否允许访问其内容
如果Linux系统用户zhangsan使用Hadoop命令创建一个文件,那么这个文件在HDFS中owner就是zhangsan
HDFS的权限目的:阻止好人做错事,不是阻止坏人做坏事。HDFS相信,你告诉我你是谁,我就认为你是谁
如果需要用户和密码的文件权限?整合kerberos
HDFS副本存放策略
配置了机架感知
Hadoop的副本放置策略在可靠性(副本在不同机架)和带宽(只需要跨越一个机架)中做了一个很好的平衡
第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,cpu不太忙的节点。第二个副本:放置在于第一个副本不同的机架的节点上。第三个副本:与第二个副本相同机架的节点。更多副本:随机节点
未配置机架感知
三个DataNode机器的选择完全是随机的
HDFS的机架感知技术
确认节点所在的机架?
原理
当DataNode注册时和heartbeat时,会把DataNode的ip作为参数传入,返回信息为此DataNode的机架信息。如果没有参数配置,DataNode统一为默认的机架/default-rack
默认关闭
Hadoop-site.xml配置:topology.script.file.name
配置选项的value指定为一个可执行脚本程序。
脚本的编写需要充分了解真实的网络拓扑和机架信息
通过该脚本能够将机器的ip地址正确的映射到相应的机架上去
HDFS的安全模式
NameNode启动的时候,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作。
一旦在内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件(这个操作不需要SecondaryNameNode)和一个空的编辑日志
此刻NameNode运行在安全模式,即NameNode的文件系统对于客服端来说是只读的。(显示目录,显示文件内容等。写,删除,重命名都会失败)
在此阶段NameNode收集各个DataNode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的,在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束
当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数,系统中数据块的位置并不是由NameNode维护的,而是以块列表形式存储在DataNode中。
HDFS API开发
HDFS客户端API操作.docx
YARN
YARN概述
YARN:Yet Another Resource Negotiator
Hadoop2.0新引入的资源管理系统,直接从MRv1演化而来的
核心思想
核心思想:将MRv1种JobTracker的资源管理和任务调度两个功能分开,分别由ResourceManager和ApplicationMaster进程实现
ResourceManager: 负责整个集群的资源管理和调度
ApplicationMaster:负责应用程序相关的事务,比如任务调度,任务监控和容错等
Yarn的引入,使得多个计算框架可以运行在一个集群中
每个应用程序对应一个ApplicationMaster
目前多个计算框架可以运行在YARN上,比如MapReduce,Spark,Storm等
YARN架构
架构图
架构解析
作用
YARN:解耦资源与计算
组件
Client
RM-Client:请求资源创建AM
AM-Client:与AM交互
NodeManager
与RM汇报资源,管理Container生命周期
ResourceManager
主,核心集群节点资源管理,接受用户提交的分布式计算程序,并为其划分资源 管理、监控各个Node Manager上的资源情况,以便于均衡负载
Container
计算框架中的角色都以Container表示
MR-Application-Container
作业单位,避免单点故障,负载到不同的节点,创建Task需要RM申请资源(Container)
Task-Container
具体的任务执行进程容器
MR ON YARN
与Hadoop1.0区别
将MapReduce作业直接运行在YARN上,而不是由JobTracker和TaskTracker构建的MRv1系统中
基本功能模块
YARN
负责资源调度和管理
MRAppMaster
负责任务切分,任务调度,任务监控和容错等
MapTask/ReduceTask
任务驱动引擎,与MRv1一致
MRAppMaster运行流程
每个MapReduce作业对应一个MRAppMaster
YARN将资源分配给MRAppMaster
MRAppMaster进一步将资源分配给内部的任务
MRAppMaster容错
直接失败,由YARN重新启动
任务失败,MRAppMaster重新申请资源
MR on YARN流程
流程图
Client上传的Jar包是在HDFS集群中
流程图
搭建YARN 整合MR
注意事项
node manager在物理上应该跟data node部署在一起
resource manager在物理上应该独立部署在一台专门的机器上
安装
修改配置文件:yarn-site.xml
vi yarn-site.xml yarn.resourcemanager.hostname hdp20-01 yarn.nodemanager.aux-services mapreduce_shuffle
scp这个yarn-site.xml到其他节点
启动yarn集群:start-yarn.sh (注:该命令应该在resourcemanager所在的机器上执行)
用jps检查yarn的进程,用web浏览器查看yarn的web控制台http://hdp20-01:8088
MapReduce
MR概述
定义
Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架。
Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上。
优缺点
优点
MapReduce 易于编程
它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的PC机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。就是因为这个特点使得MapReduce编程变得非常流行。
良好的扩展性
当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。
高容错性
MapReduce设计的初衷就是使程序能够部署在廉价的PC机器上,这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由 Hadoop内部完成的。
适合PB以上海量数据的离线处理
这里加红字体离线处理,说明它适合离线处理而不适合在线处理。比如像毫秒级别的返回一个结果,MapReduce很难做到。
缺点
实时计算
MapReduce无法像Mysql一样,在毫秒或者秒级内返回结果。
流式计算
流式计算的输入数据是动态的,而MapReduce的输入数据集是静态的,不能动态变化。这是因为MapReduce自身的设计特点决定了数据源必须是静态的。
DAG(有向图计算)
多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce并不是不能做,而是使用后,每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下。
进程
MrAppMaster:负责整个程序的过程调度及状态协调。
MapTask:负责map阶段的整个数据处理流程。
ReduceTask:负责reduce阶段的整个数据处理流程。
编程规范
用户编写的程序分成三个部分:Mapper,Reducer,Driver(提交运行mr程序的客户端)
1;Mapper阶段
(1)用户自定义的Mapper要继承自己的父类
(2)Mapper的输入数据是KV对的形式(KV的类型可自定义)
(3)Mapper中的业务逻辑写在map()方法中
(4)Mapper的输出数据是KV对的形式(KV的类型可自定义)
(5)map()方法(maptask进程)对每一个<K,V>调用一次
2;Reducer阶段
(1)用户自定义的Reducer要继承自己的父类
(2)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
(3)Reducer的业务逻辑写在reduce()方法中
(4)Reducetask进程对每一组相同k的<k,v>组调用一次reduce()方法
3;Driver阶段
整个程序需要一个Drvier来进行提交,提交的是一个描述了各种必要信息的job对象
MR搭建
MapReduce on yarn
HDFS整合Yarn
Yarn HA
注意:ResourceManager的HA的主备的SSH免密钥
yarn的HA仍然是借用Zookeeper来实现的,只是将ZKFC的实现封装在了ResourceManager当中
MR思想
MapReduce设计图
MapReduce Shuffle设计图
MR Yarn调度设计图
MR案例
求TopN
自定义类型
自定义Partitioner
全局排序
倒排索引创建
自定义GroupingComparator
控制输入输出格式
Jion算法
数据倾斜场景
MR运行方式
job提交方式
服务器执行
将工程整体打成一个jar包并上传到linux机器上,
用命令启动jar包中的Jobsubmitter,让它去提交jar包给yarn来运行其中的mapreduce程序 : hadoop jar wc.jar cn.edu360.mr.wordcount.JobSubmitter .....
去hdfs的输出目录中查看结果
本地执行
本地直接执行Main方法
yarn调度流程
MR运行原理
MR运行图解1
MR运行图解2
MR运行图解3
MR源码解析
MR框架原理文档
MapReduce框架原理.docx
源码解析注意点
MapReduce有自己的序列化和反序列化机制:writable
Reduce方法处理相同的一组key的值调用,reduce方法传入调用的是迭代器