1 大数据概论
大数据(Big Data):指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。主要解决:含量数据的存储和海量数据的分析计算问题。
数据存储单位:bit、Byte、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB。
1.1 大数据特点
- volume(大量)
- velocity(高速)
- variety(多样)
- value(低价值密度)
1.2 Hadoop框架
- Hadoop是一个由Apache基金会所开发的分布式系统基础架构
- 主要解决海量数据的存储和海量数据的分析计算问题
- 广义上说,Hadoop通常是只一个更广泛的概念——Hadoop生态圈
1.2.1 Hadoop发展史
- Lucene框架是Doug Gutting开创的由java编写的开源软件,实现与Google类似的全文搜素功能,它提供了全文搜索引擎的架构,包括完整的查询引擎和索引引擎。
- 2001年年底Lucene成为Apache基金会的一个子项目
- 对于海量数据的场景,Lucene面对与Google同样的困难,存储数据困难,检索速度慢
- 学习和模仿Google解决这些问题的办法,微型版Nutch
- 学习说Google是Hadoop的思想之源(Google在大数据方面的三篇论文)
GFS——>HDFS
Map-Reduce——>MR
BigTable——>HBase - 2003-2004年,Google公开了部分GFS和MapReduce思想的细节,以此为基础Doug Cutting等人用了2年业务时间实现了DFS和MapReduce机制,使Nutch性能飙升
- 2005年Hadoop作为Lucene的子项目Nutch的一部分正式引入Apache基金会
- 2006年3月,Map-Reduce和Nutch Distributed FileSystem(NDFS)分别被纳入到Hadoop项目中,Hadoop就此正式诞生,标志着大数据时代来临
- 名字来源于Dong Cutting儿子的玩具大象
Hadoop三大发行版本:Apache、Cloudera、Hortonworks:
- Apache Hadoop
官网地址:http://hadoop.apache.org/releases.html
下载地址:https://archive.apache.org/dist/hadoop/common/ - Cloudera Hadoop
官网地址: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项目。 - 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)雅虎工程副总裁、雅虎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美元。
(7)2018年,Hortonworks与Cloudera 合并
1.2.2 Hadoop的优势
(1)高可用:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失
(2)高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点
(3)高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度
(4)高容错性:能够自动将失败的任务重新分配
1.2.3 Hadoop架构
在Hadoop1.x时代,Hadoop中的MapReduce同时处理业务逻辑运算和资源的调度,耦合性较大;在Hadoop2.x时代,由同一的资源调度平台YARN进行大数据计算资源的调度,MapReduce只负责运算,提升了Hadoop的通用性。Hadoop搭建的集群中的计算资源,不仅可以运行Hadoop中的MR程序,也可以运行其他计算框架的程序!例如: Tez,Storm,Spark,Flink。
- HDFS(框架):负责大数据存储的框架
- YARN(框架):负责大数据资源调度的框架
- MapReduce(编程模型):使用Hadoop制定的编程要求,编写程序,完成大数据的计算
完成大数据的计算的步骤:
- 写程序,程序需要符合计算框架的要求
- 运行程序,申请计算资源(cpu+内存,磁盘IO,网络IO)
1.x:MapReduce(编程模型)------> JobTracker ------> JVM ------> 申请计算资源
2.x:MapReduce(编程模型)------> jar ------> 运行时,将jar包中的任务,提交给YARN,和YARN进行通信
由YARN中的组件 ------> JVM ------> 申请计算资源
HDFS
- NameNode(1个):核心进程。存储文件的元数据,如文件名、文件目录结构、文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等。负责接收客户端的请求,接收DataNode的请求,向DataNode分配任务。
- DataNode(N个):核心进程。在本地文件系统存储文件块数据,以及块数据和校验和。负责接收NameNode分配的任务,负责数据块(block)的管理
- Secondary NameNode(N个):可选进程。用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。负责辅助NameNode工作。
MapReduce
MapReduce(编程规范): MapReduce是一个编程模型,这个模型由两个阶段组成,一个称为Map阶段,另一个称为Reduce阶段,在Map阶段和Reduce阶段分别启动若干进程负责运算,这些进程称为Task,在Map阶段启动的Task称为MapTask,在Reduce阶段启动的Task称为ReduceTask。遵循MapReduce的编程规范编写的程序,打包后,称为一个Job(任务)。在Job启动时,Job会先创建一个进程MRAppMaster(mapreduce 应用管理者),由这个进程和ResourceManage进行通信,为Job中的每个Task申请计算所需要的资源。Task的请求,会被ResourceManage缓存到一个调度队列中,由NodeManage领取Task,领取后NodeManage会根据Task要求,提供计算资源,为了避免计算资源在当前Task使用时被其他的task抢占,NodeManage会将资源封装到一个Container中,Container可以对计算资源进行隔离。
YARN
YARN负责集群中所有计算资源的管理和调度。
ResourceManager(1个):负责整个集群所有资源的管理。
- 负责接受客户端的提交Job的请求
- 负责向NM分配任务
- 负责接受NM上报的信息
NodeManager(N个):负责单台计算机所有资源的管理。
4. 负责和RM进行通信,上报本机中的可用资源
5. 负责领取RM分配的任务
6. 负责为Job中的每个Task分配计算资源
Container(容器): Container不是一个进程。 NodeManager为Job的某个Task分配了2个CPU和2G内存的计算资源,为了防止当前Task在使用这些资源期间,被其他的task抢占资源,将计算资源,封装到一个Container中,在Container中的资源,会被暂时隔离,无法被其他进程所抢占,当前Task运行结束后,当前Container中的资源会被释放,允许其他task来使用!
2 Hadoop环境搭建
2.1 虚拟机环境准备
VMware Network Adapter VMnet8配置NAT虚拟网络
1.安装完Linux系统后,配置主机和NAT模式网络
#配置服务器名称,每个服务器配置不同,更改完成需要重启生效
[root@localhost ~]# vim /etc/hostname
hadoop101
#配置网络
[root@hadoop101 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
#静态ip配置
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens192
UUID=cec5a0f3-1ef5-4569-91dc-095e05ac3dab
DEVICE=ens192
#开机启动
ONBOOT=yes
#网关
GATEWAY=192.168.1.2
#静态ip地址
IPADDR=192.168.88.101
#子网掩码
NETMASK=255.255.255.0
#配置google的DNS
[root@hadoop101 ~]# vim /etc/resolv.conf
# Generated by NetworkManager
nameserver 8.8.8.8
nameserver 8.8.4.4
#关闭防火墙
[root@hadoop101 ~]# systemctl stop firewalld
2.创建非root用户
#创建用户
[root@hadoop101 ~]# useradd yut
#设置用户密码
[root@hadoop101 ~]# passwd yut
#配置 yut 用户 sudo 免密码,将 yut ALL=(ALL) NOPASSWD: ALL 添加到文件末尾即可,或使用vim /etc/sudoers
[root@hadoop101 ~]# visudo
yut ALL=(ALL) NOPASSWD: ALL
Centos7可能没有预装ifconfig
,安装ifconfig
的方式见:https://www.cnblogs.com/xuliuzai/p/9769502.html
2.2 软件安装
2.2.1 安装JDK
1.在/opt目录下创建module、software文件夹
[yut@hadoop101 opt]# sudo mkdir module
[yut@hadoop101 opt]# sudo mkdir software
#修改文件夹所有者
[yut@hadoop101 opt]# sudo chown yut:yut module/ software/
2.上传jdk-8u144-linux-x64.tar.gz文件到software目录下解压
#解压tar包
[yut@hadoop101 software]# tar -zxvf jdk-8u144-linux-x64.tar.gz -C /opt/module/
3.配置JDK环境变量
[yut@hadoop101 jdk1.8.0_144]$ pwd
/opt/module/jdk1.8.0_144
[yut@hadoop101 jdk1.8.0_144]$ sudo vim /etc/profile
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
[yut@hadoop101 jdk1.8.0_144]$ sudo source /etc/profile
#检查是否配置成功
[yut@hadoop101 jdk1.8.0_144]$ java -version
2.2.2 安装Hadoop
Hadoop下载地址:https://archive.apache.org/dist/hadoop/common/hadoop-2.7.2
1.上传hadoop-2.7.2.tar.gz包到software目录下并解压
#解压
[yut@hadoop101 software]$ tar -zxvf hadoop-2.7.2.tar.gz -C /opt/module/
2.配置Hadoop环境变量
[yut@hadoop101 hadoop-2.7.2]$ pwd
/opt/module/hadoop-2.7.2
[yut@hadoop101 hadoop-2.7.2]$ sudo vim /etc/profile
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
[yut@hadoop101 jdk1.8.0_144]$ source /etc/profile
#检查是否配置成功
[yut@hadoop101 hadoop-2.7.2]$ hadoop version
2.2.2.1 Hadoop目录结构
1.查看Hadoop目录结构
[yut@hadoop101 hadoop-2.7.2]$ ll
total 32
drwxr-xr-x. 2 yut yut 194 May 22 2017 bin
drwxr-xr-x. 3 yut yut 20 May 22 2017 etc
drwxr-xr-x. 2 yut yut 106 May 22 2017 include
drwxr-xr-x. 3 yut yut 20 May 22 2017 lib
drwxr-xr-x. 2 yut yut 239 May 22 2017 libexec
-rw-r--r--. 1 yut yut 15429 May 22 2017 LICENSE.txt
-rw-r--r--. 1 yut yut 101 May 22 2017 NOTICE.txt
-rw-r--r--. 1 yut yut 1366 May 22 2017 README.txt
drwxr-xr-x. 2 yut yut 4096 Dec 11 18:54 sbin
drwxr-xr-x. 4 yut yut 31 May 22 2017 share
2.重要目录
(1)bin目录:存放对Hadoop相关服务(HDFS,YARN)进行操作的脚本
(2)etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件
(3)lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)
(4)sbin目录:存放启动或停止Hadoop相关服务的脚本
(5)share目录:存放Hadoop的依赖jar包、文档、和官方案例
3 Hadoop运行模式
HDFS运行模式取决于配置文件core-default.xml
中的参数fs.defaultFS=file:///
(默认)。
- 本地模式:在本机上使用HDFS,使用的是本机的文件系统(Linux文件系统/windows文件系统)
- 分布式模式:使用的是分布式文件系统,必须由NameNode、DataNode等若干进程共同运行完成文件系统的读写操作。
fs.defaultFs=hdfs://
MapReduce运行模式取决于配置文件mapred-default.xml
中的参数mapreduce.framework.name=local
(默认)。
- 本地模式:在本机上运行MR,在本机使用多线程的方式运行多个Task
- 在YARN上运行:将MR提交给YARN,由YARN将Job中的多个task分配到多台机器中,启动container运行task,需要启动YARN,YARN由ResourceManage和NodeManage进程组成。
mapreduce.framework.name=yarn
3.1 本地模式
3.1.1 官方Grep案例
1.在hadoop-2.7.2目录下面创建一个input文件夹
[yut@hadoop101 hadoop-2.7.2]$ mkdir input
2.将Hadoop的xml配置文件复制到input
[yut@hadoop101 hadoop-2.7.2]$ cp etc/hadoop/*.xml input
3.执行share目录下的MapReduce程序
[yut@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 查看输出结果
[yut@hadoop101 hadoop-2.7.2]$ cat output/*
3.1.2 官方WordCount案例
1.创建在hadoop-2.7.2文件下面创建一个wcinput文件夹
[yut@hadoop101 hadoop-2.7.2]$ mkdir wcinput
2.在wcinput文件下创建一个wc.input文件
[yut@hadoop101 hadoop-2.7.2]$ touch wcinput/wc.input
3.编辑wc.input文件
[yut@hadoop101 hadoop-2.7.2]$ vim wcinput/wc.input
hadoop yarn
hadoop mapreduce
yut
yut
4.执行程序
[yut@hadoop101 hadoop-2.7.2]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount wcinput wcoutput
5.查看结果
[yut@hadoop101 hadoop-2.7.2]$ cat wcoutput/part-r-00000
hadoop 2
mapreduce 1
yarn 1
yut 2
3.2 伪分布式模式
3.2.1 启动HDFS并运行MapReduce程序
1.修改Hadoop配置文件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>
</configuration>
2.修改HDFS配置文件hdfs-site.xml
<configuration>
<!-- 指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
3.启动HDFS
#首次启动格式
[yut@hadoop101 hadoop-2.7.2]$ bin/hdfs namenode -format
#启动namenode
[yut@hadoop101 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
#启动datanode
[yut@hadoop101 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
#查看集群是否启动成功
[yut@hadoop101 hadoop-2.7.2]$ jps
1970 DataNode
1875 NameNode
6331 Jps
(a)HDFS文件系统Web管理页面:http://192.168.88.101:50070/
(b)/opt/module/hadoop-2.7.2/logs
目录下存放hadoop运行的日志
(c)NameNode仅首次启动格式化。格式化NameNode,会产生新的clusterID(集群id),导致NameNode和DataNode的clusterID(集群id)不一致,集群找不到已往数据。所以,格式NameNode时,一定要先删除data数据和log日志,然后再格式化NameNode。
[yut@hadoop101 hadoop-2.7.2]$ cat data/tmp/dfs/name/current/VERSION
#Wed Dec 11 18:47:56 CST 2019
namespaceID=1491822328
clusterID=CID-2e42d9fe-e169-4105-a519-13e819013561
cTime=0
storageType=NAME_NODE
blockpoolID=BP-348638485-192.168.88.101-1576061276423
layoutVersion=-63
[yut@hadoop101 hadoop-2.7.2]$ cat data/tmp/dfs/data/current/VERSION
#Wed Dec 11 18:52:22 CST 2019
storageID=DS-b5b889ad-e328-4b7d-a9ea-3e5c7f12886f
clusterID=CID-2e42d9fe-e169-4105-a519-13e819013561
cTime=0
datanodeUuid=fcb07e03-88aa-4b46-8b05-cfc4894369f3
storageType=DATA_NODE
layoutVersion=-56
4.操作集群
(a)在HDFS文件系统上创建一个input文件夹
[yut@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -mkdir -p /user/yut/input
(b)将测试文件上传到文件系统
[yut@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -put wcinput/wc.input /user/yut/input/
(c)查看上传的文件
[yut@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -ls /user/yut/input/
(d)运行MapReduce程序
[yut@hadoop101 hadoop-2.7.2]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/yut/input /user/yut/output
(e)查看输出结果
[yut@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -cat /user/yut/output/*
hadoop 2
mapreduce 1
yarn 1
yut 2
3.2.2 启动YARN并运行MapReduce程序
1.修改yarn的配置文件yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 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>
</configuration>
2.将mapred-site.xml.template
重命名为mapred-site.xml
,修改MapReduce配置文件
<configuration>
<!-- 指定MR运行在YARN上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
3.启动Yarn(NameNode和DataNode必须已启动)
#启动ResourceManager
[yut@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh start resourcemanager
#启动NodeManager
[yut@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager
yarn的web管理页面:http://192.168.88.101:8088
4.集群操作
#删除output目录
[yut@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -rm -R /user/yut/output
#运行wordcount案例
[yut@hadoop101 hadoop-2.7.2]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/yut/input /user/yut/output
3.2.3 配置历史服务器
1.修改MapReduce配置文件mapred-site.xml
<configuration>
<!-- 指定MR运行在YARN上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop101:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop101:19888</value>
</property>
</configuration>
2.启动历史服务器
#启动历史服务器
[yut@hadoop101 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh start historyserver
历史服务器的web管理页面:http://192.168.88.101:19888
3.2.4 配置日志的聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上的/tmp
。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager。
1.修改yarn的配置文件yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 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>
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
2.重启NodeManager 、ResourceManager和HistoryManager
[yut@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh stop resourcemanager
[yut@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh stop nodemanager
[yut@hadoop101 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh stop historyserver
[yut@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh start resourcemanager
[yut@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager
[yut@hadoop101 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh start historyserver
3.2.5 配置文件说明
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 |
mapred-default.xml | hadoop-mapreduce-client-core-2.7.2.jar/ mapred-default.xml |
2.自定义配置文件
core-site.xml
、hdfs-site.xml
、yarn-site.xml
、mapred-site.xml
四个配置文件存放在$HADOOP_HOME/etc/hadoop
这个路径上,用户可以根据项目需求重新进行修改配置。
3.3 完全分布式模式
使用虚拟机克隆出3台相同的客户机,并配置相关的主机名(hadoop102、hadoop103)与网络(192.168.88.102、192.168.88.103)。
3.3.1 集群分发脚本
scp(secure copy)
scp
可以实现服务器与服务器之间的数据拷贝(全量复制)。
语法:
scp -r [$user@$hostname:]$pdir/$fname [$user@$hostname:]$pdir/$fname
命令 递归 源用户@源主机:要拷贝的文件路径/名称 目标用户@目标主机:目的路径/名称
[yut@hadoop101 hadoop-2.7.2]$ scp -r /opt/module root@hadoop102:/opt/module
[yut@hadoop101 hadoop-2.7.2]$ scp -r /opt/module root@hadoop103:/opt/module
[yut@hadoop101 hadoop-2.7.2]$ scp -r /etc/profile root@hadoop103:/etc/profile
[yut@hadoop101 hadoop-2.7.2]$ source /etc/profile
rsync
rsync
主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点(增量同步)。rsync
和scp
区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
语法:
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
选项 | 功能 |
---|---|
-r | 递归 |
-v | 显示复制过程 |
-l | 拷贝符号连接 |
-t | 基于文件的修改时间进行对比,只同步修改时间不同的文件 |
#没有则下载
[yut@hadoop101 hadoop-2.7.2]$ sudo yum install rsync.x86_64
[yut@hadoop101 hadoop-2.7.2]$ rsync -rvlt /opt/software/ root@hadoop102:/opt/software
集群分发脚本:
[yut@hadoop101 ~]$ echo $PATH
/opt/module/jdk1.8.0_144/bin:/opt/module/hadoop-2.7.2/bin:/opt/module/hadoop-2.7.2/sbin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/yut/.local/bin:/home/yut/bin
#可以在/home/yut/bin目录下创建xsync.sh脚本全局使用
[yut@hadoop101 ~]$ mkdir bin
[yut@hadoop101 ~]$ vim bin/xsync.sh
#!/bin/bash
#获取输入参数个数,没有则退出
pcount=$#
if [ $pcount -eq 0 ];then
echo "no args"
exit 1
fi
#获取文件名称
name=$1
filename=$(basename $name)
echo "filename=$filename"
#获取上级目录到绝对目录
pdir=$(cd -P $(dirname $name); pwd)
echo "pdir=$pdir"
#获取当前用户名称
user=$(whoami)
#循序
for((host=101;host<=103;host++));
do
echo "-------------hadoop$host-------------"
rsync -rvl $pdir/$fliename $user@hadoop$host:$pdir
done
exit 0
[yut@hadoop101 ~]$ sudo chmod +x bin/xsync.sh
[yut@hadoop101 ~]$ xsync.sh /opt/module
3.3.2 集群配置
1.集群部署规划
hadoop101 | hadoop102 | hadoop103 | |
---|---|---|---|
HDFS | NameNode,DataNode | DataNode | SecondaryNameNode,DataNode |
YARN | NodeManager | ResourceManager,NodeManager | NodeManager |
2.修改Hadoop配置文件core-site.xml
[yut@hadoop101 hadoop-2.7.2]$ vim etc/hadoop/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>
</configuration>
3.修改hdfs的配置文件hdfs-site.xml
[yut@hadoop101 hadoop-2.7.2]$ vim etc/hadoop/hdfs-site.xml
<configuration>
<!-- 指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定Hadoop的SecondaryNameNode节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop103:50090</value>
</property>
</configuration>
4.修改yarn配置文件yarn-site.xml
[yut@hadoop101 hadoop-2.7.2]$ vim etc/hadoop/yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop102</value>
</property>
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
5.修改MapReduce配置文件mapred-site.xml
[yut@hadoop101 hadoop-2.7.2]$ vim etc/hadoop/mapred-site.xml
<configuration>
<!-- 指定MR运行在YARN上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop101:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop101:19888</value>
</property>
</configuration>
6.在集群上分发配置好的Hadoop配置文件
[yut@hadoop101 hadoop-2.7.2]$ xsync.sh /opt/module/hadoop-2.7.2/
3.3.3 集群启动
单点启动
#启动namenode
[yut@hadoop101 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
#启动datanode
[yut@hadoop101 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
[yut@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
[yut@hadoop103 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
#启动secondarynamenode
[yut@hadoop103 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start secondarynamenode
#启动resourcemanager
[yut@hadoop102 hadoop-2.7.2]$ sbin/yarn-daemon.sh start resourcemanager
#启动nodemanager
[yut@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager
[yut@hadoop102 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager
[yut@hadoop103 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager
群起集群
上述集群分发脚本执行的时候,可以发现需要输入每个节点的登录密码,且每次执行都需要重复输入,我们可以配置SSH免密登录来达到节点间的免密访问。
ssh命令:
ssh destHost
:登录之后,执行某个命令,属于login-shell,会读取/etc/profile、/etc/profile.d/*、~/.bash_profile、~/.bashrc、/etc/bashrc脚本ssh destHost command
:不登录在目标机器上执行命令,属于non-login-shell,会读取/etc/profile.d/*、~/.bashrc、/etc/bashrc脚本,如果需要使用/etc/profile定义的一些变量,需要在目标机器的对应的用户的家目录/.bashrc中添加source /etc/profile。
[yut@hadoop101 hadoop-2.7.2]$ ssh 192.168.88.102
yut@192.168.88.102's password:
Last login: Sun Dec 15 20:38:55 2019 from hadoop101
[yut@hadoop102 ~]$
档案 | 说明 |
---|---|
known_hosts | 记录ssh访问过计算机的公钥(public key) |
id_rsa | 生成的私钥 |
id_rsa.pub | 生成的公钥 |
authorized_keys | 存放授权过的无密登录服务器的公钥 |
1.生成公钥和私钥
#在家目录下会创建.ssh目录,包含id_rsa(私钥)和id_rsa.pub(公钥)
[yut@hadoop101 ~]$ ssh-keygen -t rsa
2.将公钥copy到需要免密登录的目标机器上
[yut@hadoop101 hadoop-2.7.2]$ ssh-copy-id hadoop101
[yut@hadoop101 hadoop-2.7.2]$ ssh-copy-id hadoop102
[yut@hadoop101 hadoop-2.7.2]$ ssh-copy-id hadoop103
hadoop102和hadoop103上重复1和2操作
3.配置slaves
#修改slaves
[yut@hadoop101 hadoop-2.7.2]$ vim etc/hadoop/slaves
hadoop101
hadoop102
hadoop103
4.配置JAVA_HOME
[yut@hadoop101 hadoop-2.7.2]$ echo $JAVA_HOME
/opt/module/jdk1.8.0_144
[yut@hadoop101 hadoop-2.7.2]$ vim etc/hadoop/hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
[yut@hadoop101 hadoop-2.7.2]$ vim etc/hadoop/mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
[yut@hadoop101 hadoop-2.7.2]$ vim etc/hadoop/yarn-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
#同步配置文件
[yut@hadoop101 hadoop-2.7.2]$ xsync.sh etc/hadoop
4.启动集群
#删除hadoop101、hadoop102、hadoop103上data和logs目录后格式化
[yut@hadoop101 hadoop-2.7.2]$ bin/hdfs namenode -format
#启动HDFS
[yut@hadoop101 hadoop-2.7.2]$ sbin/start-dfs.sh
#启动YARN
[yut@hadoop102 hadoop-2.7.2]$ sbin/start-yarn.sh
注意:NameNode和ResourceManger如果不是同一台机器,不能在NameNode上启动 YARN,应该在ResouceManager所在的机器上启动YARN。
5.查看web页面
Namenode页面:http://192.168.88.101:50070
SecondaryNamenode页面:http://192.168.88.103:50090
Yarn页面:http://192.168.88.102:8088
6.测试集群
[yut@hadoop101 hadoop-2.7.2]$ hdfs dfs -mkdir -p /user/yut/input
[yut@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -put /opt/software/hadoop-2.7.2.tar.gz /user/yut/input
[yut@hadoop101 hadoop-2.7.2]$ ll -h data/tmp/dfs/data/current/BP-330732547-192.168.88.101-1576421651162/current/finalized/subdir0/subdir0/
3.3.4 集群时间同步
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。
1.检查ntp并安装
#检查ntp是否安装
[yut@hadoop101 hadoop-2.7.2]$ rpm -qa|grep ntp
#没有安装则安装ntp
[yut@hadoop101 hadoop-2.7.2]$ sudo yum install ntp.x86_64
2.修改ntp.conf
配置文件
[yut@hadoop101 hadoop-2.7.2]$ sudo vi /etc/ntp.conf
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
#将以下注释掉,不使用其它互联网上时间
#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 127.127.1.0
fudge 127.127.1.0 stratum 10
3.修改/etc/sysconfig/ntpd
配置文件
[yut@hadoop101 hadoop-2.7.2]$ sudo vim /etc/sysconfig/ntpd
#让硬件时间与系统时间一起同步
SYNC_HWCLOCK=yes
4.启动ntp
#重启ntp
[yut@hadoop101 hadoop-2.7.2]$ sudo systemctl restart ntpd
#设置ntp开机启动
[yut@hadoop101 hadoop-2.7.2]$ sudo systemctl enable ntpd
5.其它机器配置(必须root用户)
#每分钟同步一次时间
[root@hadoop102 ~]# crontab -e
*/1 * * * * /usr/sbin/ntpdate hadoop101
[root@hadoop103 ~]# crontab -e
*/1 * * * * /usr/sbin/ntpdate hadoop101