Hadoop的安装和使用

Hadoop的安装和使用

本文是基于CentOS 7.3系统环境,进行Hadoop的安装和使用

  • CentOS 7.3
  • hadoop-2.7.2

一、Hadoop简介

(1) 什么是Hadoop

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。

(2) Hadoop的优势

  • 高可靠性
    Hadoop底层维护多个数据副本,所有即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失
  • 高扩展性
    在集群间分配任务数据,可方便的扩展数以千计的节点
  • 高效性
    在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度
  • 高容错性
    能够自动将失败的任务进行重新分配

(3) Hadoop版本区别

在Hadoop1.x时代,Hadoop中的MapReduce同时处理业务逻辑计算和资源的调度,耦合性较大,在Hadoop2.x时代,增加了Yarn。Yarn只负责资源的调度,MapReduce只负责计算。

Hadoop1.xHadoop2.x
MapReduce(计算+资源调度)MapReduce(计算)
Yarn(资源调度)
HDFS(数据存储)HDFS(数据存储)
Common(辅助工具)Common(计算+资源调度)

(3) HDFS的架构概述

  • NameNode
    存储文件的元数据,如文件名,文件目录结构,文件属性(创建时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等
  • DataNode
    在本地文件系统存储文件块数据,以及块数据的校验和
  • Secondary NameNode
    用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照

(4) Yarn的架构概述

  • Resource Manager
  1. 处理客户端的请求
  2. 监控Node Manager
  3. 启动或监控ApplicationMaster
  4. 资源的分配与调度
  • Node Manager
  1. 管理单个节点上的资源
  2. 处理来自Resource Manager的命令
  3. 处理来自ApplicationMaster的命令
  • Application Masterr
  1. 负责数据的切分
  2. 为应用程序申请资源并分配给内部的任务
  3. 任务的监控与容错
  • Container
  1. Container是Yarn中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等

二、Hadoop安装

(1) 集群配置

hostnameCPU内存硬盘IP地址
hadoop10024G100G192.168.1.100
hadoop10124G100G192.168.1.101
hadoop10224G100G192.168.1.102

(2) 关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

(3) 创建用户

useradd xuzheng
passwd xuzheng

(4) 授予用户root权限

# 修改文件为可写权限
sudo chmod 640 /etc/sudoers
vi /etc/sudoers
# 添加一行
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
xuzheng ALL=(ALL)       ALL

(5) 重启机器

shutdown -r now

(6) 新建目录

cd /opt
mkdir module 
mkdir software
chown -R xuzheng:xuzheng module/
chown -R xuzheng:xuzheng software/

(7) 安装jdk

tar -xzvf jdk-8u201-linux-x64.tar.gz -C /opt/module/
vi /etc/profile
# 添加下面内容
export JAVA_HOME=/opt/module/jdk1.8.0_201
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
# 使配置文件生效
source /etc/profile

(8) 安装hadoop

tar -xzvf hadoop-2.7.2.tar.gz -C /opt/module/
vi /etc/profile
# 添加下面内容
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# 使配置文件生效
source /etc/profile

三、本地运行模式

(1) grep实例

创建在hadoop-2.7.2文件下面创建一个input文件夹

mkdir input

准备数据:将Hadoop的xml配置文件复制到input

cp etc/hadoop/*.xml input

执行share目录下的MapReduce程序

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'dfs[a-z.]+'

查看输出结果

cat output/part-r-00000

(2) Word Count实例

创建在hadoop-2.7.2文件下面创建一个wcinput文件夹

mkdir wcinput

在wcinput文件下创建一个wc.input文件

cd wcinput
vi wc.input
# 添加下面内容
hadoop yarn
hadoop mapreduce
inspur
inspur

执行share目录下的MapReduce程序

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

查看输出结果

cat output/part-r-00000

四、伪分布式模式

(1) 配置hadoop-env.sh

vi etc/hadoop/hadoop-env.sh
# 添加下面内容
# The java implementation to use.
export JAVA_HOME=/opt/module/jdk1.8.0_201

(2) 配置core-site.xml

vi etc/hadoop/core-site.xml
# 添加下面内容
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop100:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-2.7.2/data/tmp</value>
    </property>
</configuration>

(3) 配置hdfs-site.xml

vi etc/hadoop/hdfs-site.xml
# 添加下面内容
<configuration>
    <property>
		<name>dfs.replication</name>
		<value>1</value>
	</property>
</configuration>

(4) 启动集群

# 格式化NameNode(第一次启动时格式化,以后不用)
# 如果再次重启NameNode会导致namenode和datanode的集群CID不同,因此无法启动datanode
hdfs namenode -format
# 启动NameNode
sbin/hadoop-daemon.sh start namenode
# 启动DataNode
sbin/hadoop-daemon.sh start datanode
# 启动DataNode
sbin/hadoop-daemon.sh start secondarynamenode

(5) 访问hdfs管理页面

http://192.168.1.100:50075

(6) 如何重启NameNode

cd /opt/module/hadoop-2.7.2
# 先停止datanode服务
sbin/hadoop-daemon.sh stop datanode
# 再停止namenode服务
sbin/hadoop-daemon.sh stop namenode
# 再删除data和logs目录
rm -rf data/ logs/
# 格式化NameNode
hdfs namenode -format

(7) hdfs操作命令

创建一个目录

bin/hdfs dfs -mkdir -p /user/xuzheng/input

上传一个文件

bin/hdfs dfs -put wcinput/wc.input /user/atguigu/input/

查看一个目录

bin/hdfs dfs -ls /user/xuzheng/input/

查看一个文件

bin/hdfs dfs -cat  /user/xuzheng/ input/wc.input

运行一个MapReduce程序

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/xuzheng/input/ /user/xuzheng/output

查看结果

hdfs dfs -cat /user/xuzheng/output/*

下载文件

hdfs dfs -get /user/xuzheng/output/part-r-00000 ./wcoutput/

删除目录

hdfs dfs -rm -r /user/xuzheng/output

(8) 配置yarn-env.sh

vi etc/hadoop/yarn-env.sh
# 添加下面内容
export JAVA_HOME=/opt/module/jdk1.8.0_201

(9) 配置yarn-site.xml

vi etc/hadoop/yarn-site.xml
# 添加下面内容
<configuration>
    <property>
 		<name>yarn.nodemanager.aux-services</name>
 		<value>mapreduce_shuffle</value>
	</property>
	<!-- 指定YARN的ResourceManager的地址 -->
	<property>
		<name>yarn.resourcemanager.hostname</name>
		<value>hadoop100</value>
	</property>
</configuration>

(8) 配置mapred-env.sh

vi etc/hadoop/mapred-env.sh
# 添加下面内容
export JAVA_HOME=/opt/module/jdk1.8.0_201

(9) 配置mapred-site.xml

vi etc/hadoop/mapred-site.xml
# 添加下面内容
<configuration>
    <property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	</property>
</configuration>

(10) 启动YARN

# 必须保证NameNode和DataNode已经启动
# 启动ResourceManager
sbin/yarn-daemon.sh start resourcemanager
# 启动NodeManager
sbin/yarn-daemon.sh start nodemanager

(11) 访问yarn管理页面

http://192.168.1.100:8088/cluster

(12) 删除output目录

bin/hdfs dfs -rm -R /user/xuzheng/output

(13) 执行share目录下的MapReduce程序

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/xuzheng/input/wc.input  /user/xuzheng/output

(14) 查看输出结果

bin/hdfs dfs -cat /user/xuzheng/output/*

(15) 配置历史服务器

vi etc/hadoop/mapred-site.xml
# 添加下面内容
<configuration>
    <property>
		<name>mapreduce.jobhistory.address</name>
		<value>hadoop100:10020</value>
	</property>
	<!-- 历史服务器web端地址 -->
	<property>
    	<name>mapreduce.jobhistory.webapp.address</name>
    	<value>hadoop100:19888</value>
	</property>
</configuration>

(16) 启动历史服务器

sbin/mr-jobhistory-daemon.sh start historyserver

(17) 访问历史

点击【History】,需要提前配置hosts映射关系

192.168.1.100 hadoop100

(18) 开启日志聚集

vi yarn-site.xml
# 添加如下内容
<property>
	<name>yarn.log-aggregation-enable</name>
	<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
	<name>yarn.log-aggregation.retain-seconds</name>
	<value>604800</value>
</property>

(19) 关闭HistoryManager、NodeManager和ResourceManager

sbin/mr-jobhistory-daemon.sh stop historyserver
sbin/yarn-daemon.sh stop nodemanager
sbin/yarn-daemon.sh stop resourcemanager

(20) 启动HistoryManager、ResourceManager和NodeManager

sbin/mr-jobhistory-daemon.sh start historyserver
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager

(21) 测试

bin/hdfs dfs -rm -R /user/xuzheng/output
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/xuzheng/input /user/xuzheng/output

四、完全分布式模式

(1) 准备3台客户机

hostnameCPU内存硬盘IP地址
hadoop10024G100G192.168.1.100
hadoop10124G100G192.168.1.101
hadoop10224G100G192.168.1.102

(2) 关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

(3) 增加用户并授权

useradd xuzheng
passwd xuzheng
# 修改文件为可写权限
sudo chmod 640 /etc/sudoers
vi /etc/sudoers
# 添加一行
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
xuzheng ALL=(ALL)       ALL

(4) 修改主机名称

hostnamectl --static set-hostname hadoop101
hostnamectl --static set-hostname hadoop102
hostnamectl --static set-hostname hadoop103

(5) 安装jdk和hadoop

tar -xzvf jdk-8u201-linux-x64.tar.gz -C /opt/module/
tar -xzvf hadoop-2.7.2.tar.gz -C /opt/module/

(6) 配置环境变量

vi /etc/profile
# 添加下面内容
export JAVA_HOME=/opt/module/jdk1.8.0_201
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# 使配置文件生效
source /etc/profile

(7) 集群规划

hadoop101hadoop102hadoop103
HDFSNameNode DataNodeDataNodeSecondaryNameNode DataNode
YARNNodeManagerResourceManager NodeManagerNodeManager

(8) 集群配置

配置core-site.xml

vi etc/hadoop/core-site.xml
# 添加下面内容
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop101:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-2.7.2/data/tmp</value>
    </property>
</configuration>

配置hadoop-env.sh

vi etc/hadoop/hadoop-env.sh
# 添加下面内容
# The java implementation to use.
export JAVA_HOME=/opt/module/jdk1.8.0_201

配置hdfs-site.xml

vi etc/hadoop/hdfs-site.xml
# 添加下面内容
<configuration>
    <property>
		<name>dfs.replication</name>
		<value>3</value>
	</property>
	<property>
		<name>dfs.namenode.secondary.http-address</name>
		<value>hadoop103:50090</value>
	</property>
</configuration>

配置yarn-env.sh

vi etc/hadoop/yarn-env.sh
# 添加下面内容
# The java implementation to use.
export JAVA_HOME=/opt/module/jdk1.8.0_201

配置yarn-site.xml

vi etc/hadoop/yarn-site.xml
# 添加下面内容
<configuration>
    <property>
 		<name>yarn.nodemanager.aux-services</name>
 		<value>mapreduce_shuffle</value>
	</property>
	<!-- 指定YARN的ResourceManager的地址 -->
	<property>
		<name>yarn.resourcemanager.hostname</name>
		<value>hadoop102</value>
	</property>
	<property>
		<name>yarn.log-aggregation-enable</name>
		<value>true</value>
	</property>
	<!-- 日志保留时间设置7天 -->
	<property>
		<name>yarn.log-aggregation.retain-seconds</name>
		<value>604800</value>
	</property>
</configuration>

配置mapred-site.xml

vi etc/hadoop/mapred-site.xml
# 添加下面内容
<configuration>
    <property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	</property>
	<property>
		<name>mapreduce.jobhistory.address</name>
		<value>hadoop101:10020</value>
	</property>
	<!-- 历史服务器web端地址 -->
	<property>
    	<name>mapreduce.jobhistory.webapp.address</name>
    	<value>hadoop101:19888</value>
	</property>
</configuration>

(9) 启动HDFS

在机器hadoop101上执行

# 格式化NameNode(第一次启动时格式化,以后不用)
# 如果再次重启NameNode会导致namenode和datanode的集群CID不同,因此无法启动datanode
hdfs namenode -format
# 启动NameNode
sbin/hadoop-daemon.sh start namenode
# 启动DataNode
sbin/hadoop-daemon.sh start datanode

在机器hadoop102和hadoop103上执行

# 启动DataNode
sbin/hadoop-daemon.sh start datanode

(10) ssh无密登录配置

在机器hadoop101、hadoop102和hadoop103上执行

ssh-keygen -t rsa

在机器hadoop101、hadoop102和hadoop103上执行

ssh-copy-id hadoop101
ssh-copy-id hadoop102
ssh-copy-id hadoop103

(11) 配置从节点

在机器hadoop101上执行

vi etc/hadoop/slaves
# 删除所有内容并添加
hadoop101
hadoop102
hadoop103

(12) 集群启动(ssh配置是前提)

在机器hadoop101上执行

vi etc/hadoop/slaves
# 删除所有内容并添加
hadoop101
hadoop102
hadoop103

将slaves文件同步至其他节点

/home/xuzheng/bin/xsync slaves

停止集群所有的服务

sbin/hadoop-daemon.sh stop namenode
sbin/hadoop-daemon.sh stop datanode

NameNode节点(hadoop101)

sbin/start-dfs.sh

ResourceManager节点(hadoop102)

sbin/start-yarn.sh

(13) 测试集群

在机器hadoop101上执行

hdfs dfs -rm -r /user/xuzheng/input
hdfs dfs -mkdir -p /user/xuzheng/input

(14) 集群时间同步

安装ntp

yum -y install net-tools # netstat
yum -y install ntp 

修改配置文件/etc/ntp.conf

vi /etc/ntp.conf
# 限制 192.168.1.0~192.168.255.255之间的服务器可以访问
restrict 192.168.1.0 mask 255.255.0.0 nomodify notrap

# 注释以下内容,因为集群在局域网中,所以不属于互联网其他时间
#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 127.127.1.0
fudge 127.127.1.0 stratum 10

修改配置文件/etc/sysconfig/ntpd

vi /etc/sysconfig/ntpd
#添加以下信息,硬件时间与系统时间同步
SYNC_HWCLOCK=yes

hadoop101节点上启动ntp

systemctl stop chronyd
systemctl disable chronyd
systemctl start ntpd
systemctl enable ntpd

其他节点上启动ntp

crontab -e
# 编写定时任务如下:
*/10 * * * * /usr/sbin/ntpdate hadoop101

(15) 配置机架感知

  1. 修改配置文件core-site.xml
<configuration>
        <property>
                <name>topology.script.file.name</name>
                <value>/opt/module/hadoop-2.7.2/etc/hadoop/topology.sh</value>
        </property>
</configuration>
  1. 新建topology.sh脚本
#!/bin/bash

HADOOP_CONF=/opt/module/hadoop-2.7.2/etc/hadoop
while [ $# -gt 0 ] ; do
        nodeArg=$1
        exec<${HADOOP_CONF}/topology.data
        result=""
        while read line ; do
                ar=( $line )
                if [ "${ar[0]}" = "$nodeArg" ]||[ "${ar[1]}" = "$nodeArg" ]; then
                        result="${ar[2]}"
                fi
        done
        shift
        if [ -z "$result" ] ; then
                echo -n "/default-rack"
        else
                echo -n "$result"
        fi
done
  1. 修改脚本权限
chmod a+x topology.sh
  1. 新建topology.data文件
192.168.20.101 hadoop101 /rack1
192.168.20.102 hadoop102 /rack2
192.168.20.103 hadoop103 /rack1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值