Loading

01-Hadoop概述

1. 大数据

1.1 概述

指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

大数据主要解决,海量数据的采集存储分析计算问题。

按顺序给出数据存储单位:Bit、Byte、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB。

常见数据存储单位:

1Byte  = 8bit     1K(千) = 1024Byte   1MB(兆) = 1024K    1G(吉) = 1024M
1T(太) = 1024G    1P(拍) = 1024T      1E(艾)  = 1024P    1Z(泽) = 1024E
1Y(尧) = 1024Z    1B(布) = 1024Y      1N(诺)  = 1024B    1D(刀) = 1024N

1.2 特点

  1. Volume(大量):截至目前,人类生产的所有印刷材料的数据量是 200PB,而历史上全人类总共说过的话的数据量大约是 5EB。当前,典型个人计算机硬盘的容量为 TB 量级,而一些大企业的数据量已经接近 EB 量级。
  2. Velocity(高速):这是大数据区分于传统数据挖掘的最显著特征。根据 IDC 的“数字宇宙”的报告,预计到 2025 年,全球数据使用量将达到 163ZB。在如此海量的数据面前,处理数据的效率就是企业的生命。
  3. Variety(多样):这种类型的多样性也让数据被分为结构化数据和非结构化数据。相对于以往便于存储的以数据库/文本为主的结构化数据,非结构化数据越来越多,包括网络日志、音频、视频、图片、地理位置信息等,这些多类型的数据对数据的处理能力提出了更高要求。
  4. Value(低价值密度):价值密度的高低与数据总量的大小成反比;如何快速对有价值数据“提纯”成为目前大数据背景下待解决的难题。
  5. Veracity(准确):数据的准确性和可信赖度,即数据的质量。

1.3 部门工作

部门间业务流程分析:

部门内组织结构:

2. 分布式

2.1 场景

【计算问题】

无论是我们在学校刚开始学编程,还是在刚参加工作开始处理实际问题,写出来的程序都是很简单的。因为面对的问题很简单。以处理数据为例,可能只是把一个几十 K 的文件解析下,然后生成一个词频分析的报告。很简单的程序,十几行甚至几行就搞定了。
直到有一天,给你扔过来 1000 个文件,有些还特别大,好几百 M 了。你用之前的程序一跑,发现跑的时间有点长。于是想要去优化下。1000 个文件,互相还没业务联系,用多线程呀,一个线程处理一个文件,结果再汇总就搞定了。如果多线程效果不够好,比如像 Python 的多线程,没法利用多核的威力,那就用多进程。
无论是线程、进程,本质上,目的都是为了计算的并行化,解决的是算的慢的问题。而如果计算量足够大,就算榨干了机器的计算能力,也算不过来,咋办?
一台机器不够,那就多搞几台机器嘛。所以就从多线程/进程的计算并行化,进化到计算的分布式化(当然,分布式一定程度上也是并行化)。

【存储问题】

另一方面,如果处理的数据有 10T,而你手上的机器只有 500G 的硬盘,怎么办?

一种办法是纵向扩展,搞一台几十 T 硬盘的机器;另一种是横向扩展,多搞几台机器,分散着放。前者很容易到瓶颈,毕竟数据无限,而一台机器的容量有限,所以在大数据量的情况下,只能选后者。把数据分散到多台机器,本质上解决的是存不下的问题。

同时,刚才提到计算分布式化后,总不能所以程序都去同一台机器读数据吧,这样效率必然会受到单台机器性能的拖累,比如磁盘 IO、网络带宽等,也就逼着数据存储也要分散到各个机器去了。基于这两个原因,数据存储也分布式起来了。

2.2 概述

分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。简单来说就是一群独立计算机集合共同对外提供服务,但是对于系统的用户来说,就像是一台计算机在提供服务一样。

分布式意味着可以采用更多的普通计算机(相对于昂贵的大型机)组成分布式集群对外提供服务。计算机越多,CPU、内存、存储资源等也就越多,能够处理的并发访问量也就越大。

从分布式系统的概念中我们知道,各个主机之间通信和协调主要通过网络进行,所以,分布式系统中的计算机在空间上几乎没有任何限制,这些计算机可能被放在不同的机柜上,也可能被部署在不同的机房中,还可能在不同的城市中,对于大型的网站甚至可能分布在不同的国家和地区。

2.3 分布式和集群

分布式(Distributed)、集群(Cluster)

分布式、集群的共同点:多台机器,因此口语中混淆两者概念的时候都是相对于单机来说的。

2.4 技术

  • 负载均衡:解决一个处理不下,多个一起处理
  • 故障转移:解决单点故障,容忍错误发生,保证业务连续
  • 伸缩性:动态扩容、缩容

a. 负载均衡

将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行。解决了单个无法处理所有任务,多个一起处理的问题。

b. 故障转移

上面的系统看起来很美好,但是做了一个不切实际的假设:所有的服务都是无状态的,换句话说,假设用户的两次请求直接是没有关联的。但是现实是,大部分服务都是有状态的,例如购物车。

用户访问系统,在服务器上创建了一个购物车,并向其中加了几个商品,然后服务器 1 挂掉了,用户后续访问就找不到服务器 1 了,这时候就要做失效转移,让另外几个服务器去接管,去处理用户的请求。
可是问题来了,在服务器 2、3 上有用户的购物车吗?如果没有,用户就会抱怨,我刚创建的购物车哪里去了?还有更严重的,假设用户登录过得信息保存到了该服务器 1 上登录的,用户登录过的信息保存到了该服务器的 session 中,现在这个服务器挂了,用的 session 就不见了,会把用户踢到了登录界面,让用户再次登录!

处理不好状态的问题,集群的威力就大打折扣,无法完成真正的失效转移,甚至无法使用。这该怎么办?

一种办法是把状态信息在集群的各个服务器之间复制,让集群的各个服务器达成一致;还有一种办法, 就是把几种状态信息存储在一个地方,让集群服务器的各个服务器都能访问到。

c. 伸缩性

如果 3 个系统 A 的实例还是满足不了大量请求,例如双十一可以申请增加服务器,但双十一过后,新增的服务器闲置成了摆设。可以尝试云计算,在云端可以轻松的创建,删除虚拟的服务器,那样就可以轻松的随着用户的请求动图的增减服务器了。

3. Hadoop 概述

3.1 是什么?

狭义上来说是,Hadoop 是一个由 Apache 基金会所开发由 Java 实现的分布式系统基础架构,允许使用简单的编程模型跨计算机集群对大型数据集进行分布式处理,其主要解决海量数据的存储和海量数据的分析计算问题。

广义上来说,Hadoop 通常是指一个更广泛的概念 —— Hadoop 生态圈。

3.2 Hadoop 组成

  • Hadoop HDFS(分布式文件存储系统 Hadoop Distributed File System)解决海量数据存储
  • Hadoop YARN(集群资源管理和任务调度框架 Yet Another Resource Negotiator)解决资源任务调度
  • Hadoop MapReduce(分布式计算框架)解决海量数据计算
  • Hadoop Common(通用组件)

3.3 历史&优势&版本

4. Hadoop 集群

http://hadoop.apache.org/

4.1 简介

Hadoop 集群具体来说包含两个集群:HDFS 集群和 YARN 集群,两者逻辑上分离,但物理上常在一起。

  • HDFS 集群负责海量数据的存储,集群中的角色主要有:
    • NameNode
    • DataNode
    • SecondaryNameNode
  • YARN 集群负责海量数据运算时的资源调度,集群中的角色主要有:
    • ResourceManager
    • NodeManager

那 MapReduce 是什么呢?

它其实是一个分布式运算编程框架,是应用程序开发包,由用户按照编程规范进行程序开发后,打包运行在 HDFS 集群上,并且受到 YARN 集群的资源调度管理。

MapReduce 将计算过程分为 Map 和 Reduce 两个阶段:(1)Map 阶段并行处理输入数据;(2)Reduce 阶段对 Map 结果进行汇总。

小结:

  1. 如何理解两个集群逻辑上分离?两个集群互相之间没有依赖、互不影响;
  2. 如何理解两个集群物理上在一起?某些角色进程往往部署在同一台物理服务器上;
  3. 为什么没有 MapReduce 集群?有这样的说法吗?MapReduce 是计算框架、代码层面的组件,没有集群一说~

推荐系统项目框架 | 大数据技术生态体系

4.2 部署方式

https://hadoop.apache.org/releases.html

4.3 搭建运行环境

a. 基础环境

(1)安装模板虚拟机:IP 地址 192.168.6.99、主机名称 hadoop99、内存 4G、硬盘 50G

(2)网络设置

虚拟机网络设置

VMware 虚拟网络编辑器

(3)检查 /etc/hosts/etc/hostname(在物理机的 /etc/hosts 同样追加此映射)

(4)安装 epel-release: yum install -y epel-release(注:Extra Packages for Enterprise Linux 是为“红帽系”的操作系统提供额外的软件包,适用于 RHEL、CentOS 和 Scientific Linux。相当于是一个软件仓库,大多数 rpm 包在官方 repository 中是找不到的)

(5)关闭防火墙,关闭防火墙开机自启 // 注:在企业开发时,通常单个服务器的防火墙时关闭的。公司整体对外会设置非常安全的防火墙。

systemctl stop firewalld
systemctl disable firewalld.service

(6)配置 liujiaqi 用户具有 root 权限,方便后期加 sudo 执行 root 权限的命令 // 注:liujiaqi 这一行不要直接放到 root 行下面,因为所有用户都属于 wheel 组,你先配置了 liujiaqi 具有免密功能,但是程序执行到 %wheel 行时,该功能又被覆盖回需要密码。所以 liujiaqi 要放到 %wheel 这行下面。

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
liujiaqi ALL=(ALL) NOPASSWD:ALL

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

[liujiaqi@hadoop99 opt]$ sudo mkdir module
[liujiaqi@hadoop99 opt]$ sudo mkdir software
[liujiaqi@hadoop99 opt]$ sudo chown liujiaqi:liujiaqi module/ software/

(8)卸载虚拟机自带的 JDK(注:若虚拟机是最小化安装不需要执行这一步)

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

(9)重启虚拟机

b. 克隆虚拟机

启动 hadoop102 并修改 /etc/hostname/etc/sysconfig/network-scripts/ifcfg-ens160 然后重启虚拟机(hadoop103、hadoop104 同理);

c. 安装 JDK、Hadoop

(1)传输 jdk、hadoop 压缩包到虚拟机,然后解压到 /opt/module 下

  • bin 目录:存放对 Hadoop 相关服务(hdfs、yarn、mapred)进行操作的脚本;
  • etc 目录:Hadoop 的配置文件目录,存放 Hadoop 的配置文件;
  • lib 目录:存放 Hadoop 的本地库(对数据进行压缩解压缩功能);
  • sbin 目录:存放启动或停止 Hadoop 相关服务的脚本;
  • share 目录:存放 Hadoop 的依赖 jar 包、文档、和官方案例

(2)设置到环境变量中

通过查看 /etc/profile 可以看到会去加载 /etc/profile.d 下的所有脚本:

新建 vim /etc/profile.d/my_env.sh,内容如下:

#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_361
export PATH=$PATH:$JAVA_HOME/bin

#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

最后执行 source /etc/profile 命令使环境变量生效。

4.4 运行模式

  • 本地模式:单机运行,只是用来演示一下官方案例;
  • 伪分布式模式:也是单机运行,但是具备 Hadoop 集群的所有功能,一台服务器模拟一个分布式的环境;
  • 完全分布式模式:多台服务器组成分布式环境(生产环境)。

【本地模式案例:统计单词词频】

  1. 创建在 hadoop-3.1.3 文件下面创建一个 wcinput 文件夹;
  2. 在 wcinput 目录下创建一个 word.txt 文件,并写入一些单词(单词之间换行);
  3. 回到 Hadoop 目录/opt/module/hadoop-3.1.3 并执行程序:hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput wcoutput
  4. 到 wcoutput 目录下查看结果。

4.5 前置工作

  1. 准备 3 台客户机(静态 IP、主机名称)
  2. 安装 JDK
  3. 配置环境变量
  4. 安装 Hadoop
  5. 配置环境变量
  6. 配置集群
  7. 单点启动
  8. 配置 ssh
  9. 群起并测试集群

a. scp 安全拷贝

  • scp(secure copy):可以实现服务器与服务器之间的数据拷贝。
  • 基本语法
scp    -r      $pdir/$fname             $user@$host:$pdir/$fname
命令   递归   要拷贝的文件路径/名称         目的地用户@主机:目的地路径/名称

【前提】在 hadoop102、hadoop103、hadoop104 都已经创建好的/opt/module、/opt/software 两个目录,并且已经把这两个目录修改为 liujiaqi:liujiaqi。

将 hadoop102 上的 jdk、hadoop 的压缩包拷贝到 hadoop103、hadoop104:

[root@hadoop102 /]# scp -r /opt/software/* root@hadoop104:/opt/software/
The authenticity of host 'hadoop104 (192.168.206.104)' can't be established.
ECDSA key fingerprint is SHA256:B7jphJzhPrF5/Lu0BxJtUUwQrCHyFn3ssHH3AL+M99A.
ECDSA key fingerprint is MD5:44:d0:18:3d:1d:92:1e:3f:84:e5:d6:17:ca:8e:23:70.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hadoop104,192.168.206.104' (ECDSA) to the list of known hosts.
root@hadoop104's password:
hadoop-3.1.3.tar.gz                                                             100%  322MB  23.0MB/s   00:14
jdk-8u212-linux-x64.tar.gz                                                      100%  186MB  20.7MB/s   00:09

【补充】站在 hadoop103 的角度,将 hadoop102 的数据拷贝到本地,只需将参数位置调换即可;站在 hadoop103 的角度,将 hadoop102 的数据拷贝到 hadoop104 同理,将两个参数都设置为 $user@$host:$pdir/$fname 的格式。

b. rsync 远程同步工具

https://blog.csdn.net/qq_32706349/article/details/91451053

rsync 主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。

rsync 和 scp 区别:用 rsync 做文件的复制要比 scp 的速度快,rsync 只对差异文件做更新,scp 是把所有文件都复制过去。rsync 的目的是实现本地主机和远程主机上的文件同步(包括本地推到远程,远程拉到本地两种同步方式),也可以实现本地不同路径下文件的同步,但不能实现远程路径 1 到远程路径 2 之间的同步(scp 可以实现)。

rsync 同步过程中由两部分模式组成:〈决定哪些文件需要同步的检查模式〉以及〈文件同步时的同步模式〉。

Local:  rsync [OPTION...] SRC... [DEST]

Access via remote shell:
  Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
  Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

Access via rsync daemon:
  Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
        rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
  Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
        rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

---------------------- a 归档拷贝;v 显示复制过程 ----------------------

rsync  -av        $pdir/$fname             $user@$host:$pdir/$fname
命令  选项参数    要拷贝的文件路径/名称        目的地用户@主机:目的地路径/名称

【注】源路径如果是一个目录的话,带上尾随斜线和不带尾随斜线是不一样的,不带尾随斜线表示的是整个目录包括目录本身,带上尾随斜线表示的是目录中的文件,不包括目录本身。

编写集群分发脚本:

(1)期望脚本在任何路径都能使用(脚本放在声明了全局环境变量的路径);

[liujiaqi@hadoop102 ~]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/module/jdk1.8.0_212/bin
:/opt/module/hadoop-3.1.3/bin:/opt/module/hadoop-3.1.3/sbin:/root/bin:/home/liujiaqi/bin

(2)使用 xsync 要同步的文件名称 即可实现复制文件到所有节点的相同目录下(在 /home/liujiaqi/bin 目录下创建 xsync 文件);

#!/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. 获取父目录 (-P 表示使用的是物理地址,不会则跟着符号链接走)
      pdir=$(cd -P $(dirname $file); pwd)
      # 6. 获取当前文件的名称
      fname=$(basename $file)
      # 7. 创建目标路径 (-p 保证就算dir已存在也不会报错)
      ssh $host "mkdir -p $pdir"
      # 8. 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
      rsync -av $pdir/$fname $host:$pdir
    else
      echo $file does not exists!
    fi
  done
done

(3)修改脚本 xsync 具有执行权限 chmod +x xsync

(4)将脚本复制到 /bin 中,以便全局调用 sudo cp xsync /bin/

(5)同步环境变量配置(root 所有者):sudo xsync /etc/profile.d/my_env.sh

c. ssh 免密登录

使用命令 ssh-keygen -t rsa 然后敲 3 次回车,就会生成两个文件:id_rsa(私钥)、id_rsa.pub(公钥)。

将公钥拷贝到要免密登录的目标机器上:

[liujiaqi@hadoop102 .ssh]$ ssh-copy-id hadoop102
[liujiaqi@hadoop102 .ssh]$ ssh-copy-id hadoop103
[liujiaqi@hadoop102 .ssh]$ ssh-copy-id hadoop104

posted @ 2023-06-19 23:35  tree6x7  阅读(54)  评论(0编辑  收藏  举报