hadoop系列笔记hadoop(一)入门、hadoop架构、集群环境搭建.hadoop(二)HDFS概述、shell操作、客户端操作(各种API操作)以及hdfs读写流程.hadoop(三)hdfs的NameNode和DataNode工作机制.hadoop(四)MapReduce入门及序列化实操.hadoop(五)MapReduce框架原理及工作机制.hadoop(六)hadoop数据压缩、yarn架构及工作原理、hadoop企业优化.
文章目录
- 第一章Hadoop简介
- 1.1Hadoop是什么
- 1.2发展历史
- 1.3 Hadoop三大发行版本
- 1.4 Hadoop的优势(4高)
- 1.5Hadoop组成(面试重点)
- 1.5.1 HDFS架构概述
- 1.5.2 YARN架构概述
- 1.5.3 MapReduce架构概述
- 1.6 大数据技术生态体系
- 1.7 推荐系统框架图(简图,之后还介绍)
- 第二章Hadoop运行环境搭建(开发重点)
- 2.1 虚拟环境准备
- 2.2 安装jdk
- 2.3 安装Hadoop
- Hadoop目录结构
- 第3章 Hadoop运行模式
- 3.1 本地运行模式
- 3.1.1官方Grep案例
- 3.1.2 官方WordCount案例
- 3.2 伪分布式运行模式
- 3.2.1启动HDFS并运行MapReduce程序
- 3.2.2 启动YARN并运行MapReduce程序
- 3.3完全分布式运行模式(开发重点)
- 3.3.1 虚拟机准备
- 3.3.2 编写集群分发脚本xsync
- 3.3.3 集群配置
- 3.3.4 集群单点启动
- 3.3.5 SSH无密登录配置
- 3.3.6 群起集群
- 3.3.7 配置历史服务器和日志的聚集
- 3.3.8 集群启动/停止方式总结
- 3.3.9 集群时间同步
第一章Hadoop简介
1.1Hadoop是什么
- 1)Hadoop是一个由Apache基金会所开发的分布式系统基础架构
- 2)主要解决,海量数据的存储和海量数据的分析计算问题。
- 3)广义上来说,HADOOP通常是指一个更广泛的概念——HADOOP生态圈
1.2发展历史
- 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就此诞生并迅速发展,标志这云计算时代来临
1.3 Hadoop三大发行版本
- Hadoop三大发行版本:Apache、Cloudera、Hortonworks。
- Apache版本最原始(最基础)的版本,对于入门学习最好。
- Cloudera在大型互联网企业中用的较多。
- Hortonworks文档较好。
1.4 Hadoop的优势(4高)
- 1)高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失。
- 2)高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点。
- 3)高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度。
- 4)高容错性:能够自动将失败的任务重新分配。
1.5Hadoop组成(面试重点)
- Hadoop1.x和Hadoop2.x区别:
1.5.1 HDFS架构概述
- 1)NameNode(nn):存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等。
- 2)DataNode(dn):在本地文件系统存储文件块数据,以及块数据的校验和。
- 3)Secondary NameNode(2nn):用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。
1.5.2 YARN架构概述
- 1)ResourceManager(rm):
- 处理客户端请求
- 启动/监控ApplicationMaster
- 监控NodeManager
- 资源分配与调度;
- 2)NodeManager(nm):
- 单个节点上的资源管理
- 处理来自ResourceManager的命令
- 处理来自ApplicationMaster的命令;
- 3)ApplicationMaster:
- 数据切分
- 为应用程序申请资源,并分配给内部任务
- 任务监控与容错。
- 4)Container:
- 对任务运行环境的抽象,封装了CPU、内存等多维资源以及环境变量、启动命令等任务运行相关的信息。
1.5.3 MapReduce架构概述
- MapReduce将计算过程分为两个阶段:Map和Reduce,如图所示
1)Map阶段并行处理输入数据
2)Reduce阶段对Map结果进行汇总
1.6 大数据技术生态体系
- 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的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
1.7 推荐系统框架图(简图,之后还介绍)
第二章Hadoop运行环境搭建(开发重点)
2.1 虚拟环境准备
- 1.克隆虚拟机
- 2.修改克隆虚拟机的静态IP
注意,适配器连接方式为NAT,ip地址的前三位要三者一致,Linux的VMnet8、Linux的ip地址,Windows的VMnet8这三个的前三位 - 3.修改主机名
记住改Hosts(这个改一次就行,之后克隆的都有,不放心可查看看看)
编写一个shell脚本即可: - 4.关闭防火墙
centos6和centos7指令不一样了 - 5.创建新用户
- 6.配置新用户具有root权限(详见大数据技术之Linux.)
注:这个需要强制保存wq! - 7.在/opt目录下创建文件夹
(1)在/opt目录下创建module、software文件夹
(2)修改module、software文件夹的所有者cd - 8)最后注意,每克隆一台都要改ip地址和主机名,Centos7以下的系统还需要修改/etc/udev/rules.d/70-persistent-net.rules文件,删掉第一行,第二行改成eth0,Centos7 不需要,重启即克隆完毕
2.2 安装jdk
- 第一步 卸载系统自带的OpenJDK以及相关的java文件
- 1.java -version
- 可以看到系统自带的OpenJDK版本信息。
- 2.查询java软件安装情况
- rpm -qa | grep java
- 删除这两个即可
java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64
java-1.8.0-openjdk-headless-1.8.0.102-4.b14.el7.x86_64 - noarch文件不需要删除
- 3.开始删除:记住,普通用户没有删除权限,要改成root用户删除(如果前面的权限更改为和root用户权限一样就不用了)
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.242.b08-1.el7.x86_64
rpm -e --nodeps java-1.8.0-openjdk-1.8.0.242.b08-1.el7.x86_64 - 4.检查是否已经删除成功java - version
表明删除成功
- 第二步 下载最新稳定JDK
- 用SecureCRT工具将JDK导入到opt目录下面的software文件夹下面,“alt+p”进入sftp模式,如图所示
- 选择jdk1.8拖入
- 在Linux系统下的opt目录中查看软件包是否导入成功
将hadoop包也拖入了 - 解压JDK到/opt/module目录下
tar -zxvf jdk-8u144-linux-x64.tar.gz -C /opt/module/
别忘记删除压缩包:
之后查看module文件,看看是否安装成功 - 配置JDK环境变量
- (1)先获取JDK路径
- (2)打开/etc/profile文件
sudo vim /etc/profile - (3)在profile文件末尾添加JDK路径,然后保存退出
#java environment
export JAVA_HOME=/opt/module/jdk1.8.0_144
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin
- (4)让修改后的文件生效
source /etc/profile
- ()最后我们来进行一下测试,看看我们的环境变量是否配置成功
测试命令:java -version
2.3 安装Hadoop
- 上面已经将文件复制到Linux的software下了
- 解压安装文件到/opt/module下面
tar -zxvf hadoop-2.7.2.tar.gz -C /opt/module/ - 查看是否解压成功
- 将Hadoop添加到环境变量
- (1)获取Hadoop安装路径
- (2)打开/etc/profile文件
- (3)在profile文件末尾添加hadoop路径,保存后退出
##HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export PATH=$PATH:${HADOOP_HOME}/bin
export PATH=$PATH:${HADOOP_HOME}/sbin
- (4)让修改后的文件生效
- hadoop version测试
Hadoop目录结构
- 1、查看Hadoop目录结构
- 2、重要目录
- (1)bin目录:存放对Hadoop相关服务(HDFS,YARN)进行操作的脚本
- (2)etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件
- (3)lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)
- (4)sbin目录:存放启动或停止Hadoop相关服务的脚本
- (5)share目录:存放Hadoop的依赖jar包、文档、和官方案例
第3章 Hadoop运行模式
Hadoop运行模式包括:本地模式、伪分布式模式以及完全分布式模式
- hadoop官方网站.来配置hadoop2.7.2
我的配置:
在文件中配置java_home
测试:
3.1 本地运行模式
3.1.1官方Grep案例
- 1.在hadoop-2.7.2文件下面创建一个input文件夹
mkdir input - 2.将Hadoop的xml配置文件复制到input
cp etc/hadoop/*.xml input - 3.执行share目录下的MapReduce程序
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output ‘dfs[a-z.]+’ - 4.查看输出结果
cat output/* - 说明你能执行本地模式,你的hadoop环境打通了
3.1.2 官方WordCount案例
- 1.在hadoop-2.7.2文件下面创建一个wcinput文件夹
mkdir wcinput - 2.在wcinput文件下创建一个wc.input文件
cd wcinput
touch wc.input - 3.编辑wc.input文件
vim wc.input
在文件中输入如下内容
hadoop yarn
hadoop mapreduce
liuyongjun
liuyongjun
保存退出::wq - 4.回到Hadoop目录/opt/module/hadoop-2.7.2
- 5.执行程序
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount wcinput wcoutput - 6.查看结果
cat wcoutput/* - 注意,本地运行模式执行只用到了hadoop的MapReduce计算,存储是在本地磁盘,资源调度是Linux申请的,不是yarn申请的,本地运行模式测试用的,开发不用。
3.2 伪分布式运行模式
- 只有一个节点的分布式
3.2.1启动HDFS并运行MapReduce程序
- 1.分析
(1)配置集群
(2)启动、测试集群增、删、查
(3)执行WordCount案例 - 2.执行步骤
- (1)配置集群
需要配置的三个都在/opt/module/hadoop2.7.2/etc/hadoop/下,如图:
- (a)配置:hadoop-env.sh(上面配过)
Linux系统中获取JDK的安装路径:
/opt/module/jdk1.8.0_144
修改JAVA_HOME 路径:
export JAVA_HOME=/opt/module/jdk1.8.0_144 - (b)配置:core-site.xml
- 在标签configuration中加如下配置
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
- (c)配置:hdfs-site.xml
<!-- 指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
- (2)启动集群
- (a)格式化NameNode(第一次启动时格式化,以后就不要总格式化)
hdfs namenode -format - (b)启动NameNode
hadoop-daemon.sh start namenode - (c)启动DataNode
hadoop-daemon.sh start datanode - (3)查看集群
- (a)查看是否启动成功
jps
注意:jps是JDK中的命令,不是Linux命令。不安装JDK不能使用jps - (b)web端查看HDFS文件系统
web端查看HDFS文件系统.
注意:如果不能查看,就是没有修改Windows上的hosts文件
Hosts文件路径:C:\WINDOWS\system32\drivers\etc
hadoop3.xHTTP端口号是9870 - (c)查看产生的Log日志
说明:在企业中遇到Bug时,经常根据日志提示信息去分析问题、解决Bug。
当前目录:/opt/module/hadoop-2.7.2/logs - (d) 思考:为什么不能一直格式化NameNode,格式化NameNode,要注意什么?
注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。所以,格式NameNode时,一定要先删除data数据和log日志,然后再格式化NameNode。
datanode和namenode的id是一致的 - 假如我再次格式化namenode,之后会和datanode的id不一致,就联系不上了,如图
- 演示一波,先停止namenode和datanode,然后再一次格式化namenode
- 这时将这两个启动之后,jps查看
- 只有namenode了,datanode自动删除了,这时怎么解决?
- 以后但凡出现bug,就去日志文件查看
- datanode出现问题,查看DataNode日志
- 解决方法:删除datanode
再启动DataNode查看没问题
此时的集群id就换了但是一直:
- (4)操作集群
- (a)在HDFS文件系统上创建一个input文件夹
hdfs dfs -mkdir -p /user/liuyongjun/input - (b)将测试文件内容上传到文件系统上
hdfs dfs -put wcinput/wc.input /user/liuyongjun/input/ - (c)查看上传的文件是否正确
hdfs dfs -ls /user/liuyongjun/input/
hdfs dfs -cat /user/liuyongjun/ input/wc.input - (d)运行MapReduce程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/liuyongjun/input/ /user/liuyongjun/output - (e)查看输出结果
- 命令行查看:
hdfs dfs -cat /user/liuyongjun/output/* - 浏览器查看:
web端查看HDFS文件系统.
查看output文件 - (f)将测试文件内容下载到本地
hdfs dfs -get /user/liuyongjun/output/part-r-00000 ./wcoutput/ - (g)删除输出结果
hdfs dfs -rm -r /user/liuyongjun/output
3.2.2 启动YARN并运行MapReduce程序
- 1.分析
(1)配置集群在YARN上运行MR
(2)启动、测试集群增、删、查
(3)在YARN上执行WordCount案例 - 2.执行步骤
- (1)配置集群 在/opt/module/hadoop-2.7.2/etc/hadoop/中
- (a)配置yarn-env.sh
配置一下JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144 - (b)配置yarn-site.xml
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop101</value>
</property>
- (c)配置:mapred-env.sh
配置一下JAVA_HOME - (d)配置: (对mapred-site.xml.template重新命名为) mapred-site.xml
mv mapred-site.xml.template mapred-site.xml
之后改mapred-site.xml
<!-- 指定MR运行在YARN上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
- (2)启动集群
- (a)启动前必须保证NameNode和DataNode已经启动
- (b)启动ResourceManager
sbin/yarn-daemon.sh start resourcemanager - (c)启动NodeManager
sbin/yarn-daemon.sh start nodemanager - (3)集群操作
- (a)YARN的命令行查看,如图所示
- (a)YARN的浏览器页面查看,如图所示
浏览器页面查看.
进入后点Nodes - (b)删除文件系统上的output文件
之前的启动HDFS最后删过,可以再执行试试
hdfs dfs -rm -R /user/liuyongjun/output
已经删除了 - (c)执行MapReduce程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/liuyongjun/input /user/liuyongjun/output - (d)查看运行结果,如图所示
hdfs dfs -cat /user/liuyongjun/output/*
- 伪分布式也没啥用,大体了解即可
- 开发重点是完全分布式运行模式
3.3完全分布式运行模式(开发重点)
- 分析:
1)准备3台客户机(关闭防火墙、静态ip、主机名称)
2)安装JDK
3)配置环境变量
4)安装Hadoop
5)配置环境变量
6)配置集群
7)单点启动
8)配置ssh
9)群起并测试集群
3.3.1 虚拟机准备
- 这个看前面的章节,简要说明就是克隆虚拟机,然后改ip地址和主机名,用远程工具连接成功即可
3.3.2 编写集群分发脚本xsync
- 1.scp(secure copy)安全拷贝
- (1)scp定义:
scp可以实现服务器与服务器之间的数据拷贝。(from server1 to server2) - (2)基本语法
- (3)案例实操
(a)将hadoop101中/opt/module目录下的软件拷贝到hadoop102上
scp -r hadoop101:/opt/module/hadoop-2.7.2 hadoop102:/opt/module
- 注意:拷贝过来的/opt/module目录,别忘了在hadoop102、hadoop103、hadoop104上修改所有文件的,所有者和所有者组。sudo chown liuyongjun:liuyongjun -R /opt/module
- (b)将hadoop101中/etc/profile文件拷贝到hadoop102的/etc/profile上
scp -r hadoop101:/etc/profile hadoop102:/etc/profile
- 以上操作其他虚拟机也一样操作
- 注意:拷贝过来的配置文件别忘了source一下/etc/profile
- 2.rsync 远程同步工具
- rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
同时注意,scp只是复制了文件的内容,文件的权限、时间戳等都没复制,而rsync是将所有的都复制了
- (1)基本语法
rsync -av /要拷贝得文件路径/名称 目的用户:/目的路径/名称
或者
rsync -av 原用户:/要拷贝得文件路径/名称 /目的路径/名称
也就是只能有一个远程用户操作
a:归档拷贝 (权限、时间戳等所有的都拷过来)
v:显示复制过程 - (2)案例实操
把hadoop101机器上的/opt/module拷贝到hadoop102服务器的相同位置
在hadoop102下执行
rsync -av hadoop101:/opt/module/hadoop-2.7.2 /opt/module
在hadoop101下执行
rsync -av /opt/module/hadoop-2.7.2 hadoop102:/opt/module
- 3.xsync集群分发脚本
- (1)需求:循环复制文件到所有节点的相同目录下
- (2)需求分析:
- (a)rsync命令原始拷贝:
rsync -av /opt/module root@hadoop103:/opt/ - (b)期望脚本:
xsync要同步的文件名称
- (c)说明:在/home/liuyongjun/bin这个目录下存放的脚本,liuyongjun用户可以在系统任何地方直接执行。
- (3)脚本实现
- (a)在/home/liuyongjun目录下创建bin目录,并在bin目录下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=102; host<105; host++)); do
echo ------------------- hadoop$host --------------
rsync -av $pdir/$fname $user@hadoop$host:$pdir
done
- (b)修改脚本 xsync 具有执行权限
[liuyongjun@hadoop102 bin]$ chmod 777 xsync
(c)调用脚本形式:xsync 文件名称
xsync /home/liuyongjun/bin
注意,这的意思是将bin目录下的文件拷到相同位置
拷贝成功
- 快速分发hadoop和java
- 1.将hadoop和jdk发到其他虚拟机
- xsync /opt/module/hadoop-2.7.2
- xsync jdk1.8.0_144
- xsync 直接加文件也行
- 2.拷贝配置文件/etc/profile
- 注意此配置文件的所有者是root用户
- 需要加sudo 起到临时拥有root用户权限
- su root
- 然后xsync /etc/profile
- 别忘记source /etc/profile
- 3.查看一下java和hadoop版本
- hadoop version
成功 - java -version
发现显示openjdk,原来是之前的openjdk未删除,
利用如下语句删除:(root用户有权限)
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.242.b08-1.el7.x86_64
rpm -e --nodeps java-1.8.0-openjdk-1.8.0.242.b08-1.el7.x86_64
在查看java -version
成功
3.3.3 集群配置
- 1.集群部署规划
hadoop102 | hadoop103 | hadoop104 | |
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
- 对于HDFS集群来说,主机是hadoop102(NameNode在),从机是102,103,104
- 对于yarn集群来说,主机是hadoop103(ResourceManager在),从机是102,103,104
- 注:真正集群规划是六台机器,
- 分别规划:
- hadoop101:NameNode
- hadoop102:SecondaryNameNode
- hadoop103:ResourceManager
- hadoop104:DataNode NodeManager
- hadoop105:DataNode NodeManager
- hadoop106:DataNode NodeManager
- 但是为甚么用三台呢,学习阶段穷呗,内存12g,16g,只能启动四台机器,家里有矿的32g的可以尝试六台
- 2.配置集群(注:这些配置文件都在/opt/module/hadoop-2.7.2/etc/hadoop下)
- (1)核心配置文件
- 配置core-site.xml
- 在该文件中编写如下配置
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
- (2)HDFS配置文件
- 配置hadoop-env.sh
- 加入export JAVA_HOME=/opt/module/jdk1.8.0_144
- 配置hdfs-site.xml
- 在该文件中编写如下配置
<!-- 指定HDFS副本数量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:50090</value>
</property>
- (3)YARN配置文件
- 配置yarn-env.sh
- export JAVA_HOME=/opt/module/jdk1.8.0_144
- 配置yarn-site.xml
- 在该文件中增加如下配置
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
- (4)MapReduce配置文件
- 配置mapred-env.sh
- export JAVA_HOME=/opt/module/jdk1.8.0_144
- 配置mapred-site.xml
cp mapred-site.xml.template mapred-site.xml
- 在mapred-site.xml文件中增加如下配置
<!-- 指定MR运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
- 注意上面的配置,只配了namenode、secondarynamenode、resourcemanager
从机一台也没配 ,手动启动集群,从机是不需要配置的. - 3.在集群上分发配置好的Hadoop配置文件
- xsync /opt/module/hadoop-2.7.2/etc
- 4.查看文件分发情况
- cat /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml
- 成功配置
3.3.4 集群单点启动
- (1)如果集群是第一次启动,需要在hadoop102上格式化(不小心再次格式化,解决办法见上面伪分布式)NameNode
- hdfs namenode -format
- (2)在hadoop102上启动NameNode
- hadoop-daemon.sh start namenode
- 然后jps查看一下
- (3)在hadoop104上启动secondarynamenode
- (4)在hadoop102、hadoop103以及hadoop104上分别启动DataNode
- hadoop-daemon.sh start datanode
- 然后jps查看一下
- (5)思考:每次都一个一个节点启动,如果节点数增加到1000个怎么办?
- 所以必然有群启动
3.3.5 SSH无密登录配置
- SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台-包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。
- 以非对称加密实现身份验证,加密和解密用的是不同的秘钥
- RSA加密算法就是非对称加密算法
- ssh远程登录主机原理:
- 首先向远程主机发送一个登陆请求,主机返回一个秘钥,用来加密数据流,把密码通过秘钥加密发给主机,主机通过另外配对的秘钥把数据解密,进行认证信息比对,合适即登陆,这就是ssh远程登陆流程,注意首次登陆中途有一个输入yes指令。
- 1.配置ssh
- (1)基本语法
ssh另一台电脑的ip地址 - (2)ssh连接时出现Host key verification failed的解决方法
- (3)解决方案如下:直接输入yes
- 2.无密钥配置
(1)免密登录原理,如图所示
(2)生成公钥和私钥:
ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
(3)将公钥拷贝到要免密登录的目标机器上
此文件存放公钥 - 此时在hadoop102上只需要输入ssh hadoop103就无密登陆hadoop103,注意连接是单向的,只能102 远程登陆103,但是可以再在103上设置远程登陆102,这样实现双通
- 我们可以看到三台机器互通,配置起来很麻烦,我们可以用一种高效率的方法,只是此方法安全性低,如果服务器之间距离较远,需要外网连接,尽量不要用,如今是学习阶段,可以学习配置一下,了解有这个方法:
- 先删掉hadoop102ssh下的authorized_keys文件,这样102就没有存储的公钥,我们接着利用命令ssh-copy-id hadoop102,这样可以无密登陆自己,之后利用命令 xsync .ssh将.ssh文件发给所有虚拟机,这样各机器都用此文件了,公钥一致了,可以互相无密登陆了
- 3.
ssh文件夹下(~/.ssh)的文件功能解释
known_hosts | 记录ssh访问过计算机的公钥(public key) |
id_rsa | 生成的私钥 |
id_rsa.pub | 生成的公钥 |
authorized_keys | 存放授权过得无密登录服务器公钥 |
3.3.6 群起集群
- 1.配置slaves(从机,小弟们)
- /opt/module/hadoop-2.7.2/etc/hadoop/slaves
- 在该文件中增加如下内容:
hadoop102
hadoop103
hadoop104
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
同步所有节点配置文件 xsync slaves
- 2.启动集群(首先要免密)
- (1)如果集群是第一次启动,需要格式化NameNode(注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据)
hdfs namenode -format. - (2)在hadoop102(对于hdfs来说102是主机)上启动HDFS
- start-dfs.sh
- (3)在hadoop103(对于YARN来说103是主机)上启动YARN
- start-yarn.sh
- 注意:NameNode和ResourceManger如果不是同一台机器,不能在NameNode上启动 YARN,应该在ResouceManager所在的机器上启动YARN。
3.3.7 配置历史服务器和日志的聚集
- 为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:
- 1.配置mapred-site.xml
- 在该文件里面增加如下配置
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop104:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop104:19888</value>
</property>
- 日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
- 日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
- 注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager。
- 开启日志聚集功能具体步骤如下:
- 1.配置yarn-site.xml
- 在该文件里面增加如下配置
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
- 注配置完都要同步一下
- 测试看看
- 在104上启动历史服务器
- mr-jobhistory-daemon.sh start historyserver
3.3.8 集群启动/停止方式总结
- 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.3.9 集群时间同步
- 时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。
- 配置时间同步具体实操:
- 1.时间服务器配置(必须root用户)
- (1)检查ntp是否安装
rpm -qa|grep ntp
没有安装,先用命令yum -y install ntp安装,三台都安
注意开始配置之前查看你的ntp服务是否启动
systemctl status ntpd
三台要全部停掉 - (2)修改ntp配置文件
vim /etc/ntp.conf
修改内容如下
- a)修改1(授权192.168.199.0-192.168.199.255网段上的所有机器可以从这台机器上查询和同步时间)
#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 文件
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes - (4)重新启动ntpd服务
systemctl start ntpd - (5)设置ntpd服务开机启动
systemctl enable ntpd
- 2.其他机器配置(必须root用户)
- (1)在其他机器配置10分钟与时间服务器同步一次
crontab -e
编写定时任务如下:
*/10 * * * * /usr/sbin/ntpdate hadoop102
上面语句的意思是每隔十分钟去102获取时间 - (2)修改任意机器时间
date -s “2017-9-11 11:11:11” - (3)十分钟后查看机器是否与时间服务器同步
date
说明:测试的时候可以将10分钟调整为1分钟,节省时间。