Hadoop是一个又Apache基金会所开发的分布式系统基础架构。主要用于解决海量数据的存储和海量数据的分析计算问题。广义上来说,Hadoop也只Hadoop的生态圈。

相关Apache的开源软件:Index of /dist

Hadoop具有的优势:

高可靠性:Hadoop底层维护多个数据副本,避免某个节点故障导致的数据丢失。

高扩展性:可以通过增加节点的方式,拓展集群

高效性:在MapReduce的思想下,Hadoop是并行的

高容错性:能自动的失败的任务重新分配。

1.Hadoop的架构(左:1.x 右:2.x  现在的3.x与2.x差距不大)

Hadoop基础(安装与启动集群)-编程之家

 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.xmlhdfs-site.xmlyarn-site.xmlmapred-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