Hadoop

一、大数据

大数据:对大量数据进行收集、处理并产生结果的一种技术统称

为什么使用大数据技术:数据分析的实时性越来越强,数据结果的应用越来越广泛

数据来源:可能来自任何方面

大数据应用:广告、金融、安全、社交、电商等

大数据技术实现

①仅批处理框架:

处理历史性数,Apache MapReduce

②仅流处理框架:

处理实时性数据,Apache samzaApache storm

③混合处理框架:

既有批处理也有流处理,Apache flinkApache spark

二、Hadoop

高性能计算框架

Hadoop是一个由Apache基金会所开发开源的分布式大数据处理框架

Hadoop集群中每台计算机都提供本地计算和存储

Hadoop集群不是依靠硬件来提供高可用性

基于Hadoop框架用户可以在不了解分布式底层细节的情况下,开发分布式程序,充分利用集群的威力进行高速运算和存储

官方网站:http://hadoop.apache.org/

官方文档:https://hadoop.apache.org/docs/stable/

核心项目

  • Hadoop (HDFS):分布式文件系统,可提供对应用程序数据的高吞吐量访问
  • Hadoop YARN:作业调度和集群资源管理的框架
  • Hadoop MapReduce :基于YARN的系统,用于并行处理大型数据集

相关项目:

  • Hadoop Common:支持其他Hadoop模块的常用实用程序
  • Hadoop Ozone:对象存储
  • Ambari :于Web的工具,用于配置,管理和监控Apache Hadoop集群
  • HBase:可扩展的分布式数据库,支持大型表的结构化数据存储
  • Hive:提供数据汇总和即时查询
  • Spark:用于Hadoop数据的快速通用计算引擎
  • ZooKeeper:用于分布式应用程序的高性能协调服务

三、Hadoop 核心组件

HDFS

Hadoop Distributed File System,Hadoop 分布式文件系统

HDFS是一个高度容错性的系统,它提供吞吐量的数据访问,适合有着超大数据集的应用程序,可以部署在廉价的机器上

1.特点:

支持TB级大文件存储

支持文件分块存储(提高读取效率)

支持一次写入,多次读取,顺序读取(流式数据访问)

支持廉价硬件

支持硬件故障数据保护(副本机制)

2.相关内容:

Block:

最基本的存储单位;将文件进行分块处理,通常是128M/块,例如: 256M文件会被分为2个Block。

PS: Hadoop 1.x版本,Block默认大小为64M; Hadoop 2.x,Block默认大小为128M

NameNode

用于保存整个文件系统的目录信息、文件信息及分块信息,一般有两台机器组成(主备)

用于接收用户的操作请求,维护文件系统的目录结构,管理文件和BlockblockDataNode之间的映射

DataNode

用于存储Block块文件

文件被分成块存储到DataNode的磁盘上,每个Block可以设置多个副本

MapReduce

编程模型,对数据进行并行计算

Map:用于执行分配的任务

Reduce:用于汇总任务结果

YARM

任务调度和资源分配

四、部署

1.单机部署

官网下载:https://hadoop.apache.org/releases.html

tar -xf jdk-8u191-linux-x64.tar.gz -C /usr/local/
tar -xf hadoop-2.8.5.tar.gz -C /usr/local/

添加环境变量

#vim /etc/profile.d/hadoop.sh
export JAVA_HOME=/usr/local/jdk1.8.0_191
export HADOOP_HOME=/usr/local/hadoop-2.8.5
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

#source  /etc/profile

测试(统计词频)

mkdir /tmp/input
#添加测试数据
vim /tmp/input/1.txt
vim /tmp/input/2.txt
#测试
hadoop jar /usr/local/hadoop-2.8.5/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar wordcount /tmp/input/ /tmp/output/result
#查看测试结果
[root@hadooplocalhost ~]# ls /tmp/output/result/
part-r-00000  _SUCCESS

2.伪分布式部署

第一步:安装JDKHadoop

第二步:修改环境配置文件

cd  /usr/local/hadoop/etc/hadoop/
vim hadoop-env.sh
vim mapred-env.sh
vim yarn-env
#每个文件中添加下边内容
export JAVA_HOME=/usr/local/jdk1.8.0_191

第三步:配置core-site.xml

# vim /usr/local/hadoop/etc/hadoop/core-site.xml
...
<configuration>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/opt/data/tmp</value>
        </property>
        <property>
                <name>fs.default.name</name>
                <value>hdfs://hd1:8020</value>
        </property>
</configuration>

hadoop.tmp.dir:指定临时数据存储目录

注意:配置前需要配置/etc/hosts

第四步:配置hdfs-site.xml

# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
... 
<property>
       <name>dfs.replication</name>
       <value>1</value>
</property>

注意:dfs.replication 设置为1指的是保存一份,要想保存一份副本需要设置为2

第五步:格式化hdfs

hdfs namenode -format

格式化是对HDFS这个分布式文件系统中的DataNode进行分块,统计所有分块后的初始元数据的存储在NameNode中。

格式化后,查看core-site.xmlhadoop.tmp.dir指定的目录下是否有了dfs目录,如果有,说明格式化成功。

[root@hd1 hadoop]# ls /opt/data/tmp/dfs/name/current/
fsimage_0000000000000000000  fsimage_0000000000000000000.md5  seen_txid  VERSION

第六步:启动

#启动 namenode
hadoop-daemon.sh start namenode
#启动 datanode
hadoop-daemon.sh start datanode
#检测是否启动成功
jps
ss -naltp|grep 8020

注意:若启动失败则查看日志 /usr/local/hadoop/logs/*

(1)HDFS测试

#1.创建目录
hdfs dfs -mkdir /test
#2.查看目录
hdfs dfs -ls /
#3.上传文件
hdfs dfs -put /tmp/1.txt /test
#4.查看文件
hdfs dfs -cat /test/1.txt
#5.下载文件
hdfs dfs -get /test/1.txt /tmp/1.new.txt
#6.删除文件
 hdfs dfs -rm /test/1.txt

(2)配置yarn

配置mapred-site.xml

#cd /usr/local/hadoop/etc/hadoop/
#cp  mapred-site.xml.template mapred-site.xml
#vim mapred-site.xml
...
<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
</configuration>

配置 yarn-site.xml

#cd /usr/local/hadoop/etc/hadoop/
#vim  yarn-site.xml
...
<configuration>
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>hd1</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
</configuration>

yarn.resourcemanager.hostname :指定resourcemanager运行在哪台机器上

yarn.nodemanager.aux-services:配置了yarn的默认混洗方式

(3)yarn启动、测试、关闭

  • 启动
#启动 resourcemanager
yarn-daemon.sh start resourcemanager
#启动 nodemanager
yarn-daemon.sh start nodemanager
#检测是否启动成功
jps
ss -naltp|grep 8088

YARN的Web页面 : http://192.168.122.200:8088/cluster

  • 测试

统计词频

#第一步:创建测试文件
mkdir /tmp/input
vim /tmp/input/1.txt
vim /tmp/input/2.txt
#第二步:上传测试文件
hdfs dfs -mkdir -p /test/input
hdfs dfs -put /tmp/input/* /test/input
hdfs dfs -ls /test/input
#第三步:运行实例
yarn jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar wordcount /test/input /test/output
#第四步:查看结果
hdfs dfs -ls /test/output
hdfs dfs -cat /test/output/part-r-00000
  • 停止hadoop
hadoop-daemon.sh stop namenode
hadoop-daemon.sh stop datanode
yarn-daemon.sh stop resourcemanager
yarn-daemon.sh stop nodemanager

五、Zookeeper

ZooKeeper 是为分布式应用程序提供高性能协调服务的工具集合,译名为“动物园管理员”。

它主要用来解决分布式应用中经常遇到的数据管理问题,如集群管理、统一命名服务、分布式配置管理、分布式消息队列、分布式锁、分布式协调等。

zookeeper也需要配置集群,最少3个节点(用于投票选举)

ZooKeeper集群角色

角色描述
领导者(leader)leader负责投票的发起和决议,更新状态等
跟随者(follower)用于接收请求并向客户端返回结果,选举过程中参与投票
观察者(observer)可以接收客户端请求,但写请求转给leader.不参与投票。
observer主要是为了扩展与提高读取速度

zookeeper选举

zookeeper选举leader与follower的三个核心原则:

  1. 超过半数票数的集群节点OK,集群才正常
  2. 集群正常工作之前,id小的给id大的投票,直接选举出leader
  3. 选出leader后,其它节点都会变为follower,id更大的节点再启动也是follower

zookeerp实现HA切换原理

在hadoop集群中通过zookeeper进行协调选举,确保只有一个活跃的NameNode。

一旦主(Active)宕掉,standby会切换成Active。

六、完全分布式部署

0.实现的内容:

NameNode HA 主从

ResourceManager HA 主从

③2台Namenode ;3台DataNode ;2台ResourceManager

1.环境准备及规划

NameIPSoftwareMark
hd1192.168.122.11JDK
Hadoop
NameNode
DFSZKFailoverController
hd2192.168.122.12JDK<br/>Hadoop<br/>NameNode<br/>DFSZKFailoverController
hd3192.168.122.13JDK<br/>Hadoop<br/>ResourceManager
hd4192.168.122.14JDK<br/>Hadoop<br/>ResourceManager
hd5192.168.122.15JDK<br/>Hadoop<br/>ZookeeperDataNode
NodeManger<br/>JournalNode<br/>QuorumPeerMain
hd6192.168.122.16JDK<br/>Hadoop<br/>ZookeeperDataNode<br/>NodeManger<br/>JournalNode<br/>QuorumPeerMain
hd7192.168.122.17JDK<br/>Hadoop<br/>ZookeeperDataNode<br/>NodeManger<br/>JournalNode<br/>QuorumPeerMain

2.安装前准备

注意:所有机器

#1.同步时间
ntpdate time1.aliyun.com
#2.配置hosts文件
vim /etc/hosts

192.168.122.11 hd1   
192.168.122.12 hd2
192.168.122.13 hd3
192.168.122.14 hd4
192.168.122.15 hd5
192.168.122.16 hd6
192.168.122.17 hd7
#3.关闭防火墙
#4.关闭Selinux

安装依赖:

yum -y install psmisc 

3.配置免密

注意:每台机器之间,一台机器上修改然后拷贝到其他机器

ssh-keygen
cp id_rsa.pub authorized_keys
for i in {1..7};do scp -r /root/.ssh hd$i:/root;done

4.安装JDK

步骤:先上传JDK到一台机器,然后再scp到其他机器,再进行安装

#传JDK
for i in {2..7}; do scp /root/jdk-8u191-linux-x64.tar.gz hd$i:/root/; done
#每天机器安装JDK
for i in {1..7}; do ssh hd$i tar xf /root/jdk-8u191-linux-x64.tar.gz -C /usr/local; done

配置环境变量(每台机器)

# vim /etc/profile

export JAVA_HOME=/usr/local/jdk1.8.0_191
export ZOOKEEPER_HOME=/usr/local/zookeeper
export HADOOP_HOME=/usr/local/hadoop
export PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

#source /etc/profile

5.安装Zookeeper

下载地址:https://www-eu.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz

每台机器【hd5,hd6,hd7】)

#scp /soft/hadoop/zookeeper-3.4.14.tar.gz 192.168.122.15:/root
#上传 Zookeeper 到 192.168.122.15
#1.安装
tar -xf zookeeper-3.4.14.tar.gz
mv zookeeper-3.4.14 /usr/local/zookeeper
cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg

#2.修改配置文件
vim /usr/local/zookeeper/conf/zoo.cfg

dataDir=/opt/data
server.1=hd5:2888:3888
server.2=hd6:2888:3888
server.3=hd7:2888:3888
#3.创建数据目录
mkdir /opt/data    
#4.创建ID
[root@hd5 ~]# echo 1 > /opt/data/myid
[root@hd6 ~]# echo 2 > /opt/data/myid
[root@hd7 ~]# echo 3 > /opt/data/myid

验证

#启动
zkServer.sh start
#查看状态
zkServer.sh status
#停止
zkServer.sh stop
#查看是否启动成功
ss -naltp|grep -E '2888|3888'
# 2888端口:follower连接到leader机器的端口
# 3888端口:leader选举端口

6.安装Hadoop

步骤:先在一台机器上安装,然后拷贝到其他机器

[root@hd1 ~]# tar -xf hadoop-2.8.5.tar.gz
[root@hd1 ~]# mv hadoop-2.8.5 /usr/local/hadoop

(1)配置Hadoop

cd  /usr/local/hadoop/etc/hadoop/
vim hadoop-env.sh
vim mapred-env.sh
vim yarn-env
#每个文件中添加下边内容
export JAVA_HOME=/usr/local/jdk1.8.0_191
配置 core-site.xml
#vim core-site.xml

<configuration>
<!-- 指定hdfs的nameservice为ns1 -->
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://ns1</value>
</property>

<!-- 指定hadoop临时目录 -->
<property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/data/tmp</value>
</property>

<!-- 指定zookeeper地址 -->
<property>
    <name>ha.zookeeper.quorum</name>
    <value>hd5:2181,hd6:2181,hd7:2181</value>
</property>
</configuration>

配置hdfs-site.xml

# vim hdfs-site.xml

<configuration>

<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
<property>
    <name>dfs.nameservices</name>
    <value>ns1</value>
 </property>

<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
<property>
    <name>dfs.ha.namenodes.ns1</name>
    <value>nn1,nn2</value>
</property>

<!-- nn1的RPC通信地址,nn1与nn2通信用 -->
<property>
    <name>dfs.namenode.rpc-address.ns1.nn1</name>
    <value>hd1:9000</value>
</property>

<!-- nn1的http通信地址,给管理人员访问用 -->
<property>
    <name>dfs.namenode.http-address.ns1.nn1</name>
    <value>hd1:50070</value>
</property>


<!-- nn2的RPC通信地址,nn1与nn2通信用 -->
<property>
    <name>dfs.namenode.rpc-address.ns1.nn2</name>
    <value>hd2:9000</value>
</property>

<!-- nn2的http通信地址,给管理人员访问用 -->
<property>
    <name>dfs.namenode.http-address.ns1.nn2</name>
    <value>hd2:50070</value>
</property>


<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hd5:8485;hd6:8485;hd7:8485/ns1</value>
</property>

<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/opt/data/journal</value>
</property>

<!-- 开启NameNode失败自动切换 -->
<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>

<!-- 配置失败自动切换实现方式,调用了一个java的功能 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

<!-- 配置隔离机制,sshfence简单来说就是当一台namenode有问题,ssh连上去将其fence掉 -->
<property>
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
</property>

<!-- 使用隔离机制时需要ssh免登陆 -->
<property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
</property>

</configuration>
配置 slaves

slaves用于记录datanode节点

#vim slaves
 
hd5
hd6
hd7
配置mapred-site.xml
#cp mapred-site.xml.template mapred-site.xml
#vim mapred-site.xml

<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
</configuration>
配置yarn-site.xml
#vim yarn-site.xml

<configuration>

<!-- 打开resourcemanager的HA特性 -->
<property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
</property>

<!-- 设置resourcemanager的集群名 -->
<property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yarncluster</value>
</property>

<!-- 设置resourcemanager集群由rm1和rm2组成 -->
<property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
</property>

<!-- 设置rm1主机名为hd3 -->
<property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hd3</value>
</property>

<!-- 设置rm1主机名为hd4 -->
<property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hd4</value>
</property>

<!-- 设置rm1的web访问地址 -->
<property>
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>hd3:8088</value>
</property>

<!-- 设置rm2的web访问地址 -->
<property>
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>hd4:8088</value>
</property>

<!-- 设置管理rm集群的zk地址 -->
<property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>hd5:2181,hd6:2181,hd7:2181</value>
</property>

<!-- 指定nodemanager启动时加载server的方式为shuffle server -->
<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
</property>

</configuration>

(2)同步Hadoop到所有节点

for i in {2..7}; do scp -r /usr/local/hadoop/ hd$i:/usr/local/; done

(3)启动

第一次启动前需要格式化

#格式化hdfs
[root@hd1 ~]# hdfs namenode -format
[root@hd2 ~]# mkdir /opt/data
[root@hd1 ~]# scp -r /opt/data/tmp/  hd2:/opt/data/tmp/
#格式化zk
[root@hd1 ~]# hdfs zkfc -formatZK

启动

#1.启动Zookeeper
[root@hd5 ~]# zkServer.sh start
[root@hd6 ~]# zkServer.sh start
[root@hd7 ~]# zkServer.sh start
#2.启动 journalnode
[root@hd1 ~]# hadoop-daemons.sh start journalnode
#3.启动 dfs
[root@hd1 ~]# start-dfs.sh
#4.启动 rs
[root@hd3 ~]# start-yarn.sh
[root@hd4 ~]# start-yarn.sh

验证进程

7.测试

(1)查看状态

http://hd1:50070 查看NameNode状态

http://hd2:50070 查看NameNode状态

http://hd3:8088 查看yarn状态

(2)测试hdfsmapreduce

统计词频

#1.创建测试文件,并添加测试数据
vim test.txt

#2.创建放测试文件的目录
hdfs dfs -mkdir /input
#3.上传测试文件
hdfs dfs -put test.txt /input
#4.测试
yarn jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar wordcount /input /output/00
#5.查看结果
hdfs dfs -cat /output/00/part-r-00000

(3)测试namenode高可用

主NamdeNode的进程杀掉,然后查看状态是否切换;或者直接重启系统做测试

 hdfs haadmin -getServiceState nn1
 hdfs haadmin -getServiceState nn2

(4)测试resourcemanager高可用

主resourcemanager的进程杀掉,然后查看状态是否切换;或者直接重启系统做测试

yarn rmadmin -getServiceState rm1
yarn rmadmin -getServiceState rm2

8.关闭服务

#1.在一台NameNode上
stop-dfs.sh
#2.在所有ResourceManager上
stop-yarn.sh
#3.在所有Zookeeper上
zKServer.sh stop
Last modification:November 20th, 2019 at 10:48 pm