hadoop入门

概念

Hadoop是什么
  1. 分布式系统基础架构
  2. 主要解决海量数据的存储和海量数据的分析计算问题
Hadoop发展历史
Hadoop的三大发行版本
  1. Apache 对于入门学习最好
  2. Cloudera 内部集成了很多大数据框架 对应产品 CDH
  3. Hortonworks 文档较好, 对应产品 HDP
Hadoop的优势
  1. 高可靠性:Hadoop底层维护多个数据副本
  2. 高扩展性
  3. 高效性:Hadoop是并行工作的
  4. 高容错性:能够自动将失败的任务重新分配
Hadoop的组成
  1. Common(辅助工具)
  2. HDFS(数据存储)
    1. NameNode 数据存储在什么位置
    2. 2NN 辅助NameNode工作,每隔一段时间对NameNode元数据备份
    3. DataNode 具体存储数据
  3. YARN(资源调度)
    1. ResourceManager:整个集群资源(内存、cpu等)的管理者,老大
    2. NodeManager:单个节点服务器资源的管理者
    3. ApplicationMaster:单个任务运行的管理者
    4. Container:容器,相当于一台独立的服务器,里面封装了任务运行所需要的资源
    5. 客户端可以用多个 可以运行多个ApplicationMaster 每个NodeManager上可以有多个Container
  4. MapReduce(计算)
    1. Map阶段并行处理输入数据
    2. Reduce阶段对Map结果进行汇总
  5. 三者关系:
Hadoop大数据技术生态体系
  1. 数据库(结构化数据)Sqoop数据传递
  2. 文件日志(半结构化数据)Flume日志收集
  3. 视频、ppt等(非结构化数据)Kafka消息队列
推荐系统案例

环境准备

模板虚拟机的准备
克隆
安装JDK Hadoop

Hadoop生产集群搭建

本地模式
xsync集群分布脚本

需求:循环复制文件到所有节点的相同目录下

实现流程:

  1. 在bin 目录下 创建 mkdir bin

  2. cd bin/

  3. vim xsync

  4. #!/bin/bash
    #1 获取输入参数个数,如果没有参数,直接退出
    pcount=$#
    if [ $pcount -lt 1 ]
    then
        echo Not Enough Arguement!
        exit;
    fi
    
    #2. 遍历集群所有机器
    # 也可以采用:
    # for host in hadoop{102..104};
    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)
                echo pdir=$pdir
                
                #6. 获取当前文件的名称
                fname=$(basename $file)
                echo fname=$fname
                
                #7. 通过ssh执行命令:在$host主机上递归创建文件夹(如果存在该文件夹)
                ssh $host "mkdir -p $pdir"
                
                #8. 远程同步文件至$host主机的$USER用户的$pdir文件夹下
                rsync -av $pdir/$fname $USER@$host:$pdir
            else
                echo $file does not exists!
            fi
        done
    done
    
    

    ###### ssh免密登录配置

    1. 在.ssh目录下运行 ssh-keygen -t rsa
    2. 会产生两个文件一个公钥文件一个密钥文件
    3. ssh-copy-id hadoop103..hadoop104 第一次输入密码后续就不需要输入密码

    ##### 完全分布式集群(开发和面试的重点)

    ###### 集群配置

    1. 集群部署规划

    NameNode和SecondaryNamNode不要安装在同一台服务器

    ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上

    | | Hadoop102 | Hadoop03 | Hadoop04 |
    | ---- | ----------------------- | -------------------------------- | ------------------------------- |
    | HDFS | NameNode <br />DataNode | DataNode | SecondaryNameNode<br />DataNode |
    | YARN | NodeManager | ResourceManager<br />NodeManager | NoddeManager |

    2. 配置文件说明

    配置文件分为两大类:默认配置文件和自定义配置文件,只有用户想修改某一默认配置时,才需要修改自定义配置文件,更改相应属性值

    | 要获取的默认文件 | 文件存放在Hadoop的jar包中的位置 |
    | :----------------: | :--------------------------------------------------------: |
    | core-default.xml | Hadoop-common-版本号.jar/core-default.xml |
    | hdfs-default.xml | Hadoop-hdfs-版本号.jar/hdfs-default.xml |
    | yarn-default.xml | Hadoop-yarn-common-版本号.jar/yarn-default.xml |
    | mapred-default.xml | Hadoop-mapreduce-client-core-版本号.jar/mapred-default.xml |

    3. 配置集群

    1. 核心配置文件 配置core-site.xml

    ```xml
    <configuration>
    <!-- 指定 NameNode 的地址 -->
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hadoop102:8020</value>
    </property>
    <!-- 指定 hadoop 数据的存储目录 -->
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/module/hadoop-3.1.3/data</value>
    </property>

    </configuration>
    2. HDFS配置文件 hdfs-site.xml
    <configuration> 
    <!-- NameNode web 端访问地址-->
    <property>
    <name>dfs.namenode.http-address</name>
    <value>hadoop102:9870</value>
    </property>
    <!-- SecondaryNameNode web 端访问地址-->
    <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>hadoop104:9868</value>
    </property>
    </configuration>
    3. YARN配置文件 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>hadoop103</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>
    4. MapReduce配置文件 mapred-site.xml
    <configuration> 
    <!-- 指定 MapReduce 程序运行在 Yarn 上 -->
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>
    </configuration>
  5. 在集群上分发配置好的Hadoop配置文件

    xsync /opt/module/hadoop-3.1.3/etc/hadoop/

群起集群并测试
  1. 配置workers

    vim /opt/module/hadoop-3.1.3/etc/hadoop/workers

    ​ 在文件中加入以下配置

    hadoop102
    hadoop103
    hadoop104

  2. 启动集群

    如果集群是第一次启动,需要在 hadoop102 节点格式化 NameNode(注意:格式化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停止 namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式化。)

    命令 hdfs namenode -format

配置历史服务器

  1. 配置 mapred-site.xml
    只需在mapred-site.xml配置文件加两个参数:
    [root@hadoop102 hadoop]$ vim mapred-site.xml
<!-- 历史服务器端地址 --> 
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>

<!-- 历史服务器 web 端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>

  1. 分发配置
    [root@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml

  2. 在 hadoop102 启动历史服务器

    先重新启动一下集群,先stop后start

    在启用历史服务器 [leokadia@hadoop102 hadoop]$ mapred –daemon start historyserver

配置日志的聚集

  1. 配置yarn-site.xml

    vim yarm-site.xml

    <!-- 开启日志聚集功能 --> 
    <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
    </property>
    <!-- 设置日志聚集服务器地址 -->
    <property>
    <name>yarn.log.server.url</name>
    <value>http://hadoop102:19888/jobhistory/logs</value>
    </property>
    <!-- 设置日志保留时间为 7 天 -->
    <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
    </property>
  2. 分发配置

    [leokadia@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml

  3. 关闭 NodeManager 、ResourceManager 和 HistoryServer

[leokadia@hadoop103 hadoop-3.1.3]$ mapred –daemon stop historyserver

  1. 启动 NodeManager 、ResourceManage 和 HistoryServer

hadoop集群启动脚本

#!/bin/bash 

if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi

case $1 in
"start")
echo " =================== 启动 hadoop 集群 ==================="

echo " --------------- 启动 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop 集群 ==================="

echo " --------------- 关闭 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac