hadoop3.x入门到精通-阶段一(安装集群)

Hadoop概述

Hadoop是什么?

官网:https://hadoop.apache.org/

Hadoop是一个由Apache基金会所开发的分布式系统基础架构,主要就是解决数据存储和数据分析计算的问题(通过HDFS,YARN,MapReduce实现)。分布式就是多个服务器做同样的一件事。

广义上来说,hadoop通常指hadoop生态圈。

Hadoop发展历史

  在2003至2004年,Google陆续公布了部分GFS和MapReduce思想的细节,Nutch的创始人Doug Cutting受到启发,用了若干年时间实现了DFS和MapReduce机制,使Nutch性能飙升。

  2005年,Hadoop作为Lucene子项目Nutch的一部分正式被引入Apache基金会,随后又从Nutch中剥离,成为一套完整独立的软件,起名为Hadoop。据说,Hadoop这个名字来源于创始人Doug Cutting儿子的毛绒玩具大象,因此,Hadoop的Logo形象如图1所示。

目前,Hadoop已经正式成为Apache顶级开源项目,俨然已经成为大数据处理技术的核心地位。下面我们回顾一下近10年来Hadoop的主要发展历程。

  · 2008年1月,Hadoop成为Apache顶级项目。

  · 2008年6月,Hadoop的第一个SQL框架——Hive成为了Hadoop的子项目。

  · 2009年7月 ,MapReduce 和 Hadoop Distributed File System (HDFS) 成为Hadoop项目的独立子项目。

  · 2009年7月 ,Avro 和 Chukwa 成为Hadoop新的子项目。

  · 2010年5月 ,Avro脱离Hadoop项目,成为Apache顶级项目。

  · 2010年5月 ,HBase脱离Hadoop项目,成为Apache顶级项目。

  · 2010年9月,Hive脱离Hadoop,成为Apache顶级项目。

  · 2010年9月,Pig脱离Hadoop,成为Apache顶级项目。

  · 2010年-2011年,扩大的Hadoop社区忙于建立大量的新组件(Crunch,Sqoop,Flume,Oozie等)来扩展Hadoop的使用场景和可用性。

  · 2011年1月,ZooKeeper 脱离Hadoop,成为Apache顶级项目。

  · 2011年12月,Hadoop1.0.0版本发布,标志着Hadoop已经初具生产规模。

  · 2012年5月,Hadoop 2.0.0-alpha版本发布,这是Hadoop-2.x系列中第一个(alpha)版本。与之前的Hadoop-1.x系列相比,Hadoop-2.x版本中加入了YARN,YARN成为了Hadoop的子项目。

  · 2012年10月,Impala加入Hadoop生态圈。

  · 2013年10月,Hadoop2.0.0版本发布,标志着Hadoop正式进入MapReduce v2.0时代。

  · 2014年2月,Spark开始代替MapReduce成为Hadoop的默认执行引擎,并成为Apache顶级项目。

  · 2017年12月,继Hadoop3.0.0的四个Alpha版本和一个Beta版本后,第一个可用的Hadoop 3.0.0版本发布。

Hadoop三大发行版本

Hadoop三大发行版本:Apache、Cloudera、Hortonworks。

  · Apache版本最原始(最基础)的版本,对于入门学习最好。2006

  · Cloudera内部集成了很多大数据框架,对应产品CDH。2008

  · Hortonworks文档较好,对应产品HDP。2011。

  · Hortonworks现在已经被Cloudera公司收购,推出新的品牌CDP

hadoop的优势 

Hadoop是一个能够让用户轻松构建和使用的分布式计算平台。用户可以轻松地在Hadoop上开发、运行需要处理海量数据的应用程序。它主要有以下几个优点。

(1)高可靠性。Hadoop按位存储和处理数据的能力值得信赖。

(2)高扩展性。Hadoop通过在可用的计算机集簇间分配数据来完成计算任务,这些集簇可以方便地扩展到数以千计的节点中。

(3)高效性。Hadoop能够在节点之间动态地移动数据,以保证各个节点的动态平衡,因此其处理速度非常快。

(4)高容错性。Hadoop能够自动保存数据的多份副本,并且能够自动将失败的任务重新分配。

Hadoop架构变迁(1.0-2.0变迁)

  • Hadoop 1.0
    HDFS(分布式文件存储)
    MapReduce(资源管理和分布式数据处理)

  • Hadoop 2.0
    HDFS(分布式文件存储)
    MapReduce(分布式数据处理)
    YARN(集群资源管理、任务调度)

 首先我们来看一下致命性的变化,就是1.0版本到2.0版本的变迁,因为hadoop发展到现在,大概经历了三个大的版本变化,我们仔细对比一下,发现底层都是hdfs,没有什么变化,也就是说,数据怎么存的,没有什么变化。
  1.0到2.0最大的变化,就是对MR进行了大的拆分,并且引入了一个新的组件,叫做YARN。大家可以看下图,我们发现,这个mapReduce这个组件太累了,他除了要做集群的资源管理,还要做数据的处理,这一个组件身兼数职,并且这两件事情都非常的重要,那他的性能能好吗?
  完全不行啊,所以呢,到2.0版本之后,hadoop做了一个非常大的构架变化,就是把MR做了拆分,MR你只负责处理数据就可以了,资源管理的事情,交给专门的组件来做,这个组件就是YARN,并且YARN这个组件做的非常通用,不仅支持MapReduce,还支持其他的计算框架,什么Spark,Flink等。目前市面上1.0基本上没什么人用了,但是2.8、2.9这些还是有在用。

Hadoop架构变迁(3.0新版本)

Hadoop 3.0架构组件和Hadoop 2.0类似,3.0着重于性能优化。

我们可以看一下,2.0到3.0的版本,构架已经没有大的改变了,一个软件要是天天变构架,那就太搓了,3.0版本侧重的是性能的优化,就比如说支持cup的多重运算、支持多重备份,并且内部的数据支持动态平衡,并且存储效率变高了,采用删码存储等等。以上就是hadoop各个版本之间的一些区别。

  • 通用方面
    精简内核、类路径隔离、shell脚本重构

  • Hadoop HDFS
    EC纠删码、多NameNode支持

  • Hadoop MapReduce
    任务本地化优化、内存参数自动推断

  • Hadoop YARN
    Timeline Service V2、队列配置

Hadoop架构概述

HDFS概述

HDFS 遵循主/从架构,由单个 NameNode(NN) 和多个 DataNode(DN) 组成:

  • NameNode : 负责执行有关 文件系统命名空间 的操作,例如打开,关闭、重命名文件和目录等。它同时还负责集群元数据的存储,记录着文件中各个数据块的位置信息。
  • DataNode:负责提供来自文件系统客户端的读写请求,执行块的创建,删除等操作。

YARN概述 

Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.0 引入的集群资源管理系统。用户可以将各种服务框架部署在 YARN 上,由 YARN 进行统一地管理和资源分配。

YARN架构:

MapReduce概述 

Hadoop MapReduce 是一个分布式计算框架,用于编写批处理应用程序。编写好的程序可以提交到 Hadoop 集群上用于并行处理大规模的数据集。

MapReduce 作业通过将输入的数据集拆分为独立的块,这些块由 map 以并行的方式处理,框架对 map 的输出进行排序,然后输入到 reduce 中。MapReduce 框架专门用于 <key,value> 键值对处理,它将作业的输入视为一组 <key,value> 对,并生成一组 <key,value> 对作为输出。输出和输出的 key 和 value 都必须实现Writable 接口。

(input) <k1, v1> -> map -> <k2, v2> -> combine -> <k2, v2> -> reduce -> <k3, v3> (output)

MapReduce编程模型简述

  

Linux环境准备

集群规划注意

  • 角色规划的准则 : 根据软件工作特性和服务器硬件资源情况合理分配,比如依赖内存工作的NameNode是不是部署在大内存机器上?
  • 角色规划注意事项:资源上有抢夺冲突的,尽量不要部署在一起,工作上需要互相配合的。尽量部署在一起

集群角色规划例子

安装Linux虚拟机3台,内存4G,硬盘50G

资料下载

vm,centos7

链接:https://pan.baidu.com/s/1gP1vLKCWMou1znb71qtA4Q 
提取码:yyds 


jdk1.8

链接:https://pan.baidu.com/s/1AN2GCDtpVqCDPaeNZQ6THg 
提取码:yyds 
 

hadoop

链接:https://pan.baidu.com/s/1F7cPSzfmtZLtRJuLP5D4FA 
提取码:yyds 

linux配置

防火墙,关闭防火墙开机自启

systemctl stop firewalld
systemctl disable firewalld.service

关闭selinux

1、临时关闭:输入命令setenforce 0,重启系统后还会开启。

2、永久关闭:输入命令vi /etc/selinux/config,将SELINUX=enforcing改为SELINUX=disabled,然后保存退出。

创建bigdata用户,并修改bigdata用户的密码

useradd bigdata
passwd bigdata

配置bigdata用户具有root权限

vim /etc/sudoers
## Allow root to run any commands anywhere
root    ALL=(ALL)     ALL

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL
bigdata   ALL=(ALL)     NOPASSWD:ALL

注意:atguigu这一行不要直接放到root行下面,因为所有用户都属于wheel组,你先配置了atguigu具有免密功能,但是程序执行到%wheel行时,该功能又被覆盖回需要密码。所以atguigu要放到%wheel这行下面。

在/opt目录下创建文件夹,并修改所属主和所属组

mkdir /home/bigdata/module
mkdir /home/bigdata/software
chown bigdata:bigdata /home/bigdata/module
chown bigdata:bigdata /home/bigdata/software

  • /home/bigdata/software : 用来放安装包
  • /home/bigdata/module:用来放解压后的安装包。

卸载虚拟机自带的JDK

rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
  • rpm -qa:查询所安装的所有rpm软件包
  • grep -i:忽略大小写
  • xargs -n1:表示每次只传递一个参数
  • rpm -e –nodeps:强制卸载软件

配置网络例子:

vim /etc/sysconfig/network-scripts/ifcfg-ens33
DEVICE=ens33
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
NAME="ens33"
IPADDR=192.168.10.102
PREFIX=24
GATEWAY=192.168.10.2
DNS1=192.168.10.2

注意:上面的配置更具自己的网络。

修改主机名

vim /etc/hostname
hadoop102

配置Linux克隆机主机名称映射

vim /etc/hosts

例子:

192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103

修改windows的主机映射文件

192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104

剩下的就是

  • 配置集群ssh免密登录
  • 配置jdk环境

配置集群ssh免密登录

ssh-keygen (生成秘钥)

ssh-copy-id hadoop102 (把公钥拷贝到对应的机器)

配置JDK环境变量

sudo vim /etc/profile.d/my_env.sh
#JAVA_HOME
export JAVA_HOME=/home/bigdata/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin

集群分发脚本(xsync) 脚本使用例子./xsync ../module/hadoop-3.2.3/(分发hadoop到集群其他机器)

#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
  echo Not Enough Arguement!
  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

总结:

  • 关闭防火墙,关闭selinux避免集群之间通信干扰
  • 创建非root用户,相对的保证了集群操作的安全性
  • 创建集群的工作环境
  • 卸载本机自带的jdk,安装jdk1.8
  • 配置集群的hosts(hadoop访问的时候需要域名)
  • 配置ssh方便集群之间文件的分发还有其他的免密操作
  • 最终结果(bigdata用户xsync可以直接分发文件到集群,java环境配置好)

Hadoop完全分布式集群安装

Hadoop重要目录

(1)bin目录:存放对Hadoop相关服务(hdfs,yarn,mapred)进行操作的脚本

(2)etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件

(3)lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)

(4)sbin目录:存放启动或停止Hadoop相关服务的脚本

(5)share目录:存放Hadoop的依赖jar包、文档、和官方案例

集群规划

hadoop2datanode,nodemanager,namenode
hadoop3datanode,nodemanager,resourcemanager
hadoop4datanode,nodemanager,secondnamenode,historyserver

修改配置

修改etc里面的workers文件(里面第datanode,nodemanage所在的机器)

hadoop102
hadoop103
hadoop104

core-site.xml

<configuration>
    <property>
        <!--指定 namenode 的 hdfs 协议文件系统的通信地址-->
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop102:8020</value>
    </property>
    <property>
        <!--指定 hadoop 集群存储临时文件的目录-->
        <name>hadoop.tmp.dir</name>
        <value>/home/bigdata/module/hadoop-3.2.3/data</value>
    </property>
	
	<!-- 配置HDFS网页登录使用的静态用户为bigdata -->
  <property>
    <name>hadoop.http.staticuser.user</name>
    <value>bigdata</value>
  </property>
 
    <property>
        <name>fs.trash.interval</name>
        <value>1</value>
    </property>
 
 
    <property>
        <name>fs.trash.checkpoint.interval</name>
        <value>1</value>
    </property>
 
    <!-- 配置该bigdata(superUser)允许通过代理访问的主机节点 -->
    <property>
        <name>hadoop.proxyuser.bigdata.hosts</name>
        <value>*</value>
    </property>
    <!-- 配置该bigdata(superUser)允许通过代理用户所属组 -->
    <property>
        <name>hadoop.proxyuser.bigdata.groups</name>
        <value>*</value>
    </property>
    <!-- 配置该bigdata(superUser)允许通过代理的用户-->
    <property>
        <name>hadoop.proxyuser.bigdata.users</name>
        <value>*</value>
    </property>
 
 
</configuration>

hdfs-site.xml

<configuration>
<property>
    <name>dfs.namenode.http-address</name>
    <value>hadoop102:9870</value>
  </property>
<property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>hadoop104:9868</value>
  </property>
  
     <property>
        <name>dfs.hosts.exclude</name>
        <value>/home/bigdata/module/hadoop-3.2.3/etc/blacklist</value>
    </property>
</configuration>

创建blacklist黑名单

touch /home/bigdata/module/hadoop-3.2.3/etc/blacklist 

yarn-site.xml

<configuration>
    <property>
        <!--配置 NodeManager 上运行的附属服务。需要配置成 mapreduce_shuffle 后才可以在 Yarn 上运行 MapReduce 程序。-->
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <!--resourcemanager 的主机名-->
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop103</value>
    </property>
	
	 <!-- 开启日志聚集功能 -->
  <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
  </property>
  <!-- 设置日志聚集服务器地址 -->
  <property>  
    <name>yarn.log.server.url</name>  
    <value>http://hadoop104:19888/jobhistory/logs</value>
  </property>
  <!-- 设置日志保留时间为7天 -->
  <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
  </property>

    <!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
    <property>
        <name>yarn.nodemanager.pmem-check-enabled</name>
        <value>false</value>
    </property>

    <!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</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>
    <property>
        <!--指定 mapreduce 作业运行在 yarn 上-->
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
	
<property>
  <name>yarn.app.mapreduce.am.env</name>
  <value>HADOOP_MAPRED_HOME=/home/bigdata/module/hadoop-3.2.3</value>
</property>
<property>
  <name>mapreduce.map.env</name>
  <value>HADOOP_MAPRED_HOME=/home/bigdata/module/hadoop-3.2.3</value>
</property>
<property>
  <name>mapreduce.reduce.env</name>
  <value>HADOOP_MAPRED_HOME=/home/bigdata/module/hadoop-3.2.3</value>
</property>
 
<!-- 历史服务器端地址 -->
  <property>
    <name>mapreduce.jobhistory.address</name>
    <value>hadoop104:10020</value>
  </property>
  <!-- 历史服务器web端地址 -->
  <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>hadoop104:19888</value>
  </property>
 
</configuration>

修改好上面的配置文件以后配置环境变量

sudo vim /etc/profile.d/my_env.sh
#HADOOP_HOME
export HADOOP_HOME=/home/bigdata/module/hadoop-3.2.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
source /etc/profile.d/my_env.sh

分发hadoop到其他机器,在namenode机器hadoop102执行

hdfs namenode -format

然后启动集群

集群启动脚本(hadoop.sh)

#!/bin/bash
if [ $# -lt 1 ]
then
    echo "No Args Input..."
    exit ;
fi
case $1 in
"start")
        echo " =================== 启动 hadoop集群 ==================="
 
        echo " --------------- 启动 hdfs ---------------"
        ssh hadoop102 "/home/bigdata/module/hadoop-3.2.3/sbin/start-dfs.sh"
        echo " --------------- 启动 yarn ---------------"
        ssh hadoop103 "/home/bigdata/module/hadoop-3.2.3/sbin/start-yarn.sh"
        echo " --------------- 启动 historyserver ---------------"
        ssh hadoop104 "/home/bigdata/module/hadoop-3.2.3/bin/mapred --daemon start historyserver"
;;
"stop")
        echo " =================== 关闭 hadoop集群 ==================="
 
        echo " --------------- 关闭 historyserver ---------------"
        ssh hadoop104 "/home/bigdata/module/hadoop-3.2.3/bin/mapred --daemon stop historyserver"
        echo " --------------- 关闭 yarn ---------------"
        ssh hadoop103 "/home/bigdata/module/hadoop-3.2.3/sbin/stop-yarn.sh"
        echo " --------------- 关闭 hdfs ---------------"
        ssh hadoop102 "/home/bigdata/module/hadoop-3.2.3/sbin/stop-dfs.sh"
;;
*)
    echo "Input Args Error..."
;;
esac

启动./hadoop.sh start

分别访问hadoop102:9870,hadoop103:8088看到上面的页面说明启动成功 

测试集群

官方WordCount

mkdir wcinput
cd wcinput
vim word.txt
hadoop yarn
hadoop mapreduce

然后将创建的文件上传到hdfs

hadoop dfs -put wcinput/ /

进入hadoop目录执行

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.3.jar wordcount /wcinput /wcoutput

 

看到上面的结果说明hadoop集群搭建成功! 现在开始我们下一阶段的学习,第一阶段完结 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

工作变成艺术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值