Hadoop是一个又Apache基金会所开发的分布式系统基础架构。主要用于解决海量数据的存储和海量数据的分析计算问题。广义上来说,Hadoop也只Hadoop的生态圈。
相关Apache的开源软件:Index of /dist
Hadoop具有的优势:
高可靠性:Hadoop底层维护多个数据副本,避免某个节点故障导致的数据丢失。
高扩展性:可以通过增加节点的方式,拓展集群
高效性:在MapReduce的思想下,Hadoop是并行的
高容错性:能自动的失败的任务重新分配。
1.Hadoop的架构(左:1.x 右:2.x 现在的3.x与2.x差距不大)
1.x的计算与资源调度还处于耦合状态,在2.x中就引入了Yarn进行资源的管理。降低了耦合度,将计算与资源管理解耦。
2.HDFS架构
Hadoop Distributed File System 简称HDFS,是一个分布式文件系统。
HDFS分为
NameNode,即存储文件的元数据。包括文件名、文件目录结构、文件属性,以及每个文件的块列表和块所在的DataNode。
DataNode,用于存储文件块数据,以及块数据的校验和。
SecondaryNameNode,每隔一段时间对NameNode的元数据进行备份,保证NameNode如果宕机,我们的集群还能够继续运行。
3.Yarn
YetAnother Resource Negotiator 是资源的调度协调者,Hadoop的资源管理器。
Yarn分为:
ResourceManager:用于调度资源,是整个集群资源的管理老大。
NodeManager:是单个节点服务器的资源老大。
4.MapReduce架构
MapReduce将计算过程分为了Map和Reduce阶段
1)首先由Map并行处理输入数据
2)在Reduce阶段对Map结果进行汇总。
大数据技术生态:
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:它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。
5.搭建Hadoop运行环境(细节或bug自行查百度)
将VMwareworkstations安装好,安装好虚拟机。可以勾选安装开发环境。这样可以配置上gcc
由于构建集群至少需要三台机器。所以先配置好第一台的基础信息,克隆两台。
关闭防火墙!同时关闭防火墙开机自启动!
[root@Hadoop-1 ~]# systemctl stop firewalld
[root@Hadoop-1 ~]# systemctl disable firewalld.service
在opt/目录下,或者自己新建一个export目录。里面创建softwares和servers文件夹。用于保存安装软件的安装包以及安装目录。
卸载虚拟机自带的openJDK,并且安装上完整版的JDK。然后在/etc/profile里直接配置环境变量。之后记得source配置文件,让其生效。
修改三台机器的网络连接模式,并且使用静态IP,将网络连接模式转换成NAT模式,注意虚拟网卡有没有安装好。(若没有虚拟网卡,用ccclean完全删除VMware后再用管理员运行,重新安装。)将ip地址配置好。同时在三台主机中添加ip映射。
配置好上述环境,导入Hadoop的hadoop3.x.x.tar.gz 将其安装到servers目录下。同时配置好Hadoop的环境变量。同样可以在/etc/profile里直接配置。安装好后可以使用hadoop version直接查看。
在hadoop目录中,有如下较重要的目录:
(1)bin目录:存放对Hadoop相关服务(hdfs,yarn,mapred)进行操作的脚本
(2)etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件
(3)lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)
(4)sbin目录:存放启动或停止Hadoop相关服务的脚本
(5)share目录:存放Hadoop的依赖jar包、文档、和官方案例
那么hadoop的安装已经完全OK
6.Hadoop的运行
Hadoop分为三种运行模式,本地模式,伪分布式模式,以及完全分布式模式。
- 本地模式:单机运行。生产环境不用。
- 伪分布式模式:也是单机运行,但是具备Hadoop集群的所有功能,一台服务器模拟一个分布式的环境。生产环境不用。
- 完全分布式模式:多台服务器组成分布式环境。生产环境使用。
下面我们开始搭建完全分布式模式
配置集群,配置ssh免密登录,单点启动以及测试集群启动。
为了方便在集群中传输文件,我们先编写一个集群分发脚本xsync(通过shell)并将其创建在环境变量中或者直接添加环境变量。并且记得为其添加权限。
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Fail
exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
do
echo ==================== $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:$pdir
else
echo $file does not exists!
fi
done
done
ssh免密登录
配置好相应的公钥和私钥。详情查看其它文章。
集群配置:
我们现在拥有了三台虚拟机,并且都安装了hadoop,但是此时,我们不知道谁是NameNode,谁是ResourceManager,谁是SecondaryNameNode,故我们需要配置下面几个文件。
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml 、workers
core-site.xml
<configuration>
<!– 指定NameNode的地址 –>
<property>
<name>fs.defaultFS</name>
<value>hdfs://Hadoop-1:8020</value>
</property>
<!– 指定hadoop数据的存储目录 –>
<property>
<name>hadoop.tmp.dir</name>
<value>/export/servers/hadoop-3.1.3/data</value>
</property>
<!– 配置HDFS网页登录使用的静态用户为root –>
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<!– nn web端访问地址–>
<property>
<name>dfs.namenode.http-address</name>
<value>Hadoop-1:9870</value>
</property>
<!– 2nn web端访问地址–>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>Hadoop-3:9868</value>
</property>
</configuration>
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>Hadoop-2</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>
mapred-site.xml
<configuration>
<!– 指定MapReduce程序运行在Yarn上 –>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
Workers
[root@Hadoop-1]$ vim /export/servers/hadoop-3.1.3/etc/hadoop/workers
在该文件中增加如下内容:
Hadoop-1
Hadoop-2
Hadoop-3
配置完成后,分发文件。
下面开始启动集群。第一次启动Hadoop集群,先要对NameNode进行初始化。
[root@Hadoop-1 hadoop-3.1.3]# hdfs namenode -format
根据上述配置文件,我指定了Hadoop-1为NameNode,Hadoop-2配置为ResourceManager,Hadoop-3配置为SecondaryNameNode。
在NameNode里启动集群 sbin/start-dfs.sh
在ResourceManager sbin/start-yarn.sh
通过jps,我们就可以查看到集群的状态。
在Hadoop集群的运行情况中,我们为了查看历史运行情况,需要配置一下历史服务器。
在mapred-site.xml里增加下述配置。
<!– 历史服务器端地址 –>
<property>
<name>mapreduce.jobhistory.address</name>
<value>Hadoop-1:10020</value>
</property>
<!– 历史服务器web端地址 –>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>Hadoop-1:19888</value>
</property>
配置日志聚集。将日志聚集后,应用完成后,将程序运行日志信息上传到HDFS系统。我们可以在HDFS系统中查看运行情况,若集群运行出现问题,那么可以在日志中快速定位。
配置yarn-site.xml
<!— 开启日志聚集功能 –>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!— 设置日志聚集服务器地址 –>
<property>
<name>yarn.log.server.url</name>
<value>http://Hadoop-1:19888/jobhistory/logs</value>
</property>
<!— 设置日志保留时间为7天 –>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
每一次单个开启和关闭集群,非常的麻烦,如果集群中电脑个数较多,不方便。所以我们可以通过一个脚本,整体启动HDFS和YARN。将组件一次性开启以及一次性关闭。(免密SSH是前提)
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input…"
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop集群 ==================="
echo " ————— 启动 hdfs —————"
ssh Hadoop-1 "/export/servers/hadoop-3.1.3/sbin/start-dfs.sh"
echo " ————— 启动 yarn —————"
ssh Hadoop-2 "/export/servers/hadoop-3.1.3/sbin/start-yarn.sh"
echo " ————— 启动 historyserver —————"
ssh Hadoop-3 "/export/servers/hadoop-3.1.3/bin/mapred –daemon start historyserver"
;;
"stop")
echo " 关闭 hadoop集群"
echo " 关闭 historyserver "
ssh Hadoop-1 "/export/servers/hadoop-3.1.3/bin/mapred –daemon stop historyserver"
echo " 关闭 yarn"
ssh Hadoop-2 "/export/servers/hadoop-3.1.3/sbin/stop-yarn.sh"
echo "关闭 hdfs"
ssh Hadoop-3 "/export/servers/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo " Error…"
;;
esac
保存后退出,并且赋予权限。
查看进程时我们会使用jps,但是如果每台机器都查看,很麻烦,于是编写一个jpsall脚本。
#!/bin/bash
for host in Hadoop-1 Hadoop-2 Hadoop-3
do
echo =============== $host ===============
ssh $host “/opt/module/jdk1.8.0_144/bin/jps”
done
分发脚本,添加权限即可。
常用端口号说明:
常用端口号
hadoop3.x
HDFS NameNode 内部通讯端口:8020/9000/9820
HDFS NameNode 对用户的查询端口:9870
Yarn查看任务运行情况的端口:8088
历史服务器:19888