1 分布式计算的背景
由于网络中待处理的数据量越来越大,高性能单机处理的能力也无法满足海量处理的要求。此时,若将巨大的数据进行分割交由不同的机器各自进行处理,再将每个机器的计算结果进行汇总,进而提高了运算时间。此时,用性能较低的机器也有可能在计算能力上超过高性能的单机计算能力。
2 Hadoop
Apache Hadoop是大数据开发所使用的一个核心框架。使用Hadoop可以方便地管理分布式集群,将海量数据分布在集群之中,并使用分布式并行程序处理这些数据。在该集群中的每台计算机都提供本地计算和存储。其本身的设计目的不是依靠硬件来提供高可用性,二十在应用程检测和处理故障。
2.1 Hadoop架构
Hadoop的核心组件由HDFS,YARN以及MapReduce组成。其结构如图。
-
HDFS: HD表示Hadoop, FS表示FileSystem。在调用上,将其理解为一个抽象的单一计算机系统,所有的操作面向一个单一的文件系统,而实际上,其文件的内部切割和存储,都由Hadoop架构完成。比如,在HDFS系统中新建文件夹的命令为
hdfs dfs -mkdir /input/
上述命令表示在hadoop的文件系统中新建了一个文件夹input,至于该input文件夹在集群间如何存储,对于用户而言是透明的。
-
Yarn: 中文为纺线。在Hadoop中进行穿针引线之作用。Yarn是资源管理和数据处理之间的层。
-
MapReduce:该单词表达了Map和Reduce两个行为。Map译为映射,即将待处理的数据分配到集群中的计算机并交由其进行计算。Reduce是将计算的结果进行汇总。
2.2 构建一个Hadoop集群
首先在VMWare中安装一台CentOS的服务器,将其IP地址设置为192.168.170.133。其具体过程可百度。
然后克隆两台一模一样的机器,并将其IP设置为192.168.170.134和192.168.170.135。
在CentOS中通过以下命令,将三台IP地址的主机进行命名
sudo vim /etc/hosts
192.168.170.133 centos01
192.168.170.134 centos02
192.168.170.135 centos03
这样,使用ssh进行登录的时候就不需要使用数字IP,而只需要填写hosts文件里的名称即可。
配置免密登录,以centos01与centos02通讯为例。
首先在home/你的用户/下新建(可能已有).ssh文件夹
mkdir .ssh
使用sshkeygen生成公钥和私钥
ssh-keygen -t rsa
将生成的公钥文件加入到authorized_keys文件中,这三台服务器之间互相加
cat id_rsa.pub >> authorized_keys #比如当前机器是134,id_rsa.pub是133上的文件,那么authroized_keys文件里就有133上的公钥,从133访问134可以免密访问
现在从133可以直接访问134
ssh user@centos01
2.3 安装JDK
使用yum安装JDK
sudo yum install java-1.8.0-openjdk-devel
安装此jdk的原因是可以调用jps程序查看当前的java进程。
然后指定环境变量,不会就查百度。
2.4 安装hadoop
从官网下载hadoop。
解压到自己喜欢的路径,按照《Hadoop大数据技术开发实战》是解压到以下路径
/opt/module/
2.5 配置hadoop环境
首先注意一点,如果你不会操作防火墙(我也不会),那么就把防火墙关了。
sudo systemctl stop firewalld #root权限
sudo systemctl disable firewalld
在etc/hadoop文件夹下配置hadoop,目前需要配置的文件包括
-
hadoop-env.sh
该文件是shell执行脚本,在此文件中应指定可执行的java程序的路径,以我本机为例
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64/jre
-
mapred-env.sh
该文件是shell执行脚本,用于执行mapreduce的过程,在此文件中应指定可执行java程序的路径,以我本机为例
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64/jre
-
yarn-env.sh
该文件是shell脚本,用于执行yarn的过程,在此文件中应指定java程序的路径,以我本机为例
JAVA=$JAVA_HOME/bin/java
-
core-site.xml
此文件是hadoop的核心配置文件,以下配置只用于说明当前例子可用的配置,其他的配置可查hadoop文档
<configuration> <property> <name>dfs.defaultFS</name> <value>hdfs://centos01:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/opt/module/hadoop-2.10.1/tmp</value> </property> </configuration>
-
hdfs-site.xml
此文件是hdfs的配置文件
<configuration> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> </configuration>
-
mapred-site.xml
该文件指定mapreduce过程使用yarn进行管理
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
-
yarn-site.xml
配置yarn
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffer</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>centos01:8032</value> </property> </configuration>
这个配置表示NodeManager上运行的附属服务,需配置成mapreduce_shuffer才可运行MapReduce程序。
配置yarn的resourcemanager的地址
3 运行hadoop例子
在运行hadoop的程序之前,为了减少麻烦,设定hadoop的可执行程序的路径到环境变量
#sudo vim /etc/profile
export HADOOP_HOME=/opt/module/hadoop-2.10.1
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
可以把hadoop架构看成一种服务器客户端模式,作为服务器的机器需要对数据节点进行管理,包括资源分配,数据下发任务等。决定哪台机器是服务器的应该就是在yarn-site.xml上进行配置。根据上面的配置文件,目前以centos01为服务器进行资源调度。因此在centos01上运行以下程序
start-all.sh
此时,应该在命令行中显示
Starting namenodes on [centos01]
centos01: starting namenode, logging to /opt/module/hadoop-2.10.1/logs/hadoop-atguigu-namenode-centos01.out
centos02: starting datanode, logging to /opt/module/hadoop-2.10.1/logs/hadoop-atguigu-datanode-centos02.out
centos03: starting datanode, logging to /opt/module/hadoop-2.10.1/logs/hadoop-atguigu-datanode-centos03.out
centos01: starting datanode, logging to /opt/module/hadoop-2.10.1/logs/hadoop-atguigu-datanode-centos01.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /opt/module/hadoop-2.10.1/logs/hadoop-atguigu-secondarynamenode-centos01.out
...
调用jps工具查看133,134,135上是否已经启动hadoop
133
[atguigu@centos01 ~]$ jps
10259 NameNode
10887 NodeManager
10605 SecondaryNameNode
11293 Jps
10415 DataNode
10767 ResourceManager
134
7921 NodeManager
8117 Jps
7788 DataNode
135
7779 NodeManager
7654 DataNode
7983 Jps
4 再分析Hadoop
由上述的jps命令可发现,134和135所拥有的进程一样,133另外i包含了ResourceManager(在yarn.xml中配置), SecondaryNameManager(是防止生产者消费者模式中消费者速度低于生产者速度的缓冲区)。Yarn的程序流转图如下
- NodeManager
从图中可知每个节点都由一个NodeManager用于管理该节点,它用于接收外部的请求,根据这些请求执行对应的Task
- Container
每个NodeManager中管理一个或多个Container,Containers根据ApplicationMaster的指令执行Task
- ResourceManager
ResourceManager分配用于运行ApplicationMaster的Container,然后与NodeManager通信,要求它在该Container中启动ApplicationManager。
- ApplicationManager
ApplicationManager向ResourceManager注册(注册后可以通过ResourceManager查看应用程序的运行状态)并请求运行应用程序各个Task所需的Container(资源请求是对一些Container的请求)。如果符合条件,ResourceManager会分配给ApplicationManager所需的Container(表达式为Container ID和主机名)
5 测试MapReduce
这里需要提前在Hadoop的hdfs系统中新建/input文件夹,/output文件夹不能提前新建
创建/input文件夹
hdfs dfs -mkdir /input
删除hadoop中已有的数据节点信息
#首先清空hadoop中已有的数据
hadoop namenode -format
在centos01上执行以下程序,运行Hadoop自带的MapReduce单词技术程序,统计/input文件夹中的所有文件的单词数量
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-client-hs-2.10.1.jar /input /output