大数据定义
定义:大数据主要解决,海量数据的采集、存储、分析计算问题。
特点:Volume(大量) Velocity(高速) Variety(多样) Value(低价值密度)
创始人 Doug Cutting
1、 Hadoop1.x、2.x、 3.x区别
2、HDFS架构概述
Hadoop Distributed File System,简称HDFS,是一个 分布式文件系统。
3、YARN架构概述
YetAnother Resource Negotiator简称YARN,另一种资源协调者,是Hadoop的资源管理器。
epel-releaes
命令:yum install -y epel-release
如果yum.pid进程被锁定,就kill -9 被锁定的进程号
,再重新执行命令yum install -y epel-release
net-tools
net-tool:工具包集合,包含ifconfig等命令
安装命令:yum install -y net-too ls
关闭当前防火墙:systemctl stop firewalld
开机关闭防火墙:systemctl disable firewalld.service
注:在企业开发时,通常单个服务器的防火墙是关闭的。公司整体对外会设置安全的防火墙。
创建:useradd atguigu
修改: passwd atguigu
方便后期加sudo执行root权限的命令
修改etc/sudoers
.文件,在%wheel 这行下面添加一行, 如下所示:。
进入文件后,一直下拉找到下图所示语句。
注: atguigu这一行不要 直接放到root行下面,因为所有用户都属于wheel组,你先配置了atguigu 县有免密功能,但是程序执行到%wheel行时,该功能又被覆盖回需要密码。所以atguigu要放到%wheel这行下面。
关键点:sudo (加sudo执行root权限的命令)
右键点击下图位置,悬停”管理“选项,点击“克隆”
下一步,到下图选择 “创建完整克隆”
再编辑虚拟机名称,选择虚拟机要克隆到的地址,点击完成。
①将JDK文件通过Xftp拷贝到指定的目录文件夹下
②解压JDK文件到相应文件夹,例:tar -zxvf jdk-8u281-linux-x64.tar.gz -C /opt/module/
③进入JDK文件夹下,cd jdk-8u281-linux-x64.tar.gz
④配置JDK环境变量
1.vim /etc/profile
2. cd /etc/profile.d
3. 创建并配置JAVA环境变量 vim my_env.sh
4. 编辑 my_env.sh 文件, 如下:
#JAVA_HOME
#export 全局变量
#JAVA文件的路径
export JAVA_HOME=/opt/module/jdk1.8.0_281
export PATH=$PATH:$JAVA_HOME/bin
5.重新遍历文件使配置的JAVA文件生效source /etc/profile
6.安装成功验证:java -version
1.解压Hadoop文件,例: tar -zxvf hadoop-2.7.3.tar.gz -C /opt/module
2. 进入Hadoop文件下,例:cd hadoop-2.7.3
3.pwd
,复制路径
3. 创建并配置Hadoop环境变量,vim /etc/profile.d/my_env.sh
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
4.遍历profile文件source /etc//profile
,使配置的环境变量文件生效
Hadoop运行模式包括:本地模式、伪分布式模式以及完全分布式模式。
1、本地模式
数据存储在linux本地
单机运行,只是用来演示下官方案例。(生产环境不用)
2、伪分布式模式
数据存储在HDFS
单机运行,但是具备Hadoop集群的所有功能,一台 服务器模拟一个分布式的环境。(个别缺钱的公司用来测试,生产环境不用。)
3、完全分布式模式
数据存储在HDFS
多台服务器组成分布式环境。(生产环境使用)
①在hadoop-3.1.3文件下面创建一个 wcinput文件夹 mkdir wcinput
②在wcinput文件下创建一个word.txt文件 cd wcinput
③编辑word.txt文件 vim word. txt
(随便写入几个单词)
④执行程序:bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount wcinput/ wcoutput
⑤查看结果cat wcoutput/part-r-00000
1.准备3台客户机(关闭防火墙、静态IP、 主机名称)。
2.安装JDK
3.配置环境变量
4.安装Hadoop
5.配置环境变量
6.配置集群
7.单点启动
8.配置ssh
9.群起并测试集群
(1) scp 定义
scp可以实现服务器与服务器之间的数据拷贝。( from server1 to server2)
(2)基本语法
scp -r $pdir/$fname $user@host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
实例:将YZ2中的 /opt/module/hadoop-2.7.3 拷贝到 YZ3中。
方式一:YZ2给YZ3推数据
scp -r jdk1.8.0_281/ root@YZ3:/opt/module/
方式二: YZ3从YZ2拉数据
scp -r root@YZ2:/opt/module/hadoop-2.7.3 ./
(./表示当前目录下)
方式三:YZ3让YZ2给YZ4传数据
scp -r root@YZ2:/opt/module/* root@YZ4:/opt/module/
(/* 表示目录下所有文件)
(1)基本语法
rsync -av $pdir/$fname $user@$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
选项参数 | 功能 |
---|---|
-a | 归档拷贝 |
-v | 显示复制过程 |
实例: | |
删除YZ3中的/opt/module/hadoop-2.7.3/wcinput | |
rm -rf wcinput |
|
同步YZ2中的/opt/module/hadoop-2.7.3到YZ3 | |
rsync -av hadoop-2.7.3/ root@YZ3:/opt/module/hadoop-2.7.3/ |
报错:rsync找不到命令: yum -y install rsync 安装rsync(YZ2、YZ3都要装)
(1)需求:循环复制文件到所有节点的相同目录下。
(2)需求分析:
① rsync ,命令原始拷贝: rsync -av /opt/module root@YZ3:/opt/
②期望脚本在任何路径都能使用(脚本放在声明了全局环境变量的路径)
查看当前环境变量:echo $PATH
方式一:创建并编写xsync文件,将xsync文件配置到环境变量中,达到全局使用的目的
方式二:在用户家目录下创建一个bin目录,在bin目录下创建一个脚本文件,便可全局使用
以root用户为例:
①cd /root
②mkdir bin
③cd bin
④vim xsync (
在该文件中编写如下代码
#!/bin/bash
#1.判断参数个数
if [ $# -lt 1]
then
echo Not Enough Arguement!
exit;
fi
#2.遍历集群所有机器
for host in YZ2 YZ3 YZ4
do
echo ========= $host =========
#3.遍历所有目录,挨个发送
for file in $@
do
#4.判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -p $(dirname $file);pwd)
#6.获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
)
⑤修改 xsync 具有执行权限
chmod 777 xsync
若显示没找到命令就装一个(yum install -y chomd)
注:所要拷贝到的节点也要安装 rsync ,(yum install -y rsync),否者拷贝不成功。
⑥此时便可以成功拷贝文件到其他节点,例: xsync a.txt
指令:ssh-keygen -t rsa
①到用户所在的家目录下
②查看隐藏文件 ls -al
③进入.ssh文件
④创建密匙 ssh-keygen -t rsa
⑤拷贝公钥到YZ3和YZ4 ssh-copy-id YZ3
⑥ssh YZ3
便可登录到YZ3 (返回自己的用户 exit
)
打开浏览器,再浏览器网址处输入:前面为自己的虚拟机IP地址,例:192.168.187.198:50070
注:①hadoop集群程序是开启状态
②192.168.187.198:50070,ip 需为master主节点IP。
hadoopfs具体命令 OR hdlfsdfs 具体命令,两个是完全相同的。
hadoop fs , hdfs dfs 命令列表
[atguigu@hadoop102 hadoop-3.1.3]1$ sbin/start-dfs.sh
[ atguigu@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.shk
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -help rm
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir ./sanguo
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -moveFromLocal ./shuguo.txt /sanguo
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -copyFromLocal weiguo.txt /sanguo
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -put ./wuguo.txt /sanguo
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -appendToFile liubei.txt /sanguo/shuguo.txt
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -copyToLocal /sanguo/shuguo.txt ./
[atguigu@hadoop102 hadoop-3. 1.3]$ hadoop fs -get /sanguo/shuguo.txt ./shuguo2.txt
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -ls /sanguo
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -cat /sanguo/shuguo.txt
chgrp 命令更改【目录或文件所属的组】
chgrp [-R]目录 或 文件
######将/usr/meng及其子目录下的所有文件的用户组改为mengxin
hadoop fs -chgrp -R mengxin /usr/meng
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -chmod 666 /sanguo/shuguo.txt
chown -R 文件的新拥有者 文件名
[atguigu@hadoop102 hadoop-3. 1.3]$ hadoop fs -chown atguigu:atguigu/sanguo/shuguo.txt
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /jinguo
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -cp /sanguo/shuguo.txt /jinguo
[atguigu@hadoop102 hadoop-3.1.31$ hadoop fs -mv /sanguo/wuguo.txt /jinguo
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -tail /jinguo/shuguo.txt
[atguigu@hadoop102 hadoop-3.1.31$ hadoop fs -rm /sanguo/shuguo.txt
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -rm -r /sanguo
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -du -s -h /jinguo
效果:27 81 /jinguo
[atguigu@hadoop102 hadoop-3. 1.3]$ hadoop fs -du -h /jinguo
效果:
14 42 /jinguo/shuguo.txt
7 21 /jing/weiguo.txt
6 18 /jinguo/wuguo.txt
说明: 27表示文件大小; 81 表示27*3个副本; /jinguo 表示查看的目录
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -setrep 10 /jinguo/shuguo.txt
效果:
这里设置的副本数只是记录在NameNode的元数据中,是否真的会有这么多副本,还得看DataNode的数量。因为目前只有3台设备,最多也就3个副本,只有节点数的增加到10台时,副本数才能达到10。
在HDFS写数据的过程中,NameNode会选择距离待上传数据最近距离的DataNode接收数据。那么这个最近距离怎么计算呢?
节点距离:两个节点到达最近的共同祖先的距离总和。
MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。
MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。
优点:
1、易于编程。 用户只关心,业务逻辑。 实现框架的接口。
2、良好扩展性:可以动态增加服务器,解决计算资源不够问题
3、高容错性。任何一台机器挂掉,可以将任务转移到其他节点。
4、适合海量数据计算(TB/PB)几千 台服务器共同计算。
缺点:
1、不擅长实时计算。Mysql
2、不擅长流式计算。Sparkstreaming flink
3、不擅长DAG有向无环图计算。spark
一个完整的MapReduce程序在分布式运行时有三类实例进程:
(1) MrAppMaster:负责整个程序的过程调度及状态协调。
(2)MapTask:负责Map阶段的整个数据处理流程。
(3) ReduceTask: 负责Reduce阶段的整个数据处理流程。
采用反编译工具反编译源码,发现WordCount案例有Map类、Reduce 类和驱动类。且数据的类型是Hadoop自身封装的序列化类型。
用户编写的程序分成三个部分: Mapper、 Reducer 和Driver。
1.Mapper阶段
2、Reducer阶段
(1) 用户自定义的Reducer要继承自己的父类
(2) Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
(3) Reducer 的业务逻辑写在reduce()方法中
(4) Reduce’ Task进程对每一-组相同k的 k,v>组调用一次reduce( )方法
3、Driver阶段
相当于YARN集群的客户端,用于提交我们整个程序到YARN集群,提交的是封装了MapReduce程序相关运行参数的job对象。
需求:在给定的文本文件中统计输出每一个单词出现的总次数
①输入数据
②期望输出数据
dian 3
yuzai 2
love 1
分析需求:
按照MapReduce编程规范,分别编写Mapper,Reducer, Driver。
Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之,上的应用程序。
YARN主要由ResourceManager、NodeManager、 ApplicationMaster 和Container等组件构成。
①ResourceManager (RM)
整个集群资源的boss
②NodeManager (NM)
单节点资源的boss
③ApplicationMaster (AM)
每一个作业资源的boss
④Container
相应的容器
目前,Hadoop作业调度器主要有三种: FIFO、 容量(Capacity Scheduler)和公平(FairScheduler)。 Apache Hadoop3.1 .3默认的资源调度器是Capacity Scheduler。
CDH 框架默认调度器是FairScheduler
FIFO调度器(First In FirstOut) :单队列,根据提交作业的先后顺序,先来先服务。
Capacity Scheduler是Yahoo开发的多用户调度器。
1、多队列:每个队列可配置-定的资源量, 每个队列采用FIFO调度策略。
2、容量保证:管理员可为每个队列设置资源最低保证和资源使用上限
3、灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
4、多租户:
支持多用户共享集群和多应用程序同时运行。
为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。
Yarn状态的查询,除了可以在hadoop103:8088页面查看外,还可以通过命令操作。常见的命令操作如下所示:
需求:执行WordCount案例,并用Yarn 命令查看任务运行情况。
[atguigu@hadoop102 hadoop-3.1.3]$ myhadoop.sh start
$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output1
(1)列出Application
[atguigu@hadoop102 hadoop-3.1.3]$ yarn application -list
(2)根据Application状态过滤: yarn application -list -appStates (所有状态: ALL、 NEW、NEW_ SAVING、 SUBMITTED、ACCEPTED、RUNNING、FINISHED、 FAILED、 KILLED)
[ atguigu@hadoop102hadoop-3.1.3]$ yarn application -list -appStates FINISHED
(3)Kill 掉 Application:
[atguigu@hadoop102 ~]$ yarn application -kill application_1612659778342_0001
(1)查询Application日志:
yarn logs -applicationId ApplicationId application_1612659778342_0001
(2)查询Container日志:
yarn logs -applicationId <ApplicationId> -containerd <ContainerId>
(1)列出所有Application尝试的列表:
yarn applicationattempt -list <ApplicationId>
[atguigu@hadoop102 hadoop-3.1.3]$ yarn applicationattempt -list application_1612577921195_0001
(2)打印ApplicationAttemp状态:
yarn applicationattempt -status <ApplicationAttemptId>
(1)列出所有Container:
yarn container -list <ApplicationAttemptId>
(2)打印Container状态:
yarn container -status <ContainerId>
注:只有在任务跑的途中才能看到container的状态
列出所有节点:
yarn node -list -alk
加载队列配置:
yarn rmadmin -refreshQueues
打印队列信息:
yarn queue -status <QueueName>