大数据学习系列:Hadoop3.0苦命学习(一)

传送门:
大数据学习系列:Hadoop3.0苦命学习(一)
大数据学习系列:Hadoop3.0苦命学习(二)
大数据学习系列:Hadoop3.0苦命学习(三)
大数据学习系列:Hadoop3.0苦命学习(四)
大数据学习系列:Hadoop3.0苦命学习(五)
大数据学习系列:Hadoop3.0苦命学习(六)
大数据学习系列:Hadoop3.0苦命学习(七)

内容包括:
(1)Hadoop的介绍
(2)集群环境搭建准备工作
(3)Linux命令和Shell脚本增强
(4)集群环境搭建

1 大数据概述

大数据:就是对海量数据进行分析处理,得到一些有价值的信息,然后帮助企业做出判断和决策。
处理流程:

  1. 获取数据
  2. 处理数据
  3. 展示结果

2 Hadoop介绍

Hadoop是一个分布式系基础框架,它允许使用简单的编程模型跨大型计算机的大型数据集进行分布式处理。
它主要解决两个问题:

  • 大数据存储问题: HDFS
  • 大数据计算问题:MapReduce

2.1 问题一: 大文件怎么存储?

假设一个文件非常非常大,大小为1PB, 大到世界上所有的高级计算机都存储不下, 怎么办?

在这里插入图片描述

  • 为了保存大文件, 需要把文件放在多个机器上
    • 文件要分块 block(128M)
    • 不同的块放在不同的 HDFS 节点
  • 同时为了对外提供统一的访问, 让外部可以像是访问本机一样访问分布式文件系统
    • 有一个统一的 HDFS Master
    • 它保存整个系统的文件信息
    • 所有的文件元数据的修改都从 Master 开始

2.2 问题二: 大数据怎么计算?

从一个网络日志文件中计算独立 IP, 以及其出现的次数
如果数据量特别大,我们可以将,整个任务拆开, 划分为比较小的任务, 从而进行计算呢。

在这里插入图片描述

2.3 问题三: 如何将这些计算任务跑在集群中?

如果能够在不同的节点上并行执行, 更有更大的提升, 如何把这些任务跑在集群中?

在这里插入图片描述
可以设置一个集群的管理者, 这个地方叫做 Yarn

  • 这个集群管理者有一个 Master, 用于接收和分配任务
  • 这个集群管理者有多个 Slave, 用于运行任务

2.4 Hadoop 的组成

  • Hadoop分布式文件系统(HDFS) 提供对应用程序数据的高吞吐量访问的分布式文件系统
  • Hadoop Common 其他Hadoop模块所需的Java库和实用程序。这些库提供文件系统和操作系统级抽象,并包含启动Hadoop所需的必要Java文件和脚本
  • Hadoop MapReduce 基于YARN的大型数据集并行处理系统
  • Hadoop YARN 作业调度和集群资源管理的框架

2 环境搭建

在 Hadoop 具体开始前, 先来搭建一下环境:

  1. 创建虚拟机
    1. 安装虚拟机 VMWare
    2. 创建虚拟机
    3. 安装 CentOS
    4. 组成集群
  2. 配置每台主机
    1. 关闭防火墙
    2. 关闭 SELinux
    3. 设置主机名
    4. 重启
    5. 设置时钟同步服务
    6. 配置用户权限
    7. 免密登录
  3. 安装辅助软件
    1. JDK
    2. Zookeeper
  4. 安装 Hadoop
    1. 下载并解压
    2. 修改配置
    3. 分发到每个节点
    4. 格式化 HDFS
    5. 启动集群

2.1 创建虚拟机

1:通过ISO镜像安装

2: 直接复制安装好的虚拟机
注意事项:windows系统确认所有的关于VmWare的服务都已经启动

在这里插入图片描述

确认好VmWare生成的网关地址,
在这里插入图片描述
另外确认VmNet8网卡已经配置好了IP地址。
在这里插入图片描述

  1. 网络模式
  2. 内存设置
  3. 规划集群, 创建多台虚拟机

2.2 网络模式详解

在这里插入图片描述
桥接

  • 把虚拟出来的网卡直接连接外部的路由器, 看起来就好像是网络中多出了一台真正的计算机一样
  • 从路由器来看, 虚拟机等同于局域网内其它的物理机
    在这里插入图片描述

NAT

  • 在宿主机中创建一个子网, 把虚拟机放入子网中, 子网中有一个NAT服务
    在这里插入图片描述

仅主机

  • 创建子网, 把虚拟机放入这个子网

2.3 内存设置

  • 需要三台虚拟机, 并且需要同时运行, 所以总体上的占用为: 每 台 虚 拟 机 内 存 × 3 每台虚拟机内存 \times 3 ×3
  • 在分配的时候, 需要在总内存大小的基础上, 减去1-2G作为系统内存, 剩余的除以3, 作为每台虚拟机的内存

每 台 机 器 的 内 存 = ( 总 内 存 − 4 ) ÷ 3 每台机器的内存 = \left ( 总内存 - 4\right ) \div 3 =(4)÷3

2.4 集群规划

IP主机名环境配置安装
192.168.188.100node01关防火墙和selinux, host映射, 时钟同步JDK, NameNode, ResourceManager, Zookeeper
192.168.188.110node02关防火墙和selinux, host映射, 时钟同步JDK, DataNode, NodeManager, Zeekeeper
192.168.188.120node03关防火墙和selinux, host映射, 时钟同步JDK, DataNode, NodeManager, Zeekeeper

2.5 设置网卡名

  1. ifconfig查看网卡名称为ens33,现在要将它修改成eth0
    在这里插入图片描述
  2. 编辑配置文件/etc/sysconfig/network-scripts/ifcfg-ens33
    在这里插入图片描述
  3. 重命名该配置文件
    cd /etc/sysconfig/network-scripts/
    mv ifcfg-ens33 ifcfg-eth0
  4. 编辑/etc/default/grub并加入net.ifnames=0 biosdevname=0

在这里插入图片描述
5. 运行命令grub2-mkconfig -o /boot/grub2/grub.cfg 来重新生成GRUB配置并更新内核参数
在这里插入图片描述
6. 使用reboot命令重启操作系统
7. 再次查看网卡名称
在这里插入图片描述

2.6 设置ip和Mac地址

  1. 更改mac地址:
    vim /etc/udev/rules.d/70-persistent-net.rules
    在这里插入图片描述
  2. 更改IP地址:
    vim /etc/sysconfig/network-scripts/ifcfg-eth0,更改内容同2.5
  3. 修改主机名(重启后永久生效)
    vi /ect/sysconfig/network,增加内容如下:
    在这里插入图片描述
  4. 设置ip和域名映射
    vim /etc/hosts,增加内容如下:

在这里插入图片描述
5. 执行reboot重启,并执行ping www.baidu.com看是否配置网络成功

在这里插入图片描述

3 Liux常用的命令

3.1 查找命令

grep命令 命令是一种强大的文本搜索工具

格式: grep [option] pattern [file] 可使用 —help 查看更多参数。 使用实例:

ps -ef | grep sshd 查找指定 ssh 服务进程
在这里插入图片描述

ps -ef | grep sshd | grep -v grep 查找指定服务进程,排除 gerp 本身
在这里插入图片描述

grep -n 'hello' a.txt 从文件中查找关键词,并显示行号

在这里插入图片描述


find命令

find 命令在目录结构中搜索文件,并对搜索结果执行指定的操作。
使用实例:
find . -name "*.log" -ls 在当前目录查找以.log 结尾的文件, 并显示详细信息。
在这里插入图片描述
find /root/ -perm 777 查找/root/目录下权限为 777 的文件
在这里插入图片描述

find . -size +100M 查找当前目录大于 100M 的文件

在这里插入图片描述


Locate命令

locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法
是先建立一个包括系统内所有档案名称及路径的数据库。之后当寻找时就只需查
询这个数据库( /var/lib/locatedb)。
Linux 系统自动创建这个数据库, 默认每天自动更新一次,所以使用 locate
命令查不到最新变动过的文件。为了避免这种情况,可以在使用 locate 之前,
先使用 updatedb 命令,手动更新数据库。
yum -y install mlocate
使用实例:
locate /etc/sh
搜索 etc 目录下所有以 sh 开头的文件
在这里插入图片描述
locate pwd
查找和 pwd 相关的所有文件
在这里插入图片描述

3.2 用户管理命令

添加普通用户

useradd hadoop # 这个就表示我们创建了一个普通用户
在这里插入图片描述

passwd hadoop # 表示我们需要给hadoop这个普通用户分配一个密码

在这里插入图片描述
切换用户:

su - 用户名

规则:(1)root用户到其他用户不需要输入密码,反之要输入;(2) " - "可以理解为切换用户的同时切换环境,而不加它仅仅切换用户。

3.3 用户权限管理命令

在这里插入图片描述
chmod 777 a.txt #表示给某个文件赋予所有人的所有权限

chmod u-x a.txt #取消a.txt文件,用户“执行”权限

chmod g+x a.txt #添加a.txt文件,组“执行”权限

chown -R hadoop:hadoop a.txt 改变某个文件或者文件夹的所属的用户以及用户组

3.4 系统服务命令

service iptables status #查看防火墙状态

service iptables stop #关闭防火墙

service --status-all # 查看系统所有的后台服务进程
service sshd status # 查看指定的后台服务进程的状态
service sshd stop
service sshd start
service sshd restart
配置后台服务进程的开机自启或关闭

chkconfig iptables on #配置防火墙开机开启

chkconfig iptables off #配置防火墙开机关闭
chkconfig httpd on ## 让 httpd 服务开机自启
chkconfig httpd off ## 让 httpd 服务开机不要自启


4 Linux的Shell编程

Shell 编程一般指 shell 脚本编程。

语法:

​ 使用 vi 编辑器新建一个文件 hello.sh

#!/bin/bash 
 echo "Hello World !" 

执行

​ 方式1:

​ sh hello.sh
在这里插入图片描述

方式2

​ chmod +x ./hello.sh #使脚本具有执行权限

​ ./hello.sh #执行脚本
在这里插入图片描述

4.1 变量

局部变量

#!/bin/bash
str="hello"
echo ${str}world

在这里插入图片描述
环境变量
可以自己设置新的环境变量,通过export key=value完成设置。
在这里插入图片描述
之后,先通过source /etc/profile使生效,再通过env命令查询所有环境变量:
在这里插入图片描述
​ ps:可以通过echo $PATHecho $HOME打印某一环境变量的值

4.2 特殊字符

命令作用
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数。
$$脚本运行的当前进程 ID 号
$!后台运行的最后一个进程的 ID 号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
$?显示最后命令的退出状态。 0 表示没有错误,其他任何值表明有错误。
#!/bin/bash
echo "第一个参数为: $1";
echo "参数个数为: $#";
echo "传递的参数作为一个字符串显示: $*";

执行: ./test.sh 1 2 3
在这里插入图片描述

4.3 运算符

#!/bin/bash
a=1;
b=2;
echo `expr $a + $b`;
echo  $((a+b));
echo  $[a+b];

执行结果:
在这里插入图片描述

4.4 if语句

#!/bin/bash
read -p "please input your name:" NAME ## read命令用于从控制台读取输入数据
## printf '%s\n' $NAME
if [ $NAME = root ]
  then
  	echo "hello ${NAME}, welcome !"
  elif [ $NAME = itcast ]
  then
  	echo "hello ${NAME}, welcome !"
  else
  	echo "Get out Please!"
fi

执行结果:
在这里插入图片描述

4.5 for语句

方式1:

#!/bin/bash
for N in 1 2 3 
do
    echo $N
done

执行结果:
在这里插入图片描述

方式2:

#!/bin/bash
for ((i = 0; i <= 5; i++)) 
 do 
    echo "welcome $i times" 
 done 

在这里插入图片描述

4.6 函数

#!/bin/bash
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum$anotherNum !"
return $(($aNum+$anotherNum))
} 
funWithReturn
echo "输入的两个数字之和为 $? !"

执行结果:
在这里插入图片描述

5 环境配置

5.1 三台虚拟机关闭防火墙

三台机器执行以下命令(root用户来执行)

systemctl stop iptables   #关闭防火墙
systemctl disable iptables.service  #禁止开机启动

在这里插入图片描述

5.2 三台机器关闭selinux

  • 什么是SELinux
    • SELinux是Linux的一种安全子系统
    • Linux中的权限管理是针对于文件的, 而不是针对进程的, 也就是说, 如果root启动了某个进程, 则这个进程可以操作任何一个文件
    • SELinux在Linux的文件权限之外, 增加了对进程的限制, 进程只能在进程允许的范围内操作资源
  • 为什么要关闭SELinux
    • 如果开启了SELinux, 需要做非常复杂的配置, 才能正常使用系统, 在学习阶段, 在非生产环境, 一般不使用SELinux
  • SELinux的工作模式
    • enforcing 强制模式
    • permissive 宽容模式
    • disable 关闭
# 修改selinux的配置文件
vi /etc/selinux/config

改成SELINUX=disabled
在这里插入图片描述

5.3 三台机器机器免密码登录

在这里插入图片描述

  • 为什么要免密登录
    • Hadoop 节点众多, 所以一般在主节点启动从节点, 这个时候就需要程序自动在主节点登录到从节点中, 如果不能免密就每次都要输入密码, 非常麻烦
  • 免密 SSH 登录的原理
    1. 需要先在 B节点 配置 A节点 的公钥
    2. A节点 请求 B节点 要求登录
    3. B节点 使用 A节点 的公钥, 加密一段随机文本
    4. A节点 使用私钥解密, 并发回给 B节点
    5. B节点 验证文本是否正确

第一步:三台机器生成公钥与私钥

在三台机器执行以下命令,生成公钥与私钥

ssh-keygen -t rsa

执行该命令之后,按下三个回车即可

在这里插入图片描述
第二步:拷贝公钥到同一台机器

三台机器将拷贝公钥到第一台机器

三台机器执行命令:

ssh-copy-id node01

第三步:复制第一台机器的认证到其他机器

将第一台机器的公钥拷贝到其他机器上

在第一台机器上面指向以下命令

scp /root/.ssh/authorized_keys node02:/root/.ssh

scp /root/.ssh/authorized_keys node03:/root/.ssh

在这里插入图片描述
测试免密登录:
在这里插入图片描述

5.4 三台机器时钟同步

  • 为什么需要时间同步
    • 因为很多分布式系统是有状态的, 比如说存储一个数据, A节点 记录的时间是 1, B节点 记录的时间是 2, 就会出问题
## 安装
yum install -y ntp

## 启动定时任务
crontab -e
## 查看定时任务
crontab -l

随后在输入界面键入

*/1 * * * * /usr/sbin/ntpdate ntp4.aliyun.com;

6 装辅助软件

6.1 每台主机安装jdk

查看自带的openjdk

rpm -qa | grep java
在这里插入图片描述

卸载系统自带的openjdk

rpm -e java-1.8.0-openjdk-1.8.0.242.b08-1.el7.x86_64 tzdata-java-2019c-1.el7.noarch java-1.8.0-openjdk-headless-1.8.0.242.b08-1.el7.x86_64 python-javapackages-3.4.1-11.el7.noarch javapackages-tools-3.4.1-11.el7.noarch --nodeps

上传jdk并解压然后配置环境变量

所有软件的安装路径

mkdir -p /export/services

所有软件压缩包的存放路径

mkdir -p /export/softwares

上传jdk到/export/softwares路径下去

rz -E,若不能使用该命令,请先执行yum -y install lrzsz进行下载。

解压

tar -zxvf jdk-8u251-linux-x64.tar.gz -C ../services/

配置环境变量

vim /etc/profile

export JAVA_HOME=/export/services/jdk1.8.0_251
export PATH=:$JAVA_HOME/bin:$PATH

修改完成之后记得 source /etc/profile生效

快捷方式:当装完一台虚拟机的jdk后,可通过scp -r jdk1.8.0_251/ node03:$PWD分发已上传的jdk

7 Zookeeper

7.1 Zookeeper 的概述

  • Zookeeper 是一个开源的分布式协调服务框架 ,主要用来解决分布式集群中 应用系统的一致性问题
  • Zookeeper 是 Google Chubby 思想的一个开源实现
  • Zookeeper 本质上是一个分布式文件系统, 适合存放小文件, 通过文件系统来实现分布式协调

分布式文件系统?
在这里插入图片描述

  • 在上图左侧, Zookeeper 中存储的其实是一个又一个 Znode, Znode 是 Zookeeper 中的节点
    • Znode 是有路径的, 例如 /data/host1, /data/host2, 这个路径也可以理解为是 Znode 的 Name
    • Znode 也可以携带数据, 例如说某个 Znode 的路径是 /data/host1, 其值是一个字符串 "192.168.0.1"
  • 正因为 Znode 的特性, 所以 Zookeeper 可以对外提供出一个类似于文件系统的试图, 可以通过操作文件系统的方式操作 Zookeeper
    • 使用路径获取 Znode
    • 获取 Znode 携带的数据
    • 修改 Znode 携带的数据
    • 删除 Znode
    • 添加 Znode
    • 等等…

Zookeeper 是分布式的

首先呢, Zookeeper 是分为服务端和客户端的, 客户端有 Java 的客户端, 有 Shell 命令行的客户端等, 客户端通过一个类似于文件系统的 API 来访问 Zookeeper 集群

在这里插入图片描述

但是事实上, 客户端最终是直接访问 Zookeeper 集群, 集群中有两大类角色, 一类是 Leader, 一类是 Follower, 其实就是主从, Leader 负责读和写, Follower 只能读, 遇到会产生修改的请求会转发给 Leader 处理, 这是因为 Zookeeper 本质上就是为了在分布式环境中对消息的一致性的支持, 而 Zookeeper 所基于的 ZAB 协议是 Paxos 协议的一个变种, ZAB 协议中是有一个全局的事务生成者, 就是 Leader, 修改设计到在分布式环境下对事务达成一致, 必须由 Leader 发起

在这里插入图片描述

举个例子?

在这里插入图片描述

比如说一个常见的分布式主从系统, 如果有 ZK 在的话, 主节点不需要和每个从节点保持连接, 只需要监听从节点创建的 Znode, 便可以知道谁在线

Zookeeper 能做什么?

  • 发布订阅
  • 命名服务
  • 分布式锁
  • 分布式协调

7.2 Zookeeper安装

服务器IP主机名myid的值
192.168.188.100node011
192.168.188.110node022
192.168.188.120node033

第一步:下载zookeeeper的压缩包,下载网址如下

http://archive.apache.org/dist/zookeeper/

我们在这个网址下载我们使用的zk版本为3.4.9

下载完成之后,上传到我们的linux的/export/softwares路径下准备进行安装

第二步:解压

解压zookeeper的压缩包到/export/services路径下去,然后准备进行安装

cd /export/software

tar -zxvf zookeeper-3.4.9.tar.gz -C ../services/ 

第三步:修改配置文件

第一台机器修改配置文件

cd /export/services/zookeeper-3.4.9/conf/

cp zoo_sample.cfg zoo.cfg

mkdir -p /export/services/zookeeper-3.4.9/zkdatas/

vim zoo.cfg

dataDir=/export/services/zookeeper-3.4.9/zkdatas
# 保留多少个快照
autopurge.snapRetainCount=3
# 日志多少小时清理一次
autopurge.purgeInterval=1
# 集群中服务器地址
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888

第四步:添加myid配置

在第一台机器的

/export/services/zookeeper-3.4.9/zkdatas /这个路径下创建一个文件,文件名为myid ,文件内容为1

echo 1 > /export/services/zookeeper-3.4.9/zkdatas/myid

第五步:安装包分发并修改myid的值

安装包分发到其他机器

第一台机器上面执行以下两个命令

scp -r /export/services/zookeeper-3.4.9/ node02:/export/services/

scp -r /export/services/zookeeper-3.4.9/ node03:/export/services/

第二台机器上修改myid的值为2

echo 2 > /export/services/zookeeper-3.4.9/zkdatas/myid

在这里插入图片描述

第三台机器上修改myid的值为3

echo 3 > /export/services/zookeeper-3.4.9/zkdatas/myid

在这里插入图片描述

第六步:三台机器启动zookeeper服务

三台机器启动zookeeper服务

这个命令三台机器都要执行

/export/services/zookeeper-3.4.9/bin/zkServer.sh start

查看启动状态

/export/services/zookeeper-3.4.9/bin/zkServer.sh status

遇到错误:java.net.NoRouteToHostException: 没有到主机的路由 (Host unreachable)
解决:
原因:防火墙没关!,每一台机器依次执行:

systemctl stop firewalld.service #停止firewall

systemctl disable firewalld.service #禁止firewall开机启动

firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)

在这里插入图片描述


7.3 Zookeeper的Shell 客户端操作

通过zkCli.sh命令启动。

命令说明参数
create [-s] [-e] path data acl创建Znode-s 指定是顺序节点
-e 指定是临时节点
ls path [watch]列出Path下所有子Znode
get path [watch]获取Path对应的Znode的数据和属性
ls2 path [watch]查看Path下所有子Znode以及子Znode的属性
set path data [version]更新节点version 数据版本
delete path [version]删除节点, 如果要删除的节点有子Znode则无法删除version 数据版本
rmr path删除节点, 如果有子Znode则递归删除
setquota -n|-b val path修改Znode配额-n 设置子节点最大个数
-b 设置节点数据最大长度
history列出历史记录

1:创建普通节点

create /app1 hello

2: 创建顺序节点

create -s /app3 world

3:创建临时节点

create -e /tempnode world

4:创建顺序的临时节点

create -s -e /tempnode2 aaa

5:获取节点数据

get /app1

6:修改节点数据

set /app1 xxx

7:删除节点

delete /app1 删除的节点不能有子节点

rmr /app1 递归删除

Znode 的特点

  • 文件系统的核心是 Znode
  • 如果想要选取一个 Znode, 需要使用路径的形式, 例如 /test1/test11
  • Znode 本身并不是文件, 也不是文件夹, Znode 因为具有一个类似于 Name 的路径, 所以可以从逻辑上实现一个树状文件系统
  • ZK 保证 Znode 访问的原子性, 不会出现部分 ZK 节点更新成功, 部分 ZK 节点更新失败的问题
  • Znode 中数据是有大小限制的, 最大只能为1M
  • Znode是由三个部分构成
    • stat: 状态, Znode的权限信息, 版本等
    • data: 数据, 每个Znode都是可以携带数据的, 无论是否有子节点
    • children: 子节点列表

Znode 的类型

  • 每个Znode有两大特性, 可以构成四种不同类型的Znode
    • 持久性
      • 持久 客户端断开时, 不会删除持有的Znode
      • 临时 客户端断开时, 删除所有持有的Znode, 临时Znode不允许有子Znode
    • 顺序性
      • 有序 创建的Znode有先后顺序, 顺序就是在后面追加一个序列号, 序列号是由父节点管理的自增
      • 无序 创建的Znode没有先后顺序
  • Znode的属性
    • dataVersion 数据版本, 每次当Znode中的数据发生变化的时候, dataVersion都会自增一下
    • cversion 节点版本, 每次当Znode的节点发生变化的时候, cversion都会自增
    • aclVersion ACL(Access Control List)的版本号, 当Znode的权限信息发生变化的时候aclVersion会自增
    • zxid 事务ID
    • ctime 创建时间
    • mtime 最近一次更新的时间
    • ephemeralOwner 如果Znode为临时节点, ephemeralOwner表示与该节点关联的SessionId

通知机制

  • 通知类似于数据库中的触发器, 对某个Znode设置 Watcher, 当Znode发生变化的时候, WatchManager会调用对应的Watcher
  • 当Znode发生删除, 修改, 创建, 子节点修改的时候, 对应的Watcher会得到通知
  • Watcher的特点
    • 一次性触发 一个 Watcher 只会被触发一次, 如果需要继续监听, 则需要再次添加 Watcher
    • 事件封装: Watcher 得到的事件是被封装过的, 包括三个内容 keeperState, eventType, path
KeeperStateEventType触发条件说明
None连接成功
SyncConnectedNodeCreatedZnode被创建此时处于连接状态
SyncConnectedNodeDeletedZnode被删除此时处于连接状态
SyncConnectedNodeDataChangedZnode数据被改变此时处于连接状态
SyncConnectedNodeChildChangedZnode的子Znode数据被改变此时处于连接状态
DisconnectedNone客户端和服务端断开连接此时客户端和服务器处于断开连接状态
ExpiredNone会话超时会收到一个SessionExpiredException
AuthFailedNone权限验证失败会收到一个AuthFailedException

会话

  • 在ZK中所有的客户端和服务器的交互都是在某一个Session中的, 客户端和服务器创建一个连接的时候同时也会创建一个Session
  • Session会在不同的状态之间进行切换: CONNECTING, CONNECTED, RECONNECTING, RECONNECTED, CLOSED
  • ZK中的会话两端也需要进行心跳检测, 服务端会检测如果超过超时时间没收到客户端的心跳, 则会关闭连接, 释放资源, 关闭会话

8 Hadoop

8.1 Hadoop的介绍

  1. Hadoop最早起源于Nutch。Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题。
  2. 2003年、2004年谷歌发表的两篇论文为该问题提供了可行的解决方案。

——分布式文件系统(GFS),可用于处理海量网页的存储

——分布式计算框架MAPREDUCE,可用于处理海量网页的索引计算问题。

  1. Nutch的开发人员完成了相应的开源实现HDFSMAPREDUCE,并从Nutch中剥离成为独立项目HADOOP,到2008年1月,HADOOP成为Apache顶级项目.

狭义上来说,hadoop就是单独指代hadoop这个软件,

HDFS :分布式文件系统

MapReduce : 分布式计算系统

广义上来说,hadoop指代大数据的一个生态圈,包括很多其他的软件

在这里插入图片描述

8.2 hadoop的历史版本介绍

1.x版本系列:hadoop版本当中的第二代开源版本,主要修复0.x版本的一些bug等

2.x版本系列:架构产生重大变化,引入了yarn平台等许多新特性

3.x版本系列: 加入多namenoode新特性

8.3 hadoop三大公司发型版本介绍

免费开源版本apache:

http://hadoop.apache.org/

优点:拥有全世界的开源贡献者,代码更新迭代版本比较快,

缺点:版本的升级,版本的维护,版本的兼容性,版本的补丁都可能考虑不太周到,\

apache所有软件的下载地址(包括各种历史版本):

http://archive.apache.org/dist/

免费开源版本hortonWorks:

https://hortonworks.com/

hortonworks主要是雅虎主导Hadoop开发的副总裁,带领二十几个核心成员成立Hortonworks,核心产品软件HDP(ambari),HDF免费开源,并且提供一整套的web管理界面,供我们可以通过web界面管理我们的集群状态,web管理界面软件HDF网址(http://ambari.apache.org/

软件收费版本ClouderaManager:

https://www.cloudera.com/

cloudera主要是美国一家大数据公司在apache开源hadoop的版本上,通过自己公司内部的各种补丁,实现版本之间的稳定运行,大数据生态圈的各个版本的软件都提供了对应的版本,解决了版本的升级困难,版本兼容性等各种问题

8.4、hadoop的架构模型(1.x,2.x的各种架构模型介绍)

8.4.1 1.x的版本架构模型介绍

在这里插入图片描述

文件系统核心模块:

NameNode:集群当中的主节点,管理元数据(文件的大小,文件的位置,文件的权限),主要用于管理集群当中的各种数据

secondaryNameNode:主要能用于hadoop当中元数据信息的辅助管理

DataNode:集群当中的从节点,主要用于存储集群当中的各种数据

数据计算核心模块:

JobTracker:接收用户的计算请求任务,并分配任务给从节点

TaskTracker:负责执行主节点JobTracker分配的任务

8.4.2 2.x的版本架构模型介绍

第一种:NameNode与ResourceManager单节点架构模型

在这里插入图片描述

文件系统核心模块:

NameNode:集群当中的主节点,主要用于管理集群当中的各种数据

secondaryNameNode:主要能用于hadoop当中元数据信息的辅助管理

DataNode:集群当中的从节点,主要用于存储集群当中的各种数据

数据计算核心模块:

ResourceManager:接收用户的计算请求任务,并负责集群的资源分配

NodeManager:负责执行主节点APPmaster分配的任务

第二种:NameNode单节点与ResourceManager高可用架构模型

在这里插入图片描述

文件系统核心模块:

NameNode:集群当中的主节点,主要用于管理集群当中的各种数据

secondaryNameNode:主要能用于hadoop当中元数据信息的辅助管理

DataNode:集群当中的从节点,主要用于存储集群当中的各种数据

数据计算核心模块:

ResourceManager:接收用户的计算请求任务,并负责集群的资源分配,以及计算任务的划分,通过zookeeper实现ResourceManager的高可用

NodeManager:负责执行主节点ResourceManager分配的任务

第三种:NameNode高可用与ResourceManager单节点架构模型

在这里插入图片描述

文件系统核心模块:

NameNode:集群当中的主节点,主要用于管理集群当中的各种数据,其中nameNode可以有两个,形成高可用状态

DataNode:集群当中的从节点,主要用于存储集群当中的各种数据

JournalNode:文件系统元数据信息管理

数据计算核心模块:

ResourceManager:接收用户的计算请求任务,并负责集群的资源分配,以及计算任务的划分

NodeManager:负责执行主节点ResourceManager分配的任务

第四种:NameNode与ResourceManager高可用架构模型

在这里插入图片描述
文件系统核心模块:

NameNode:集群当中的主节点,主要用于管理集群当中的各种数据,一般都是使用两个,实现HA高可用

JournalNode:元数据信息管理进程,一般都是奇数个

DataNode:从节点,用于数据的存储

数据计算核心模块:

ResourceManager:Yarn平台的主节点,主要用于接收各种任务,通过两个,构建成高可用

NodeManager:Yarn平台的从节点,主要用于处理ResourceManager分配的任务

8.5 Hadoop的安装

集群的规划:

服务器IP192.168.188.100192.168.188.110192.168.188.120
主机名node01node02node03
NameNode
SecondaryNameNode
dataNode
ResourceManager
NodeManager
  1. 上传并解压
  2. 修改配置文件
  3. 分发安装包
  4. 格式化HDFS
  5. 启动集群

8.5.1 上传并解压

  1. 上传压缩包到/export/software目录
  2. cd /export/software
  3. tar xzvf hadoop-3.1.1.tar.gz -C ../services

8.5.2 修改配置文件

配置文件的位置在 hadoop/etc/hadoop

core-site.xml
<configuration>
    <property>
		<name>fs.defaultFS</name>
		<value>hdfs://node01:8020</value>
	</property>
	<!-- 临时文件存储目录 -->
	<property>
		<name>hadoop.tmp.dir</name>
		<value>/export/services/hadoop-3.1.1/datas/tmp</value>
	</property>
    <!--  缓冲区大小,实际工作中根据服务器性能动态调整 -->
	<property>
		<name>io.file.buffer.size</name>
		<value>8192</value>
	</property>
    <!--  开启hdfs的垃圾桶机制,删除掉的数据可以从垃圾桶中回收,单位分钟 -->
	<property>
		<name>fs.trash.interval</name>
		<value>10080</value>
	</property>
</configuration>
hadoop-env.sh
export JAVA_HOME=/export/services/jdk1.8.0_251
hdfs-site.xml
<configuration>
	<property>
		<name>dfs.namenode.name.dir</name>
		<value>file:///export/services/hadoop-3.1.1/datas/namenode/namenodedatas</value>
	</property>
	<property>
		<name>dfs.blocksize</name>
		<value>134217728</value>
	</property>
	<property>
		<name>dfs.namenode.handler.count</name>
		<value>10</value>
	</property>
	<property>
		<name>dfs.datanode.data.dir</name>
		<value>file:///export/services/hadoop-3.1.1/datas/datanode/datanodeDatas</value>
	</property>
	<property>
		<name>dfs.namenode.http-address</name>
		<value>node01:50070</value>
	</property>
	<property>
		<name>dfs.replication</name>
		<value>3</value>
	</property>
	<property>
		<name>dfs.permissions.enabled</name>
		<value>false</value>
	</property>
	<property>
		<name>dfs.namenode.checkpoint.edits.dir</name>
		<value>file:///export/services/hadoop-3.1.1/datas/dfs/nn/snn/edits</value>
	</property>
	<property>
		<name>dfs.namenode.secondary.http-address</name>
		<value>node01.hadoop.com:50090</value>
	</property>
	<property>
		<name>dfs.namenode.edits.dir</name>
		<value>file:///export/services/hadoop-3.1.1/datas/dfs/nn/edits</value>
	</property>
	<property>
		<name>dfs.namenode.checkpoint.dir</name>
		<value>file:///export/services/hadoop-3.1.1/datas/dfs/snn/name</value>
	</property>
</configuration>
mapred-site.xml
<configuration>
	<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	</property>
	<property>
		<name>mapreduce.map.memory.mb</name>
		<value>1024</value>
	</property>
	<property>
		<name>mapreduce.map.java.opts</name>
		<value>-Xmx512M</value>
	</property>
	<property>
		<name>mapreduce.reduce.memory.mb</name>
		<value>1024</value>
	</property>
	<property>
		<name>mapreduce.reduce.java.opts</name>
		<value>-Xmx512M</value>
	</property>
	<property>
		<name>mapreduce.task.io.sort.mb</name>
		<value>256</value>
	</property>
	<property>
		<name>mapreduce.task.io.sort.factor</name>
		<value>100</value>
	</property>
	<property>
		<name>mapreduce.reduce.shuffle.parallelcopies</name>
		<value>25</value>
	</property>
	<property>
		<name>mapreduce.jobhistory.address</name>
		<value>node01.hadoop.com:10020</value>
	</property>
	<property>
		<name>mapreduce.jobhistory.webapp.address</name>
		<value>node01.hadoop.com:19888</value>
	</property>
	<property>
		<name>mapreduce.jobhistory.intermediate-done-dir</name>
		<value>/export/services/hadoop-3.1.1/datas/jobhsitory/intermediateDoneDatas</value>
	</property>
	<property>
		<name>mapreduce.jobhistory.done-dir</name>
		<value>/export/services/hadoop-3.1.1/datas/jobhsitory/DoneDatas</value>
	</property>
	<property>
	  <name>yarn.app.mapreduce.am.env</name>
	  <value>HADOOP_MAPRED_HOME=/export/services/hadoop-3.1.1</value>
	</property>
	<property>
	  <name>mapreduce.map.env</name>
	  <value>HADOOP_MAPRED_HOME=/export/services/hadoop-3.1.1/</value>
	</property>
	<property>
	  <name>mapreduce.reduce.env</name>
	  <value>HADOOP_MAPRED_HOME=/export/services/hadoop-3.1.1</value>
	</property>
</configuration>
yarn-site.xml
<configuration>
	<property>
		<name>dfs.namenode.handler.count</name>
		<value>100</value>
	</property>
	<property>
		<name>yarn.log-aggregation-enable</name>
		<value>true</value>
	</property>
	<property>
		<name>yarn.resourcemanager.address</name>
		<value>node01:8032</value>
	</property>
	<property>
		<name>yarn.resourcemanager.scheduler.address</name>
		<value>node01:8030</value>
	</property>
	<property>
		<name>yarn.resourcemanager.resource-tracker.address</name>
		<value>node01:8031</value>
	</property>
	<property>
		<name>yarn.resourcemanager.admin.address</name>
		<value>node01:8033</value>
	</property>
	<property>
		<name>yarn.resourcemanager.webapp.address</name>
		<value>node01:8088</value>
	</property>
	<property>
		<name>yarn.resourcemanager.hostname</name>
		<value>node01</value>
	</property>
	<property>
		<name>yarn.scheduler.minimum-allocation-mb</name>
		<value>1024</value>
	</property>
	<property>
		<name>yarn.scheduler.maximum-allocation-mb</name>
		<value>2048</value>
	</property>
	<property>
		<name>yarn.nodemanager.vmem-pmem-ratio</name>
		<value>2.1</value>
	</property>
	<!-- 设置不检查虚拟内存的值,不然内存不够会报错 -->
	<property>
		<name>yarn.nodemanager.vmem-check-enabled</name>
		<value>false</value>
	</property>
	<property>
		<name>yarn.nodemanager.resource.memory-mb</name>
		<value>1024</value>
	</property>
	<property>
		<name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
		<value>true</value>
	</property>
	<property>
		<name>yarn.nodemanager.local-dirs</name>
		<value>file:///export/services/hadoop-3.1.1/datas/nodemanager/nodemanagerDatas</value>
	</property>
	<property>
		<name>yarn.nodemanager.log-dirs</name>
		<value>file:///export/services/hadoop-3.1.1/datas/nodemanager/nodemanagerLogs</value>
	</property>
	<property>
		<name>yarn.nodemanager.log.retain-seconds</name>
		<value>10800</value>
	</property>
	<property>
		<name>yarn.nodemanager.remote-app-log-dir</name>
		<value>/export/services/hadoop-3.1.1/datas/remoteAppLog/remoteAppLogs</value>
	</property>
	<property>
		<name>yarn.nodemanager.remote-app-log-dir-suffix</name>
		<value>logs</value>
	</property>
	<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property>
	<property>
		<name>yarn.log-aggregation.retain-seconds</name>
		<value>18144000</value>
	</property>
	<property>
		<name>yarn.log-aggregation.retain-check-interval-seconds</name>
		<value>86400</value>
	</property>
	<!-- yarn上面运行一个任务,最少需要1.5G内存,虚拟机没有这么大的内存就调小这个值,不然会报错 -->
	<property>
        <name>yarn.app.mapreduce.am.resource.mb</name>
        <value>1024</value>
	</property>
</configuration>
workers
node01
node02
node03

8.5.3 创建数据和临时文件夹

mkdir -p /export/services/hadoop-3.1.1/datas/tmp
mkdir -p /export/services/hadoop-3.1.1/datas/dfs/nn/snn/edits
mkdir -p /export/services/hadoop-3.1.1/datas/namenode/namenodedatas
mkdir -p /export/services/hadoop-3.1.1/datas/datanode/datanodeDatas
mkdir -p /export/services/hadoop-3.1.1/datas/dfs/nn/edits
mkdir -p /export/services/hadoop-3.1.1/datas/dfs/snn/name
mkdir -p /export/services/hadoop-3.1.1/datas/jobhsitory/intermediateDoneDatas
mkdir -p /export/services/hadoop-3.1.1/datas/jobhsitory/DoneDatas
mkdir -p /export/services/hadoop-3.1.1/datas/nodemanager/nodemanagerDatas
mkdir -p /export/services/hadoop-3.1.1/datas/nodemanager/nodemanagerLogs
mkdir -p /export/services/hadoop-3.1.1/datas/remoteAppLog/remoteAppLogs

8.5.4 分发安装包到其它机器

cd /export/services
scp -r hadoop-3.1.1/ node02:$PWD
scp -r hadoop-3.1.1/ node03:$PWD

8.5.5 在每个节点配置环境变量

vi /etc/profile
export HADOOP_HOME=/export/services/hadoop-3.1.1/
export PATH=:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

8.5.6 格式化HDFS

  • 为什么要格式化HDFS
    • HDFS需要一个格式化的过程来创建存放元数据(image, editlog)的目录
bin/hdfs namenode -format

8.5.7 启动集群

注意:启动集群前,一定要启动zookeeper
zookeeper启动命令:/export/services/zookeeper-3.4.9/bin/zkServer.sh start

# 会登录进所有的worker启动相关进行, 也可以手动进行, 但是没必要
/export/services/hadoop-3.1.1/sbin/start-dfs.sh
/export/services/hadoop-3.1.1/sbin/start-yarn.sh
mapred --daemon start historyserver

执行结果:
在这里插入图片描述

此时便可以通过如下三个URL访问Hadoop了

  • HDFS: http://192.168.188.100:50070/dfshealth.html#tab-overview

在这里插入图片描述

  • Yarn: http://192.168.188.100:8088/cluster

在这里插入图片描述

报错:ERROR: Attempting to operate on hdfs namenode as root \n ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
解决:设置hadoop-env.sh

export HDFS_NAMENODE_USER="root"
export HDFS_DATANODE_USER="root"
export HDFS_SECONDARYNAMENODE_USER="root"
export YARN_RESOURCEMANAGER_USER="root"
export YARN_NODEMANAGER_USER="root"

修改完后,向以前一样分发到其他两台机器

8.5.8 测试使用

创建测试文件,并加入到根目录下
在这里插入图片描述
查看控制台:
在这里插入图片描述
成功!撒花~~~

8.5.9 正常关闭集群(附加)

很重要,不然启动虚拟机都很难,会有各种怪事情出现!谨慎

  1. node01执行/export/services/hadoop-3.1.1/sbin/stop-yarn.sh
    在这里插入图片描述
  2. node01执行/export/services/hadoop-3.1.1/sbin/stop-dfs.sh
    在这里插入图片描述
  3. 三台机器都要执行/export/services/zookeeper-3.4.9/bin/zkServer.sh stop
    在这里插入图片描述
  4. shutdown -h now 关机睡觉!

下一篇:大数据学习系列:Hadoop3.0苦命学习(二)

  • 14
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 大数据开发工程师系列是指专门从事大数据开发的一类职业。Hadoop和Spark是大数据领域中最受欢迎的两个开源框架。 Hadoop是一个分布式计算框架,用于处理大规模数据集的分布式存储和计算。Hadoop的核心是Hadoop分布式文件系统(HDFS)和MapReduce计算模型。HDFS将数据分布存储在集群的多个节点上,MapReduce可以并行处理这些分布式数据。Hadoop具有高可靠性、高扩展性和高容错性的特点,并且还提供了许多其他工具和库,如Hive、Pig和HBase等。 Spark是一个快速、通用的大数据处理引擎,可以在多种数据源上进行高效的分布式计算。相比于Hadoop的MapReduce,Spark具有更快的数据处理速度和更强的扩展性。Spark提供了一个称为弹性分布式数据集(RDD)的抽象,可以在内存中高效地处理大规模数据集。此外,Spark还提供了许多高级组件和库,如Spark SQL、Spark Streaming和MLlib等,用于处理结构化数据、流式数据和机器学习。 作为大数据开发工程师,掌握Hadoop和Spark是非常重要的。使用Hadoop可以处理海量数据,并且具有高可靠性和容错性。而Spark则能够快速高效地处理大规模数据,并提供了更多的数据处理和分析功能。 大数据开发工程师需要熟悉Hadoop和Spark的使用和调优技巧,以及相关的编程语言和工具,如Java、Scala和Python。他们需要了解数据处理的算法和模型,并能够设计和实现高效的分布式计算方案。此外,大数据开发工程师还需要具备良好的沟通能力和团队合作能力,能够与数据科学家和业务团队紧密合作,共同解决实际问题。 总之,大数据开发工程师系列是一个专门从事大数据开发的职业群体。而Hadoop和Spark则是这个职业群体中最重要的两个工具,他们分别用于大规模数据处理和分布式计算。掌握Hadoop和Spark的使用和优化技巧,是成为一名优秀的大数据开发工程师的关键能力。 ### 回答2: 大数据开发工程师系列主要涉及到两个重要的技术:Hadoop和Spark。 Hadoop是一个开源的分布式计算框架,主要用于存储和处理大规模数据集。它通过将数据分散存储在集群中的多个节点上,并在节点之间进行数据通信和计算,实现了数据的并行处理和高可靠性。Hadoop的核心工具是HDFS(Hadoop分布式文件系统)和MapReduce(一种用于分布式计算的编程模型)。HDFS用于将数据分布式存储在集群中,而MapReduce则是用于分布式计算的框架,通过将计算任务分解成多个小任务并在各个节点上并行执行,大大提高了数据处理的效率和性能。 Spark是当前最受欢迎的大数据计算框架之一,也是一个开源项目。与Hadoop相比,Spark具有更快的数据处理速度和更强大的功能。Spark提供了一个可扩展的分布式数据处理框架,支持数据处理、机器学习、图计算等多种大数据应用场景。与传统的基于磁盘的计算框架相比,Spark利用内存计算的优势,可以快速地对大规模数据进行处理和分析。此外,Spark还提供了丰富的API和开发工具,使开发人员可以更轻松地构建和调试大数据应用程序。 作为大数据开发工程师,掌握Hadoop和Spark是必不可少的。熟悉Hadoop的使用和原理,能够有效地存储和处理大规模数据集。而对于Spark的掌握,则可以提高数据处理的速度和效率,使得大数据分析和挖掘更加容易实现。因此,大数据开发工程师需要具备对Hadoop和Spark的深入理解和熟练应用,同时还需要具备数据分析、算法和编程等多方面的技能,以应对复杂的大数据挑战。 ### 回答3: 大数据开发工程师是一个专注于处理大数据的职位,主要负责使用各种工具和技术来处理和分析大规模的数据集。 Hadoop和Spark是目前在大数据处理领域中非常流行的两个开源工具。Hadoop是一个分布式系统基础架构,可以在集群中存储和处理大规模数据。它的核心是Hadoop分布式文件系统(HDFS)和MapReduce计算模型。HDFS将数据分散存储在集群的不同节点上,而MapReduce模型则提供了一种并行处理数据的方式。大数据开发工程师需要熟悉Hadoop的架构和命令行工具,能够编写MapReduce程序来处理数据。 Spark是一个快速和通用的大数据处理引擎,可以在大规模集群上执行数据处理任务。它拥有比Hadoop更高的性能和更丰富的功能。Spark提供了强大的机器学习、图计算和流处理等功能。大数据开发工程师需要熟悉Spark的API和编程模型,能够使用Spark的各种组建和工具进行数据处理和分析。 作为大数据开发工程师,掌握Hadoop和Spark是非常重要的。使用Hadoop和Spark可以有效地处理大规模数据,提取有价值的信息。大数据开发工程师通过编写和优化MapReduce程序来实现数据处理的需求,同时也能利用Spark提供的机器学习和流处理等功能来进行更复杂的数据分析。通过合理地使用Hadoop和Spark,大数据开发工程师可以减少数据处理的时间和成本,提高数据处理的效率和准确性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值