Hadoop概述与配置

Hadoop概述

Hadoop起源

Google三篇论文

GFS->HDFS

MapReduce->MR<stype>

BigTable->HBase

Hadoop三大发行版本

Apache Hadoop

官网地址:http://hadoop.apache.org/releases.html

下载地址:https://archive.apache.org/dist/hadoop/common/

Cloudera Hadoop

官网地址:https://www.cloudera.com/downloads/cdh/5-10-0.html

下载地址:http://archive-primary.cloudera.com/cdh5/cdh/5/

Hortonworks Hadoop

官网地址:https://hortonworks.com/products/data-center/hdp/

下载地址:https://hortonworks.com/downloads/#data-platform

 

Hadoop的优势

1、高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失。

2、高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点。

3、高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务的处理速度。

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

 

Hadoop模块组成

新版本新增Ozone

 

Hadoop各模块架构

Hadoop Distributed File System

HDFS架构

1、NameNode:存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等。

2、DataNode:在本地文件系统存储文件块数据,以及块数据的校验和。

3、Secondary NameNode:每隔一段时间对NameNode元数据备份。

 

YARN架构

1、Client:提交作业

2、ResourceManager

1)处理客户端请求

2)监控NodeManager

3)启动或监控ApplicationMaster

4)资源的分配和调度

3、NodeManager

1)管理单个节点上的资源

2)处理来自ResourceManager的命令

3)处理来自ApplicationMaster的命令

4、ApplicationMaster

1)负责数据的切分

2)为应用程序申请资源并分配给内部任务

3)任务的监控和容错

5、Container:

容器,表示一个抽象资源,封装了某个节点的多维度资源,如内存、cpu、磁盘、网络等。

 

MapReduce架构

MapReduce将计算过程分为两个阶段:Map和Reduce

1)Map阶段并行处理输入数据

2)Reduce阶段对Map结果进行汇总

 

Linux脚本

SSH免密登录

公私钥生成后放在~/.ssh里面id_rsa&id_rsa.pub,该目录中authorized_keys文件中存放的是别的节点发过来的公钥。

# -t 选择编解码格式
ssh-keygen -t rsa

# 发送公钥至对应节点
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104

 

分发脚本

前提:配置好ssh免密登录

#!/bin/bash
#判断参数数量
if [ $# -lt 1 ]
then
echo Not Enough Agrument!
exit;
fi
#遍历集群中所有节点
for host in hadoop102 hadoop103 hadoop104
do
echo ================$host================
#遍历目录
for file in $@
do
if [ -e $file ]
then
#获取文件真实目录(-P 进入物理目录)
pdir=$(cd -P $(dirname $file); pwd)
#获取文件名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file is not exists!
fi
done
done

 

集群状态脚本

#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo ============$host============
ssh $host jps
done

 

群起集群脚本

#!/bin/bash
if [ $# -ne 1 ]
then
echo "args number error"
exit
fi
case $1 in
"start")
ssh hadoop102 $HADOOP_HOME/sbin/start-dfs.sh
ssh hadoop103 $HADOOP_HOME/sbin/start-yarn.sh
;;
"stop")
ssh hadoop102 $HADOOP_HOME/sbin/stop-dfs.sh
ssh hadoop103 $HADOOP_HOME/sbin/stop-yarn.sh
;;
*)
echo "args info error!"
;;
esac

 

Hadoop集群

集群配置

集群部署规划

 Hadoop102Hadoop103Hadoop104
HDFS NameNode DataNode DataNode SecondaryNameNode Datanode
YARN NodeManager ResourceManager NodeManager NodeManager

配置Linux环境

1)配置hostname

vim /etc/hostname
#重启服务器
reboot

2)配置hosts

vim /etc/hosts

3)配置静态ip

vim /etc/sysconfig/network-scripts/ifcfg-ens33(网卡)
#修改下面两个
#[none|static|bootp|dhcp](引导时不使用协议|静态分配IP|BOOTP协议|DHCP协议)
BOOTPROTO=static
ONBOOT=yes
添加下面的内容    
#IP地址
IPADDR=192.168.1.102
#网关  
GATEWAY=192.168.1.2
#域名解析器
DNS1=114.114.114.114
DNS2=8.8.8.8

#重启网络服务
systemctl restart network
#测试网络连接
ping www.baidu.com

 

配置核心配置文件

cd $HADOOP_HOME/etc/hadoop

配置core-site.xml
<configuration>
<!--指定HDFS中NameNode的地址 -->
   <property>
       <name>fs.defaultFS</name>
       <value>hdfs://hadoop102:9820</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
   <property>
       <name>hadoop.tmp.dir</name>
       <value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 通过web界面操作hdfs的权限 -->
<property>
       <name>hadoop.http.staticuser.user</name>
       <value>atguigu</value>
</property>
<!-- 后面hive的兼容性配置 -->
   <property>
       <name>hadoop.proxyuser.atguigu.hosts</name>
       <value>*</value>
   </property>
   <property>
       <name>hadoop.proxyuser.atguigu.groups</name>
       <value>*</value>
</property>
</configuration>
配置hdfs-site.xml
<configuration>
   <property>
       <name>dfs.namenode.secondary.http-address</name>
       <value>hadoop104:9868</value>
   </property>
</configuration>
配置yarn-site.xml
<configuration>
<!-- Reducer获取数据的方式-->
   <property>
       <name>yarn.nodemanager.aux-services</name>
       <value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址-->
   <property>
       <name>yarn.resourcemanager.hostname</name>
       <value>hadoop103</value>
</property>
<!-- 环境变量通过从NodeManagers的容器继承的环境属性,对于mapreduce应用程序,除了默认值 hadoop op_mapred_home应该被添加外。属性值 还有如下-->
   <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>
<!-- 解决Yarn在执行程序遇到超出虚拟内存限制,Container被kill -->
   <property>
       <name>yarn.nodemanager.pmem-check-enabled</name>
       <value>false</value>
   </property>
   <property>
       <name>yarn.nodemanager.vmem-check-enabled</name>
       <value>false</value>
   </property>
<!-- 后面hive的兼容性配置 -->
   <property>
       <name>yarn.scheduler.minimum-allocation-mb</name>
       <value>512</value>
   </property>
   <property>
       <name>yarn.scheduler.maximum-allocation-mb</name>
       <value>4096</value>
   </property>
   <property>
       <name>yarn.nodemanager.resource.memory-mb</name>
       <value>4096</value>
</property>
</configuration>
配置mapred-site.xml
<configuration>
<!-- 指定MR运行在Yarn上 -->
   <property>
       <name>mapreduce.framework.name</name>
       <value>yarn</value>
   </property>
</configuration>
注意

配置好后通过分发脚本分发配置文件 xsync ./

 

配置集群

配置workers

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

增加如下内容:

hadoop102

hadoop103

hadoop104

同步workers

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

 

启动集群
集群初始化

注意:如果是第一次启动集群,需要在NameNode所在节点格式化,格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后在删除data和logs数据。

#格式化namenode
hdfs namenode -format
#启动HDFS
sbin/start-dfs.sh
#启动YARN(注意:要在配置了ResourceManager的节点启动YARN)
sbin/start-yarn.sh

 

集群启动失败

哪个服务没开启,就查看/opt/module/hadoop-3.1.3/data文件夹中的对应日志文件。

集群ID不一致错误(重复格式化namenode造成)

查看集群ID(可以不做)

cat /opt/module/hadoop-3.1.3/data/dfs/data/current/VERSION

cat /opt/module/hadoop-3.1.3/data/dfs/name/current/VERSION

停止集群服务

#需要删除所有节点中的对应文件,可以写一个脚本运行

删除$HADOOP_HOME/data

删除$HADOOP_HOME/logs

删除/tmp/*

删除脚本

#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
ssh $host rm -rf $HADOOP_HOME/data $HADOOP_HOME/logs
ssh $host sudo rm -rf /tmp/*
done

 

各模块端口号

模块Web端口号程序端口号
HDFS (NameNode) 9870 9820
Secondary NameNode 9868  
DataNode 9864 9866
Yarn 8088 8032
历史服务器 (在NameNode配置) 19888 10020
     

 

集群启动和停止

1)各模块单独启动停止

单独启动停止hdfs单个组件

hdfs --daemon start xxx
hdfs --daemon stop xxx

单独启动停止yarn单个组件

yarn --daemon start xxx
yarn --daemon stop xxx

2)整体启动停止

整体启动停止hdfs

start-dfs.sh
stop-dfs.sh

整体启动停止yarn

start-yarn.sh
stop-yarn.sh

补充:集群有时网络出现错误,可能是NetworkManager与Network冲突,停止NetworkManager。

配置历史服务器

1)配置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>

2)分发配置

xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml

3)启动历史服务器(NameNode节点)

mapred --daemon start historyserver

4)查看服务是否启动

jps

5)查看历史服务器web

http://hadoop102:19888/jobhistory

 

配置日志聚集

1)配置yarn-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)分发配置

xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml

3)关闭NodeManager、ResourceManager、HistoryServer

(在ResourceManager所在节点)stop-yarn.sh
(在NameNode所在节点)mapred --daemon stop historyserver

4)启动NodeManager、ResourceManager、HistoryServer和Timelineserver

(在ResourceManager所在节点)start-yarn.sh
(在ResourceManager所在节点)yarn --daemon start timelineserver
(在NameNode所在节点)mapred --daemon start historyserver

 

配置集群时间同步

1)关闭ntp服务和自启动

sudo systemctl stop ntpd
sudo systemctl disable ntpd

2)修改ntp配置文件

sudo vim /etc/ntp.conf

3)修改如下配置

1)授权192.168.1.0-192.168.1.255网段上的所有机器可以从这台机器上查询和同步时间
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
改为
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

2)集群在局域网中,不使用其他互联网上的时间
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
改为
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst

3)当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步
添加
server 127.127.1.0
fudge 127.127.1.0 stratum 10

4)修改ntpd文件

sudo vim /etc/sysconfig/ntpd

5)修改如下配置

添加
#让硬件时间与系统时间一起同步
SYNC_HWCLOCK=yes

6)重启ntpd服务与设置开机自启

systemctl start ntpd
systemctl enable ntpd

7)在其他机器配置

#在其他机器配置10分钟与时间服务器同步一次
sudo crontab -e
#编写定时任务
*/10 * * * * /usr/sbin/ntpdate hadoop102
#修改任意机器时间
date -s "2017-9-11 11:11:11"
#十分钟后查看机器是否与时间服务器同步
date

#或者手动同步时间
/usr/sbin/ntpdate hadoop102
原文地址:https://www.cnblogs.com/BookMiki/p/15003444.html