第1章 Hadoop概述
1.1 Hadoop是什么
分布式:多台服务器共同完成某一项任务。
1.2 Hadoop发展历史
1.3 Hadoop三大发行版本
Hadoop三大发行版本:Apache、Cloudera、Hortonworks。
Apache版本最原始(最基础)的版本,对于入门学习最好。2006
Cloudera内部集成了很多大数据框架,对应产品CDH。2008
Hortonworks文档较好,对应产品HDP。2011
Hortonworks现在已经被Cloudera公司收购,推出新的品牌CDP。
1)Apache Hadoop
官网地址:http://hadoop.apache.org
下载地址:https://hadoop.apache.org/releases.html
2)Cloudera Hadoop
官网地址:https://www.cloudera.com/downloads/cdh
下载地址:https://docs.cloudera.com/documentation/enterprise/6/release-notes/topics/rg_cdh_6_download.html
(1)2008年成立的Cloudera是最早将Hadoop商用的公司,为合作伙伴提供Hadoop的商用解决方案,主要是包括支持、咨询服务、培训。
(2)2009年Hadoop的创始人Doug Cutting也加盟Cloudera公司。Cloudera产品主要为CDH,Cloudera
Manager,Cloudera Support
(3)CDH是Cloudera的Hadoop发行版,完全开源,比Apache Hadoop在兼容性,安全性,稳定性上有所增强。Cloudera的标价为每年每个节点10000美元。
(4)Cloudera Manager是集群的软件分发及管理监控平台,可以在几个小时内部署好一个Hadoop集群,并对集群的节点及服务进行实时监控。
3)Hortonworks Hadoop
官网地址: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)Hortonworks的主打产品是Hortonworks Data
Platform(HDP),也同样是100%开源的产品,HDP除常见的项目外还包括了Ambari,一款开源的安装和管理系统。
(4)2018年Hortonworks目前已经被Cloudera公司收购。
1.4 Hadoop优势(4高)
1)高可用性:绿色点表示相同的数据,在3台服务器集群上同时存储着,其中一个硬盘(蓝色点)的损坏,不影响整个集群。。
2)高扩展性:可动态扩展,即可以动态增加/删除服务器,如双11和618可以动态增加服务器(绿色框),不需要停止原有集群(黄色框)。
3)高效性:并行计算。
4)高容错性:若其中一台执行失败,Hadoop会自动将该任务迁移到某一个服务器上,不影响最终任务计算的结果。
1.5 Hadoop组成(面试重点)
一个好代码,应该具备【高内聚,低耦合】
Hadoop 1.x中,MapReduce即当爹又当妈,即负责计算 又负责资源调度。
Hadoop 2.x中,组成发生了变化,增加了Yarn专门负责资源调度(管理CPU和内存)。
高内聚,低耦合是软件工程中的一条基本原则,也是设计高质量软件系统的核心思想之一。
高内聚指的是一个模块或组件内部的各个元素逻辑上紧密相关的能力,即模块内部各个部分之间的耦合性应该尽量高,使其更加独立和自给自足。
低耦合指的是不同模块或组件之间关联程度尽量降低,避免它们之间直接依赖或相互影响的程度,使组件之间的联系变得松散,更易于维护和扩展。
.
高内聚、低耦合有利于提高软件的可维护性、可测试性、可运行性和可扩展性。高内聚保证了模块内的功能单一、结构清晰、模块之间的耦合性尽量减小,提高了模块的独立性,使得软件能够快速响应变化并容易维护。低耦合则可以让各个组件之间的关系变得灵活,便于添加、删除或替换某个组件,提高了软件的可扩展性和可拓展性。
.
在实际的软件开发过程中,合理运用高内聚、低耦合的原则,可以减少代码耦合、提高代码复用性、减少代码维护成本等诸多优点,为软件开发者提供更加丰富和高效的工具和方案。
【面试重点】Hadoop 1.x和Hadoop 2.x有什么区别?
【ChatGPT回答-v1版】
首先,Hadoop 1.x和Hadoop 2.x的最大区别是体系结构的改变。Hadoop 1.x采用了一个基于单点故障的中心式架构,而Hadoop 2.x引入了一个名为YARN的新的资源管理器,拥有一个更加分布式和灵活的架构。其次,Hadoop 1.x的MapReduce计算模型只能处理批量数据,而且对实时数据处理支持不够友好;Hadoop 2.x引入了一种新的计算模型Tez,可以更高效地处理数据,并增加了对实时数据处理的支持。
再次,Hadoop 2.x引入了一些新的高级API和框架,如Apache Spark、Apache Hive等等,这些新的API和框架相对于Hadoop 1.x更加灵活和易于使用,提高了整个Hadoop平台的可扩展性和可维护性。
总之,Hadoop 2.x相比Hadoop 1.x有很多的改进和变化,包括更灵活的架构、更好的性能、更高级的API和框架等等,使Hadoop更适合处理现代大数据应用程序。
【ChatGPT回答-v2版】
首先,Hadoop 1.x采用的是单点故障的结构,其中一台机器如果宕机,整个集群将无法正常运行。此外,Hadoop 1.x 中只有一个资源管理器 JobTracker,这使得整个集群的扩展性受到一定的限制。而Hadoop 2.x采用 YARN(Yet Another Resource Negotiator)架构,将 JobTracker中的资源管理和作业调度拆分成了不同的节点,提高了系统的灵活性和可扩展性,同时也增加了系统的可用性和健壮性。其次,Hadoop 1.x 的作业执行引擎是 MapReduce v1,这种执行模型并没有设计出色的支持流处理和实时计算。而Hadoop 2.x 中采用了 MapReduce v2,这个引擎可以支持实时计算、流处理和批处理,易于扩展和定制化。
再次,Hadoop 2.x 引入了新的 HDFS NameNode High Availability (HA) 特性,在 HDFS 中,NameNode 是一个重要的中心节点,维护了 HDFS 的元数据。在 Hadoop 1.x 中,NameNode是单点故障,这使得整个集群非常脆弱。Hadoop 2.x 中引入了 NameNode HA,利用 ZooKeeper实现了自动故障转移,从而大大提高了 HDFS 的可用性和容错性。
最后,Hadoop 2.x 支持更灵活的 API,并且可以更好地与其他生态系统工具进行集成,比如 Spark、Storm、Hive、Pig等。同时,Hadoop 2.x 还引入了新的批处理框架 Tez,可以将多个 MapReduce 任务并行执行,大大提高了集群的工作效率。
1.5.1 HDFS架构概述
Hadoop Distributed File System,简称HDFS,是一个Hadoop分布式文件系统。
1)NameNode(老板):负责数据存在什么位置,整个数据的存储情况。
2)DataNode:负责数据具体存在哪,存的什么信息。
3)2NN(秘书):备份,辅助NameNode工作,防止NameNode出bug导致整个集群的瘫痪。
1.5.2 YARN架构概述
Yet Another Resource Negotiator简称YARN ,另一种资源协调者,是Hadoop的资源管理器(主要管理CPU和内存)。
两大组件
1)ResourceManager(RM):所有资源的管理者
2)NodeManager(NM):单节点资源的管理者
客户端提交一个作业到集群(RM)时,在节点上,会在(NM)上产生一个AM,AM在Container中运行
3)ApplicationMaster(AM):单个任务
4)Container:容器,相当于一个小电脑
这种容器==虚拟化技术,好处是任务运行完,资源自动释放,回归给NM,用完就释放,比较灵活。
AM怎么运行一个任务(绿色):会跟RM申请资源,申请到了,RM会让AM在当前节点(第1台NM)上运行(MapTask),若资源不够,可跨节点运行(让它在第2台NM继续运行后续任务ReduceTask).
再来一个客户端的任务(灰色),可以并行运行。
一个NM上可以运行多少个Container?
假设单个Container需要1G内存资源,那么4G的NM上可以运行4个Container;
假设单个Container需要1个CPU资源,那么2个CPU的NM上可以运行2个Container;
假设单个Container需要6G内存资源,那么单个NM是不够用的,需要多个NM合作。
划重点!!!
- 整个集群所有资源的老大是RM
- 单个资源的老大是NM
MapReduce的基本思想是将处理大规模数据集的任务分为两个阶段。第一阶段是“Map”,它将大的输入数据集切分成小的数据块,并且为每个数据块生成键值对(Key-Value Pairs)。第二阶段是“Reduce”,它将所有Map阶段中产生的键值对汇总到一起,并将其合并为较小的集合[或者“ Reduce”]。这样,Reduce阶段就可以生成一些用于分析输入数据的汇总结果。
1.5.3 MapReduce架构概述
MapReduce将计算过程分为两个阶段:Map和Reduce
1)Map阶段并行处理输入数据(分)
2)Reduce阶段对Map结果进行汇总(和)
1.5.4 HDFS、YARN、MapReduce三者关系
看的有点乱,分开看
-
首先是HDFS(分布式文件系统),3个角色:NN(老板)、DN(存的什么数据)和2NN(秘书)
-
其次是YARN,资源调度,RM和NM。
来了一个客户Client,向集群提交了一个任务(作业);
RM找到一个节点,开启一个Container,创建任务App Mstr;
AM向RM申请资源,RM看AM的需求,分配了Hadoop102和Hadoop103给AM; -
最后是MapReduce
Map阶段:AM开启对应的资源Map Task1和Map Task2,特点是每个Map Task独立工作,检索自己节点;
Reduce阶段:将所有检索结果(检索成功/失败)汇总到HDFS
Q1:Reduce在104完成的,所以RM是分配2台还是3台资源给AM的?
Q2:汇总到HDFS?
1.6 大数据技术生态体系
数据来源有三:结构化数据(行列二维表)、半结构化数据(有分隔符,可导入数据库的数据)和非结构化数据(不能转化成表)
【数据传输层】
- Sqoop数据:处理结构化数据
- Flume日志:处理非结构化数据
- kaflka:可处理以上三种数据
【数据存储层】怎么存储的3种技术
- HDFS
- HBace
- Kaflka
【资源管理层】
- YARN
【数据计算】
-
离线
- MapRedce:上层有Hive
- Spark(用内存,更快):上层有Spark Mlib和Spark Sql
-
在线
- Spark(常用):上层的Spark Streaming
- Storm(基本不用了):上层有Flink(常用)
【任务调度层】
任务调度:决定任务什么时候执行
- Oozie(乌ze)
- Azkaban(阿兹卡本)
(不着急深究,先有个大概印象)图中涉及的技术名词解释如下:
1)Sqoop:Sqoop是一款开源的工具,主要用于在Hadoop、Hive与传统的数据库(MySQL)间进行数据的传递,可以将一个关系型数据库(例如 :MySQL,Oracle 等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
2)Flume:Flume是一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;
3)Kafka:Kafka是一种高吞吐量的分布式发布订阅消息系统;
4)Spark:Spark是当前最流行的开源大数据内存计算框架。可以基于Hadoop上存储的大数据进行计算。
5)Flink:Flink是当前最流行的开源大数据内存计算框架。用于实时计算的场景较多。
6)Oozie:Oozie是一个管理Hadoop作业(job)的工作流程调度管理系统。
7)Hbase:HBase是一个分布式的、面向列的开源数据库。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。
8)Hive:Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
9)ZooKeeper:它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。
1.7 推荐系统框架图
每个手机同个APP的首页是不同的,俗称“千人千面”
用户的访问记录会通过Nginx负载均衡,打入到日志收集的服务器,属于半结构化数据,Flume采集日志,到Kaflka缓冲,推荐系统讲究实时性,直接到实时计算SparkStreaming或Flink,计算出推荐哪个能促进用户点击/消费。
将结果返回JavaEE后台,结果形式有数据库或文件,反馈到用户界面。
第2章 Hadoop运行环境搭建
2.1 模板虚拟机环境准备
安装模板虚拟机,IP地址192.168.10.100、主机名称hadoop100、内存4G、硬盘50G
1)hadoop100虚拟机配置要求如下
(本文Linux系统全部以CentOS-7.5-x86-1804为例)
(2)安装epel-release
[root@hadoop100 ~]# yum install -y epel-release
(3)net-tool:工具包集合,包含ifconfig等命令
[root@hadoop100 ~]# yum install -y net-tools
vim:编辑器
[root@hadoop100 ~]# yum install -y vim
2)关闭防火墙,关闭防火墙开机自启
[root@hadoop100 ~]# systemctl stop firewalld
[root@hadoop100 ~]# systemctl disable firewalld.service
3)创建atguigu用户,并修改atguigu用户的密码
[root@hadoop100 ~]# useradd atguigu
[root@hadoop100 ~]# passwd atguigu
4)配置atguigu用户具有root权限,方便后期加sudo执行root权限的命令
[root@hadoop100 ~]# vim /etc/sudoers
修改/etc/sudoers文件,在%wheel这行下面添加一行,如下所示:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
atguigu ALL=(ALL) NOPASSWD:ALL
注意:atguigu这一行不要直接放到root行下面,因为所有用户都属于wheel组,你先配置了atguigu具有免密功能,但是程序执行到%wheel行时,该功能又被覆盖回需要密码。所以atguigu要放到%wheel这行下面。
5)在/opt目录下创建文件夹,并修改所属主和所属组
(1)在/opt目录下创建module、software文件夹
[root@hadoop100 ~]# mkdir /opt/module
[root@hadoop100 ~]# mkdir /opt/software
(2)修改module、software文件夹的所有者和所属组均为atguigu用户
[root@hadoop100 ~]# chown atguigu:atguigu /opt/module
[root@hadoop100 ~]# chown atguigu:atguigu /opt/software
(3)查看module、software文件夹的所有者和所属组
[root@hadoop100 ~]# cd /opt/
[root@hadoop100 opt]# ll总用量 12
drwxr-xr-x. 2 atguigu atguigu 4096 5月 28 17:18 module
drwxr-xr-x. 2 root root 4096 9月 7 2017 rh
drwxr-xr-x. 2 atguigu atguigu 4096 5月 28 17:18 software
6)卸载虚拟机自带的JDK
注意:如果你的虚拟机是最小化安装不需要执行这一步。
[root@hadoop100 ~]# rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
- rpm -qa:查询所安装的所有rpm软件包
- grep -i:忽略大小写
- xargs -n1:表示每次只传递一个参数 (是数字"一",不是"L"的小字母)
- rpm -e –nodeps:强制卸载软件
7)重启虚拟机
[root@hadoop100 ~]# reboot
2.2 克隆虚拟机
1)利用模板机hadoop100,克隆三台虚拟机:hadoop102、hadoop103、hadoop104
注意:克隆时,要先关闭hadoop100
2)修改克隆机IP,以下以hadoop102举例说明
(1)修改克隆虚拟机的静态IP
[root@hadoop100 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
改成
DEVICE=ens33
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
NAME="ens33"
IPADDR=192.168.10.102
PREFIX=24
GATEWAY=192.168.10.2
DNS1=192.168.10.2
(2)查看Linux虚拟机的虚拟网络编辑器,编辑->虚拟网络编辑器->VMnet8
(3)查看Windows系统适配器VMware Network Adapter VMnet8的IP地址
(4)保证Linux系统ifcfg-ens33文件中IP地址、虚拟网络编辑器地址和Windows系统VM8网络IP地址相同。
3)修改克隆机主机名,以下以hadoop102举例说明
(1)修改主机名称
[root@hadoop100 ~]# vim /etc/hostname
hadoop102
(2)配置Linux克隆机主机名称映射hosts文件,打开/etc/hosts
[root@hadoop100 ~]# vim /etc/hosts
添加如下内容
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
192.168.10.108 hadoop108
4)重启克隆机hadoop102
[root@hadoop100 ~]# reboot
5)修改windows的主机映射文件(hosts文件)
(1)如果操作系统是window7,可以直接修改
(a)进入C:\Windows\System32\drivers\etc路径
(b)打开hosts文件并添加如下内容,然后保存
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
192.168.10.108 hadoop108
(2)如果操作系统是window10,先拷贝出来,修改保存以后,再覆盖即可
(a)进入C:\Windows\System32\drivers\etc路径
(b)拷贝hosts文件到桌面
(c)打开桌面hosts文件并添加如下内容
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
192.168.10.108 hadoop108
(d)将桌面hosts文件覆盖C:\Windows\System32\drivers\etc路径hosts文件
2.3 在hadoop102安装JDK
1)卸载现有JDK
注意:安装JDK前,一定确保提前删除了虚拟机自带的JDK。(详见2.1(6))
2)传jdk文件
用XShell传输工具将JDK导入到opt目录下面的software文件夹下面
3)在Linux系统下的opt目录中查看软件包是否导入成功
[atguigu@hadoop102 ~]$ ls /opt/software/
看到如下结果:
jdk-8u212-linux-x64.tar.gz
4)解压JDK到/opt/module目录下
[atguigu@hadoop102 software]$ tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/
5)配置JDK环境变量
(1)新建/etc/profile.d/my_env.sh文件
[atguigu@hadoop102 ~]$ sudo vim /etc/profile.d/my_env.sh
添加如下内容
#JAVA_HOME export JAVA_HOME=/opt/module/jdk1.8.0_212 export PATH= P A T H : PATH: PATH:JAVA_HOME/bin
(2)保存后退出:wq
(3)source一下/etc/profile文件,让新的环境变量PATH生效
[atguigu@hadoop102 ~]$ source /etc/profile
6)测试JDK是否安装成功
[atguigu@hadoop102 ~]$ java -version
如果能看到以下结果,则代表Java安装成功。
java version "1.8.0_212"
注意:重启(如果java -version可以用就不用重启)
[atguigu@hadoop102 ~]$ sudo reboot
2.4 在hadoop102安装Hadoop
Hadoop下载地址:https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/
1)传hadoop文件
用XShell文件传输工具将hadoop-3.1.3.tar.gz导入到opt目录下面的software文件夹下面
2)进入到Hadoop安装包路径下
[atguigu@hadoop102 ~]$ cd /opt/software/
3)解压安装文件到/opt/module下面
[atguigu@hadoop102 software]$ tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/
4)查看是否解压成功
[atguigu@hadoop102 software]$ ls /opt/module/
hadoop-3.1.3
5)将Hadoop添加到环境变量
(1)获取Hadoop安装路径
[atguigu@hadoop102 hadoop-3.1.3]$ pwd
/opt/module/hadoop-3.1.3
(2)打开/etc/profile.d/my_env.sh文件
[atguigu@hadoop102 hadoop-3.1.3]$ sudo vim /etc/profile.d/my_env.sh
在my_env.sh文件末尾添加如下内容:(快捷键shift+g到文末)
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
保存并退出: :wq
(3)让修改后的文件生效
[atguigu@hadoop102 hadoop-3.1.3]$ source /etc/profile
6)测试是否安装成功
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop version
Hadoop 3.1.3
7)重启
(如果Hadoop命令不能用再重启虚拟机)
[atguigu@hadoop102 hadoop-3.1.3]$ sudo reboot
2.5 Hadoop目录结构
1)查看Hadoop目录结构
[atguigu@hadoop102 hadoop-3.1.3]$ ll
总用量 52
drwxr-xr-x. 2 atguigu atguigu 4096 5月 22 2017 bin
drwxr-xr-x. 3 atguigu atguigu 4096 5月 22 2017 etc
drwxr-xr-x. 2 atguigu atguigu 4096 5月 22 2017 include
drwxr-xr-x. 3 atguigu atguigu 4096 5月 22 2017 lib
drwxr-xr-x. 2 atguigu atguigu 4096 5月 22 2017 libexec
-rw-r--r--. 1 atguigu atguigu 15429 5月 22 2017 LICENSE.txt
-rw-r--r--. 1 atguigu atguigu 101 5月 22 2017 NOTICE.txt
-rw-r--r--. 1 atguigu atguigu 1366 5月 22 2017 README.txt
drwxr-xr-x. 2 atguigu atguigu 4096 5月 22 2017 sbin
drwxr-xr-x. 4 atguigu atguigu 4096 5月 22 2017 share
2)重要目录
(1)bin目录:存放对Hadoop相关服务(hdfs,yarn,mapred)进行操作的脚本
(2)etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件
(3)lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能) (4)sbin目录:存放启动或停止Hadoop相关服务的脚本
(5)share目录:存放Hadoop的依赖jar包、文档、和官方案例
第3章 Hadoop运行模式
1)Hadoop官方网站:http://hadoop.apache.org/
2)Hadoop运行模式包括:本地模式、伪分布式模式以及完全分布式模式。
- 本地模式:单机运行,只是用来演示一下官方案例。生产环境不用。
- 伪分布式模式:也是单机运行,但是具备Hadoop集群的所有功能,一台服务器模拟一个分布式的环境。个别缺钱的公司用来测试,生产环境不用。
- 完全分布式模式:多台服务器组成分布式环境。生产环境使用。
3.1 本地运行模式(官方WordCount)
任务:统计一个文本的每个单词的个数
1)创建在hadoop-3.1.3文件下面创建一个wcinput文件夹
[atguigu@hadoop102 hadoop-3.1.3]$ mkdir wcinput
2)在wcinput文件下创建一个word.txt文件
[atguigu@hadoop102 hadoop-3.1.3]$ cd wcinput
3)编辑word.txt文件
[atguigu@hadoop102 wcinput]$ vim word.txt
在文件中输入如下内容
hadoop yarn
hadoop mapreduce
atguigu
atguigu
保存退出::wq
4)回到Hadoop目录/opt/module/hadoop-3.1.3
5)执行程序
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput wcoutput
6)查看结果
[atguigu@hadoop102 hadoop-3.1.3]$ cat wcoutput/part-r-00000
看到如下结果:
atguigu 2
hadoop 2
mapreduce 1
yarn 1
注:结果在输出路径下的part-r-00000文件
其中5)的执行程序
- hadoop:执行Hadoop程序,也可以用/bin/hadoop
- jar:用java包
- jar包的路径:在share下,选择mapreduce的examples程序
- 选择一个功能案例:选择单词计数案例wordcount
- 输入路径:单词计数的文本路径
- 输出路径:在运行程序前,不能存在,否则会报错,它只能通过该程序自己生成。
3.2 完全分布式运行模式(开发重点)
分析:
1)准备3台客户机(关闭防火墙、静态IP、主机名称)
2)安装JDK
3)配置环境变量
4)安装Hadoop
5)配置环境变量
6)配置集群
7)单点启动
8)配置ssh
9)群起并测试集群
前5项已配置,重点在后面4项
3.2.1 虚拟机准备
详见2.1、2.2两节。
3.2.2 编写集群分发脚本xsync
先了解下两个命令scp和rsync
1)scp(secure copy)完全拷贝
(1)scp定义
scp可以实现服务器与服务器之间的数据拷贝。(from server1 to server2)(2)基本语法
scp -r $pdir/$fname $user@$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
(3)案例实操
前提:在hadoop102、hadoop103、hadoop104都已经创建好的/opt/module、 /opt/software两个目录,并且已经把这两个目录修改为atguigu:atguigu[atguigu@hadoop102 ~]$ sudo chown atguigu:atguigu -R /opt/module
(a)在hadoop102上,将hadoop102中/opt/module/jdk1.8.0_212目录拷贝到hadoop103上。
[atguigu@hadoop102 ~]$ scp -r /opt/module/jdk1.8.0_212 atguigu@hadoop103:/opt/module
(b)在hadoop103上,将hadoop102中/opt/module/hadoop-3.1.3目录拷贝到hadoop103上。
[atguigu@hadoop103 ~]$ scp -r atguigu@hadoop102:/opt/module/hadoop-3.1.3 /opt/module/
(c)在hadoop103上操作,将hadoop102中/opt/module目录下所有目录拷贝到hadoop104上。
[atguigu@hadoop103 opt]$ scp -r atguigu@hadoop102:/opt/module/* atguigu@hadoop104:/opt/module
2)rsync远程同步工具
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
(1)基本语法
rsync -av $pdir/$fname $user@$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
.
选项参数说明
选项 功能 -a 归档拷贝 -v 显示复制过程 (2)案例实操
(a)删除hadoop103中/opt/module/hadoop-3.1.3/wcinput[atguigu@hadoop103 hadoop-3.1.3]$ rm -rf wcinput/
(b)同步hadoop102中的/opt/module/hadoop-3.1.3到hadoop103
[atguigu@hadoop102 module]$ rsync -av hadoop-3.1.3/ atguigu@hadoop103:/opt/module/hadoop-3.1.3/
3)xsynv集群分发脚本
(1)需求:循环复制文件到所有节点的相同目录下(就是生成一个命令xsynv,仿照rsynv命令的功能,基于rsync,实现集群的分发)
如hadoop102的家目录/home/atguigu,新增了一个文件a.txt,我们希望103和104的相同目录下/home/atguigu也生成a.txt。
(2)需求分析
(a)rsync命令原始拷贝,将同步目录A分发到指定目录B
rsync -av /opt/module atguigu@hadoop103:/opt/
(b)上述实现太复杂,希望写个脚本,生成一个命令xsynv,希望用sxync+同步目录A就能实现同步分发的功能
(c)并且希望脚本在任何路径都能使用(即脚本放在声明了全局环境变量的路径)
[atguigu@hadoop102 ~]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/atguigu/.local/bin:/home/atguigu/bin:/opt/module/jdk1.8.0_212/bin
(3)脚本实现
(a)在/home/atguigu/bin目录下创建xsync文件
[atguigu@hadoop102 opt]$ cd /home/atguigu
[atguigu@hadoop102 ~]$ mkdir bin
[atguigu@hadoop102 ~]$ cd bin
[atguigu@hadoop102 bin]$ vim xsync
在该文件中编写如下代码
#!/bin/bash#1. 判断参数个数
if [ $# -lt 1 ]
thenecho Not Enough Arguement!exit;
fi#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
doecho ==================== $host ====================#3. 遍历所有目录,挨个发送for file in $@do#4. 判断文件是否存在if [ -e $file ]then#5. 获取父目录pdir=$(cd -P $(dirname $file); pwd)#6. 获取当前文件的名称fname=$(basename $file)ssh $host "mkdir -p $pdir"rsync -av $pdir/$fname $host:$pdirelseecho $file does not exists!fidone
done
【注】
- $(dirname $file):全路径的文件名
- cp -P :查文件的父目录
- $(basename $file): 文件名
- ssh $host:连接某台主机
- mkdir -p $pdir:-p表示,创建文件,无论文件存在与否,都不会报错
- rsync -av $pdir/$fname $host:$pdir中的$pdir/$fname是要同步的目录A,$host:$pdir是目的目录B,同步A目录到B目录,对B中的差异做更新
(b)修改脚本 xsync 具有执行权限
[atguigu@hadoop102 bin]$ chmod +x xsync
(c)测试脚本
[atguigu@hadoop102 ~]$ xsync /home/atguigu/bin
(d)将脚本复制到/bin中,以便全局调用
若就在/bin下创建的,
[atguigu@hadoop102 bin]$ sudo cp xsync /bin/
(e)同步环境变量配置(root所有者)
[atguigu@hadoop102 ~]$ sudo ./bin/xsync /etc/profile.d/my_env.sh
注意:如果用了sudo,那么xsync一定要给它的路径补全。
即xsync不能直接用,./bin/xsync要写全
(f)让环境变量生效
[atguigu@hadoop103 bin]$ source /etc/profile
[atguigu@hadoop104 opt]$ source /etc/profile
3.2.3 SSH无密登录配置
1)配置ssh
(1)基本语法 ssh另一台电脑的IP地址
(2)ssh连接时出现Host key verification failed的解决方法[atguigu@hadoop102 ~]$ ssh hadoop103
如果出现如下内容
Are you sure you want to continue connecting (yes/no)?
输入yes,并回车
(3)退回到hadoop102[atguigu@hadoop103 ~]$ exit
2)无密钥配置
(1)免密登录原理
- 在A服务器上,生成ssh-key-gen秘钥对(公钥-秘钥)
- 把公钥(A)拷贝到B服务器上,B服务器会放到一个已授权的目录Authorized_keys下,即只要遇到A访问B,都免密登录
- 当A通过ssh访问B,B要做什么?B要接收数据,取Authorized_keys查找有无A的公钥,如果有:B会采用公钥A加密的数据返回A,A会用私钥A解密数据,数据只有A能看
.【注】:当你把公钥发给谁,就默认对方接收了你的请求,允许你免密访问对方。
(2)生成公钥和私钥
【记住生成命令】 ssh-keygen -t rsa
生成在家目录的.ssh隐藏目录下
[atguigu@hadoop102 .ssh]$ pwd
/home/atguigu/.ssh[atguigu@hadoop102 .ssh]$ ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
(3)将公钥拷贝到要免密登录的目标机器上
【记住命令】ssh-copy-id + 目标机器
以hadoop102为例,配置无密登录到hadoop102、hadoop103、hadoop104;是的,hadoop102本机也配置下无密登录,配置后,在authorized_keys文件上可以看到哪些主机(即文件每行最后@一串主机名)可访问本机
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop102
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop103
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop104
同理:
还需要在hadoop103上采用atguigu账号配置一下无密登录到hadoop102、hadoop103、hadoop104服务器上。
还需要在hadoop104上采用atguigu账号配置一下无密登录到hadoop102、hadoop103、hadoop104服务器上。
(以上,102、103和104的atguigu账号可以相互免密访问)
还需要在hadoop102上采用root账号,配置一下无密登录到hadoop102、hadoop103、hadoop104;hadoop103和104也用root账号无密登录配置了一遍。(这样,102、103和104的root账号可以相互免密访问)
最终可在每台机器的authorized_keys文件中看到,hadoop102、hadoop103、hadoop104两两之间皆可免密访问对方
3.2.4 集群配置***
1) 集群部署规划
当然,服务器资源足够,NameNode(NN)、SecondaryNameNode(2NN)和ResourceManager(RM)可以安装在同一台服务器上。
2)配置文件说明**
Hadoop配置文件分两类:默认配置文件和自定义配置文件,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值。
要获取的默认文件 文件存放在Hadoop的jar包中的位置
(1)默认配置文件:
(2)自定义配置文件:
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置。
3)配置集群
根据 3.2.4的1)集群部署规划配置4个文件
(1)核心文件配置<core-site.xml>
1.指定NameNode,搜索<name>为"fs.defaultFS",在value上写上内部通讯值hdfs://hadoop102:8020,此处默认值为“file://”本地路径
2.指定hadoop数据存储目录,搜索<name>为"hadoop.tmp.dir",默认value值是/tmp/hadoop-${user.name}临时目录,我们的${user.name}是atguigu,(/tmp是临时目录,大概是1个月时间会删除该目录下的文件),所以首先得更改一个目录/opt/module/hadoop-3.1.3,然后,使用value值改为/opt/module/hadoop-3.1.3/data,若该目录不存在,则会自动创建3.HDFS网页登录使用的用户名(可先不配置)
core-site.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><!-- 指定NameNode的地址 --><property><name>fs.defaultFS</name><value>hdfs://hadoop102:8020</value></property><!-- 指定hadoop数据的存储目录 --><property><name>hadoop.tmp.dir</name><value>/opt/module/hadoop-3.1.3/data</value></property><!-- 配置HDFS网页登录使用的静态用户为atguigu --><property><name>hadoop.http.staticuser.user</name><value>atguigu</value></property>
</configuration>
(2)HDFS配置文件<hdfs-site.xml>
1.NameNode Web端访问地址:hadoop102:9870
2.2NN Web端访问地址:hadoop104:9868
hdfs-site.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><!-- nn web端访问地址--><property><name>dfs.namenode.http-address</name><value>hadoop102:9870</value></property><!-- 2nn web端访问地址--><property><name>dfs.namenode.secondary.http-address</name><value>hadoop104:9868</value></property>
</configuration>
(3)YARN配置文件<yarn-site.xml>
1.MR走什么协议?shuffle方式的资源调度
2.指定ResourceManager的地址:我们要指定103
3.环境变量的继承:环境变量+HADOOP_MAPRED_HOME,hadoop 3.2版本以上的,不需配置这一步。
yarn-site.xml文件内容如下
<configuration><!-- 指定MR走shuffle --><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><!-- 指定ResourceManager的地址--><property><name>yarn.resourcemanager.hostname</name><value>hadoop103</value></property><!-- 环境变量的继承 --><property><name>yarn.nodemanager.env-whitelist</name><value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value></property>
</configuration>
(4)MapReduce配置文件<mapred-site.xml>
1.指定MapReduce程序运行在Yarn上,默认可以运行在local,可选值是local, classic or yarn
【注】后续配置时,都可先查看默认值和可选值是什么
mapred-site.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><!-- 指定MapReduce程序运行在Yarn上 --><property><name>mapreduce.framework.name</name><value>yarn</value></property>
</configuration>
4)在集群上分发配置好的Hadoop配置文件
用xsync命令,同步分发到103和104服务器上,只更新该目录下有不同的地方
5)查看文件分发情况
去103和104上查看文件分发情况
3.2.5 群起集群
配置文件在102、103、104上已完成,我们需要启动集群
1)配置workers
有几个节点,就配置几个works
[atguigu@hadoop102 hadoop]$ vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
在该文件中增加如下内容:
hadoop102
hadoop103
hadoop104
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
同步所有节点配置文件
[atguigu@hadoop102 hadoop]$ xsync /opt/module/hadoop-3.1.3/etc
2)启动集群
(1)格式化NameNode
如果集群是第一次启动,需要在hadoop102节点格式化NameNode(注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止namenode和datanode进程,并且要删除所有机器的data和logs目录,然后再进行格式化。)
(2)启动HDFS
没报错说明配置没问题,新增了data和log目录,新增的data/dfs/name/current/VERSION文件中,可以看到namespaceID号 = 479101681
(3)Web端查看HDFS的NameNode
- (a)浏览器中输入:http://hadoop102:9870
- (b)查看HDFS上存储的数据信息
(4)启动YARN
在配置了ResourceManager的节点(hadoop103)启动YARN
[atguigu@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh
(5)Web端查看YARN的ResourceManager
- (a)浏览器中输入:http://hadoop103:8088
- (b)查看YARN上运行的Job信息
3)集群基本测试
(1)上传文件到集群
- 上传小文件 [atguigu@hadoop102 ~]$ hadoop fs -mkdir /input #创建目录
[atguigu@hadoop102 ~]$ hadoop fs -put $HADOOP_HOME/wcinput/word.txt /input- 上传大文件 [atguigu@hadoop102 ~]$ hadoop fs -put /opt/software/jdk-8u212-linux-x64.tar.gz /
(2)上传文件后查看文件存放在什么位置
- 查看HDFS文件存储路径
[atguigu@hadoop102 subdir0]$ pwd
/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-1436128598-192.168.10.102-1610603650062/current/finalized/subdir0/subdir0- 查看HDFS在磁盘存储文件内容
[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.tar.gz [atguigu@hadoop102 subdir0]$ cat
blk_1073741837>>tmp.tar.gz [atguigu@hadoop102 subdir0]$ tar -zxvf
tmp.tar.gz
(4)下载
[atguigu@hadoop104 software]$ hadoop fs -get /jdk-8u212-linux-x64.tar.gz ./
(5)执行wordcount程序
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar
share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount
/input /output
再执行wordcount程序,查看yarn如何调度。
执行MapReduce任务时,才执行Yarn,运行命令后,我们查看Web端yarn如何操作
数据存储位置是
/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-1275363475-192.168.10.102-1683122676712/current/finalized/subdir0/subdir0,BP后面一串数字 和 192.168.10.102后的一串数字根据自己电脑上的来
查看103和104的相同路径,确实存放着与102相同的数据。
4)集群崩溃处理办法
(1)YARN启动错误的服务器怎么办
这里我的3台虚拟机都重启了,服务也都停掉了,我们需要重启HDFS和YARN,由于不是首次启动集群,我们就不需要格式化NameNode
直接启动HDFS
启动YARN,操作失误,启动在102上。
需要先停掉102的YARN服务,sbin/stop-yarn.sh
再到103上开启YARN服务即可。
(2)误删重要文件/杀死关键进程怎么办?
破坏操作1,102上删除 DataNode
破坏操作2,102上删除 data目录
破坏操作3,103上删除 data目录
破坏操作4,104上删除 data目录
由于HDFS服务的老板NameNode(102上的data目录)被删了,所以
103上停YARN – 102上停HDFS – 102上启动HDFS,也无法正常启动HDFS服务
所以,HDFS服务的老板NameNode(102上的data目录)被删了,我们需要进行以下操作:
- 103上先停YARN ,102上再停HDFS(即先杀死相关进程)
- format格式化NN
这样还是不行,jps中还是没有NN
【正确操作】如下:
- 103上先停YARN ,102上再停HDFS(即先杀死相关进程)
- 删除所有机子的data和log目录
- format格式化NN
- 102启动HDFS,103启动YARN
3.2.6 配置历史服务器
要先关闭YARN服务,若在开启状态,就关闭再重启下
–daemon 启动守护进程,后台运行
快速准备下数据,别偷懒!敲下命令,熟悉下
为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:
1)配置mapred-site.xml [atguigu@hadoop102 hadoop]$ vim mapred-site.xml 在该文件里面增加如下配置。
<!-- 历史服务器端地址 -->
<property><name>mapreduce.jobhistory.address</name>\<value>hadoop102:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property><name>mapreduce.jobhistory.webapp.address</name><value>hadoop102:19888</value>
</property>
2)分发配置
> [atguigu@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
3)在hadoop102启动历史服务器 [atguigu@hadoop102 hadoop]$ mapred --daemon start historyserver
4)查看历史服务器是否启动 [atguigu@hadoop102 hadoop]$ jps
5)查看JobHistory http://hadoop102:19888/jobhistory
3.2.7 配置日志的聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryServer。
配置日志聚集前:
开启日志聚集功能具体步骤如下:
1)配置yarn-site.xml
[atguigu@hadoop102 hadoop]$ vim yarn-site.xml
在该文件里面增加如下配置。
<!-- 开启日志聚集功能 -->
<property><name>yarn.log-aggregation-enable</name><value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property> <name>yarn.log.server.url</name> <value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property><name>yarn.log-aggregation.retain-seconds</name><value>604800</value>
</property>
2)分发配置
[atguigu@hadoop102 hadoop]$ xsync H A D O O P H O M E / e t c / h a d o o p / y a r n − s i t e . x m l 3 )关闭 N o d e M a n a g e r 、 R e s o u r c e M a n a g e r 和 H i s t o r y S e r v e r [ a t g u i g u @ h a d o o p 103 h a d o o p − 3.1.3 ] HADOOP_HOME/etc/hadoop/yarn-site.xml 3)关闭NodeManager 、ResourceManager和HistoryServer [atguigu@hadoop103 hadoop-3.1.3] HADOOPHOME/etc/hadoop/yarn−site.xml3)关闭NodeManager、ResourceManager和HistoryServer[atguigu@hadoop103hadoop−3.1.3] sbin/stop-yarn.sh
[atguigu@hadoop103 hadoop-3.1.3]$ mapred --daemon stop historyserver
4)启动NodeManager 、ResourceManage和HistoryServer
[atguigu@hadoop103 ~]$ start-yarn.sh
[atguigu@hadoop102 ~]$ mapred --daemon start historyserver
5)删除HDFS上已经存在的输出文件
[atguigu@hadoop102 ~]$ hadoop fs -rm -r /output
6)执行WordCount程序
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
7)查看日志