大数据(big data):指无法在一定时间范围内
用常规软件工具
进行
捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、
洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。
主要解决,海量数据的存储
和海量数据的分析
计算问题。
》1:大数据特点之Volume(大量)
当前,典型个人计算机硬盘的容量为TB量级,
而一些大企业的数据量已经接近EB量级。
按顺序给出数据存储单位: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
》2:大数据特点之Velocity(高速)
猫双十一: 2017年3分01秒,天猫交易额超过100亿
2018年2分05秒,天猫交易额超过100亿
2019年1分36秒,天猫交易额超过100亿
在如此海量的数据面前,处理数据的效率
就是企业的生命。
》3:大数据特点之Variety(多样)
这种类型的多样性也让数据被分为结构化数据和非结构化数据。
相对于以往便于存储的以数据库/文本为主的结构化数据,
非结构化数据越来越多
,包括网络日志、音频、视频、图片、地理位置信息
等,
这些多类型的数据对数据的处理能力提出了更高要求。
》4:大数据特点之Value(低价值密度)
价值密度的高低与数据总量的大小成反比。
如何快速对有价值数据提纯
成为目前大数据背景下待解决的难题。
(1)物流仓储
(2)零售
(3)旅游
(4)商品广告推荐
(5)保险、金融及房产
(6)人工智能
(1)产品人员提需求(统计总用户数、日活跃用户数、回流用户数等)
(2)数据部门搭建数据平台、分析数据指标
(3)数据可视化(报表展示、邮件发送、大屏幕展示等)
(1)Hadoop是一个由Apache基金会所开发的分布式系统基础架构
(2)主要解决,海量数据的存储
和海量数据的分析计算
问题。
(3)广义上来说,HADOOP通常是指一个更广泛的概念——HADOOP生态圈
(1)Lucene–Doug Cutting开创的开源软件,用java书写代码,实现与Google类似的全文搜索功能,它提供了全文检索引擎的架构,包括完整的查询引擎和索引引擎
(2)2001年年底成为apache基金会的一个子项目
(3)对于大数量的场景,Lucene面对与Google同样的困难
(4)学习和模仿Google解决这些问题的办法 :微型版Nutch
(5)可以说Google是hadoop的思想之源(Google在大数据方面的三篇论文)
GFS --->HDFS
Map-Reduce --->MR
BigTable --->Hbase
(6)2003-2004年,Google公开了部分GFS和Mapreduce思想的细节,
以此为基础Doug Cutting等人用了2年业余时间实现了DFS和Mapreduce机制,
使Nutch性能飙升
(7)2005 年Hadoop 作为 Lucene的子项目 Nutch的一部分正式引入Apache基金会。
2006 年 3 月份,Map-Reduce和Nutch Distributed File System (NDFS) 分别被纳入称为 Hadoop 的项目中
(8)名字来源于Doug Cutting儿子的玩具大象
(9)Hadoop就此诞生并迅速发展,标志这云计算时代来临
Hadoop三大发行版本:Apache、Cloudera、Hortonworks。
Apache版本最原始(最基础)的版本,对于入门学习最好。
Cloudera内部集成了很多大数据框架。对应产品CDH。
Hortonworks文档较好。对应产品HDP。
Apache Hadoop
官网地址:http://hadoop.apache.org/releases.html
下载地址:https://archive.apache.org/dist/hadoop/common/
(1)高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失。
(2)高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点。
(3)高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度。
(4)高容错性:能够自动将失败的任务重新分配。
》1:安装VMWare
》2:安装虚拟机
》3:克隆修改
Hadoop运行模式
Hadoop运行模式包括:本地模式、伪分布式模式以及完全分布式模式。
Hadoop官方网站:http://hadoop.apache.org/
1)准备3台客户机(关闭防火墙、静态ip、主机名称)
2)安装JDK
3)配置环境变量
4)安装Hadoop
5)配置环境变量
6)配置ssh
7)配置集群
8)单点启动
9)群起并测试集群
1)将JDK安装包上传到Linux /opt/software目录下
2)解压JDK到/opt/module目录下
tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/
3)配置JDK环境变量,两种方式:
(1)新建/etc/profile.d/my_env.sh文件
sudo vim /etc/profile.d/my_env.sh
添加如下内容
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
(2)保存后退出
:wq
(3)重启xshell窗口,让环境变量生效
(1)直接将环境变量配置到 /etc/profile 文件中,在/etc/profile文件的末尾追加如下内容:
JAVA_HOME=/opt/module/jdk1.8.0_212
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME
(2)保存退出,然后执行如下命令
source /etc/profile
4). 测试JDK是否安装成功
java -version
如果能看到以下结果、则Java正常安装
java version "1.8.0_212"
注意:重启(如果java -version可以用就不用重启)
sudo reboot
注意:
如果出现openJDK的提示 如下
[dev1@hadoop101 software]$ java -version
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)
则需要卸载openJDK
》1:搜索openjdk安装文件
[dev1@hadoop101 software]$ rpm -qa | grep openjdk
java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64
java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64
》2:逐个卸载并测试
[dev1@hadoop102 software]$ sudo rpm -e --nodeps java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64
[dev1@hadoop102 software]$ sudo rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64
[dev1@hadoop102 software]$ source /etc/profile
[dev1@hadoop102 software]$ java -version
Hadoop下载地址:
https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/
1)将hadoop安装包上传到/opt/software目录下
2)解压安装文件到/opt/module下面
[dev1@hadoop102 software]$ tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/
3)查看是否解压成功
[dev1@hadoop102 software]$ ls /opt/module/
hadoop-3.1.3
4)将Hadoop添加到环境变量
(1)获取Hadoop安装路径
[dev1@hadoop102 hadoop-3.1.3]$ pwd
/opt/module/hadoop-3.1.3
(2)打开/etc/profile文件
sudo vim /etc/profile
在profile文件末尾添加:(shitf+g)
HADOOP_HOME=/opt/module/hadoop-3.1.3
PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export PATH HADOOP_HOME
(3)保存后退出
:wq
(4)让修改后的文件生效
[dev1@ hadoop102 hadoop-3.1.3]$ source /etc/profile
5)测试是否安装成功
[dev1@hadoop102 hadoop-3.1.3]$ hadoop version
Hadoop 3.1.3
6)重启(如果Hadoop命令不能用再重启)
[dev1@ hadoop102 hadoop-3.1.3]$ sync
[dev1@ hadoop102 hadoop-3.1.3]$ sudo reboot
(a)期望脚本:
xsync 要同步的文件名称
(b)说明:在/home/dev1/bin这个目录下存放的脚本,dev1用户可以在系统任何地方直接执行。
(3)脚本实现
(a)在/home/dev1目录下创建bin目录,并在bin目录下创建xsync文件
[dev1@hadoop102 hadoop] cd /home/dev1
[dev1@hadoop102 ~] mkdir bin
[dev1@hadoop102 ~] cd /home/dev1/bin
[dev1@hadoop102 bin] touch xsync
[dev1@hadoop102 bin] vim 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. 获取父目录
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
(b)修改脚本 xsync 具有执行权限
chmod +x xsync
(c)测试脚本
xsync /opt/software
rsync -av /etc/profile root@hadoop102:/etc/ #每台执行source /etc/profile
1.配置ssh
(1)基本语法
ssh另一台电脑的ip地址
(2)ssh连接时出现Host key verification failed的解决方法
ssh hadoop103
出现:
The authenticity of host '192.168.1.103 (192.168.1.103)' can't be established.
RSA key fingerprint is cf:1e:de:d7:d0:4c:2d:98:60:b4:fd:ae:b1:2d:ad:06.
Are you sure you want to continue connecting (yes/no)?
(3)解决方案如下:直接输入yes
2.无密钥配置
(1)免密登录原理,如图4-2所示
(2)生成公钥和私钥:
ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
(3)将公钥拷贝到要免密登录的目标机器上
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
注意:
还需要在hadoop102上采用root账号,配置一下无密登录到hadoop102、hadoop103、hadoop104;
还需要在hadoop103上采用dev1账号配置一下无密登录到hadoop102、hadoop103、hadoop104服务器上。
3..ssh文件夹下(~/.ssh)
的文件功能解释
known_hosts 记录ssh访问过计算机的公钥(public key)
id_rsa 生成的私钥
id_rsa.pub 生成的公钥
authorized_keys 存放授权过的无密登录服务器公钥
(1)NameNode(nn):存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等。
(2)DataNode(dn):在本地文件系统存储文件块数据,以及块数据的校验和。
(3)Secondary NameNode(2nn):用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。
-(1)ResourceManager(rm):
处理客户端请求、启动/监控ApplicationMaster、监控NodeManager、资源分配与调度;
-(2)NodeManager(nm):
单个节点上的资源管理、处理来自ResourceManager的命令、处理来自ApplicationMaster的命令;
-(3)ApplicationMaster:
数据切分、为应用程序申请资源,并分配给内部任务、任务监控与容错。
-(4)Container:
对任务运行环境的抽象,封装了CPU、内存等多维资源以及环境变量、启动命令等任务运行相关的信息。
MapReduce将计算过程分为两个阶段:Map和Reduce
-(1)Map阶段并行处理输入数据
-(2)Reduce阶段对Map结果进行汇总
1、查看Hadoop目录结构
[dev1@hadoop101 hadoop-3.1.3]$ ll
总用量 52
drwxr-xr-x. 2 dev1 dev1 4096 6月 22 2022 bin
drwxr-xr-x. 3 dev1 dev1 4096 6月 22 2022 etc
drwxr-xr-x. 2 dev1 dev1 4096 6月 22 2022 include
drwxr-xr-x. 3 dev1 dev1 4096 6月 22 2022 lib
drwxr-xr-x. 2 dev1 dev1 4096 6月 22 2022 libexec
-rw-r--r--. 1 dev1 dev1 15429 6月 22 2022 LICENSE.txt
-rw-r--r--. 1 dev1 dev1 101 6月 22 2022 NOTICE.txt
-rw-r--r--. 1 dev1 dev1 1366 6月 22 2022 README.txt
drwxr-xr-x. 2 dev1 dev1 4096 6月 22 2022 sbin
drwxr-xr-x. 4 dev1 dev1 4096 6月 22 2022 share
2、重要目录
(1)bin目录:存放对Hadoop相关服务(HDFS,YARN)进行操作的脚本
(2)etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件
(3)lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)
(4)sbin目录:存放启动或停止Hadoop相关服务的脚本
(5)share目录:存放Hadoop的依赖jar包、文档、和官方案例
表4-4
注意:NameNode和SecondaryNameNode不要安装在同一台服务器
注意:ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上。
(1)核心配置文件
配置core-site.xml
cd $HADOOP_HOME/etc/hadoop
vim core-site.xml
文件内容如下:
fs.defaultFS
hdfs://hadoop102:8020
hadoop.data.dir
/opt/module/hadoop-3.1.3/data
hadoop.proxyuser.dev1.hosts
*
hadoop.proxyuser.dev1.groups
*
(2)HDFS配置文件
配置hdfs-site.xml
vim hdfs-site.xml
文件内容如下:
dfs.namenode.name.dir
file://${hadoop.data.dir}/name
dfs.datanode.data.dir
file://${hadoop.data.dir}/data
dfs.namenode.checkpoint.dir
file://${hadoop.data.dir}/namesecondary
dfs.client.datanode-restart.timeout
30
dfs.namenode.secondary.http-address
hadoop104:9868
(3)YARN配置文件
配置yarn-site.xml
vim yarn-site.xml
文件内容如下:
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.hostname
hadoop103
yarn.nodemanager.env-whitelist
JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME
(4)MapReduce配置文件
配置mapred-site.xml
vim mapred-site.xml
文件内容如下:
mapreduce.framework.name
yarn
3.在集群上分发配置好的hadoop
xsync /opt/module/hadoop-3.1.3
4.查看文件分发情况
例:在hadoop104上
vim /opt/module/hadoop-3.1.3/etc/hadoop/mapred-site.xml
(1)如果集群是第一次启动,需要格式化NameNode
hdfs namenode -format
(2)在hadoop102上启动NameNode
hdfs --daemon start namenode
完成后执行jps命令,看到如下结果(进程号可能不同):
3461 NameNode
(3)在hadoop102、hadoop103以及hadoop104上执行如下命令(三台都要执行)
hdfs --daemon start datanode
然后可以访问
http://hadoop102:9870/
(4)思考:每次都一个一个节点启动,如果节点数增加到1000个怎么办?
早上来了开始一个一个节点启动,到晚上下班刚好完成,下班?
1.配置workers
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
在该文件中增加如下内容:
hadoop102
hadoop103
hadoop104
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
同步所有节点配置文件
xsync workers
2.启动集群
(1)如果集群是第一次启动,需要在hadoop102节点格式化NameNode(注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据)
hdfs namenode -format
(2)启动HDFS
sbin/start-dfs.sh
(3)在配置了ResourceManager的节点(hadoop103)启动YARN
sbin/start-yarn.sh
注意,如果出现以下提示
[dev1@hadoop102 hadoop-3.1.3]$ start-dfs.sh
Starting namenodes on [hadoop102]
hadoop102: ERROR: JAVA_HOME is not set and could not be found.
Starting datanodes
hadoop102: ERROR: JAVA_HOME is not set and could not be found.
hadoop103: ERROR: JAVA_HOME is not set and could not be found.
hadoop104: ERROR: JAVA_HOME is not set and could not be found.
则需要在/opt/module/hadoop-3.1.3/etc/hadoop/hadoop-env.sh中添加变量
export JAVA_HOME=/opt/module/jdk1.8.0_212
再发送到其他节点
xsync /opt/module/hadoop-3.1.3/etc/hadoop/hadoop-env.sh
3.集群基本测试
(1)上传文件到集群
上传小文件
hadoop fs -mkdir -p /user/dev1/input
hadoop fs -put $HADOOP_HOME/wcinput/wc.input /user/dev1/input
上传大文件
hadoop fs -put /opt/software/hadoop-3.1.3.tar.gz /
(2)下载
[dev1@hadoop102 hadoop-3.1.3]$ bin/hadoop fs -get
/hadoop-3.1.3.tar.gz ./
(3)执行wordcount程序
[dev1@hadoop102 hadoop-3.1.3]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /user/dev1/input /user/dev1/output
1.各个服务组件逐一启动/停止
(1)分别启动/停止HDFS组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
(2)启动/停止YARN
yarn --daemon start/stop resourcemanager/nodemanager
2.各个模块分开启动/停止(配置ssh是前提)常用
(1)整体启动/停止HDFS
start-dfs.sh/stop-dfs.sh
(2)整体启动/停止YARN
start-yarn.sh/stop-yarn.sh
为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:
1.配置mapred-site.xml
vi mapred-site.xml
在该文件里面增加如下配置。
mapreduce.jobhistory.address
hadoop102:10020
mapreduce.jobhistory.webapp.address
hadoop102:19888
2.分发配置
xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
3.在hadoop102启动历史服务器
mapred --daemon start historyserver
4.查看历史服务器是否启动
jps
5.查看JobHistory
http://hadoop102:19888/jobhistory
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager。
开启日志聚集功能具体步骤如下:
1.配置yarn-site.xml
vim yarn-site.xml
在该文件里面增加如下配置。
yarn.log-aggregation-enable
true
yarn.log.server.url
http://hadoop102:19888/jobhistory/logs
yarn.log-aggregation.retain-seconds
604800
2.分发配置
xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
3.关闭NodeManager 、ResourceManager和HistoryServer
在103上执行: stop-yarn.sh
在102上执行: mapred --daemon stop historyserver
4.启动NodeManager 、ResourceManager和HistoryServer
在103上执行:start-yarn.sh
在102上执行:mapred --daemon start historyserver
5.删除HDFS上已经存在的输出文件
hdfs dfs -rm -R /user/dev1/output
6.执行WordCount程序
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /user/dev1/input /user/dev1/output
7.查看日志,如图4-3,4-4,4-5所示
http://hadoop102:19888/jobhistory
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。
图4-6 时间同步
配置时间同步具体实操:
0.检查是否已安装ntpd
rpm -qa | grep ntp
有以上两个包则证明已经安装NTP服务,如果仅有一个,建议卸载后重新安装。使用rpm -e --nodeps xxx命令卸载。
再安装
yum install -y ntp
1.时间服务器配置(必须root用户)
(1)在所有节点关闭ntp服务和自启动
sudo systemctl stop ntpd
sudo systemctl disable ntpd
(2)修改ntp配置文件
vim /etc/ntp.conf
修改内容如下
a)修改1(授权192.168.1.0-192.168.1.255网段上的所有机器可以从这台机器上查询和同步时间)
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
为
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
b)修改2(集群在局域网中,不使用其他互联网上的时间)
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 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
c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
(3)修改/etc/sysconfig/ntpd 文件
vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
Tips:
系统时间: 一般说来就是我们执行 date命令看到的时间,linux系统下所有的时间调用(除了直接访问硬件时间的命令)都是使用的这个时间。
硬件时间: 主板上BIOS中的时间,由主板电池供电来维持运行,系统开机时要读取这个时间,并根据它来设定系统时间(注意:系统启动时根据硬件时间设定系统时间的过程可能存在时区换算,这要视具体的系统及相关设置而定)
(4)重新启动ntpd服务
systemctl start ntpd
(5)设置ntpd服务开机启动
systemctl enable ntpd
2.其他机器配置(必须root用户)
(1)在其他机器配置10分钟与时间服务器同步一次
crontab -e
编写定时任务如下:
*/10 * * * * /usr/sbin/ntpdate hadoop102
(2)修改任意机器时间
date -s "2017-9-11 11:11:11"
(3)十分钟后查看机器是否与时间服务器同步
date
说明:测试的时候可以将10分钟调整为1分钟,节省时间。
Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
17/05/22 15:38:58 INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
java.net.UnknownHostException: hadoop102: hadoop102
at java.net.InetAddress.getLocalHost(InetAddress.java:1475)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:146)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
解决办法:
(1)在/etc/hosts文件中添加192.168.1.102 hadoop102
(2)主机名称不要起hadoop hadoop000等特殊名称
(9)DataNode和NameNode进程同时只能工作一个。
(10)执行命令不生效,粘贴word中命令时,遇到-
和长–
没区分开。导致命令失效
解决办法:尽量不要粘贴word中代码
。
(11)jps发现进程已经没有,但是重新启动集群,提示进程已经开启。
原因是在linux的根目录下/tmp目录中存在启动的进程临时文件,将集群相关进程删除掉,
再重新启动集群。
(12)jps不生效。
原因:全局变量hadoop java没有生效。解决办法:需要source /etc/profile
文件。
(13)8088端口连接不上
[dev1@hadoop102 桌面]$ cat /etc/hosts
注释掉如下代码
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 hadoop102
(1)产生背景
随着数据量越来越大
,在一个操作系统
管辖的范围内存不下
了,那么就分配到更多的
操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件
,这就是分布式文件管理系统
。HDFS只是分布式文件管理系统中的一种
。
(2)HDFS定义
HDFS,它是一个文件系统
,用于存储文件,通过目录树来定位文件
;
其次,它是分布式
的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
HDFS的设计适合一次写入,多次读出的场景,且不支持文件的修改
。适合用来做数据分析
,并不适合用来做网盘应用。
(1)高容错性
- 数据自动保存多个副本。它通过增加副本的形式,提高容错性。
- 某一个副本丢失以后,它可以自动恢复。
(2)适合大数据处理
- 数据规模:能够处理数据规模达到 GB、TB、甚至PB级别的数据。
- 文件规模:能够处理百万规模以上的文件数量,数量相当之大。
(3)流式数据访问,它能保证数据的一致性。
(4)可构建在廉价机器上,通过多副本机制,提高可靠性。
(1)不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。
(2)无法高效的对大量小文件进行存储
- 存储大量小文件的话,它会占用 NameNode大量的内存来存储文件、目录和块信息。这样是不可取的,因为NameNode的内存总是有限的。
- 小文件存储的寻道时间会超过读取时间,它违反了HDFS的设计目标。
(3)并发写入、文件随机修改
- 一个文件只能有一个写,不允许多个线程同时写。
- 仅支持数据 append(追加),不支持文件的随机修改。
》》1:NameNode(nn):就是Master,它是一个主管、管理者。
(1)管理HDFS的名称空间;
(2)配置副本策略;
(3)管理数据块(Block)映射信息;
(4)处理客户端读写请求。
》》2:DataNode:就是Slave。NameNode下达命令,DataNode执行实际的操作。
(1)存储实际的数据块;
(2)执行数据块的读/写操作。
》》3:Client:就是客户端。
(1)文件切分。文件上传 HDFS 的时候,Client 将文件切分成一个一个的Block
,然后进行存储。
(2)与NameNode交互,获取文件的位置信息。
(3)与DataNode交互,读取或者写入数据。
(4)Client提供一些命令
来管理HDFS,比如启动或者关闭HDFS。
(5)Client可以通过一些命令来访问HDFS。
》》4:Secondary NameNode:并非NameNode的热备
。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。
(1)辅助NameNode,分担其工作量。
(2)定期合并Fsimage和Edits
,并推送给NameNode。
(3)在紧急情况下,可辅助恢复NameNode
。
HDFS的Shell操作(开发重点)
bin/hadoop fs 具体命令 OR bin/hdfs dfs 具体命令
两个是完全相同的。
配置环境变量之后可以不写bin/
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs
显示所有命令
[-appendToFile ... ]
[-cat [-ignoreCrc] ...]
[-checksum ...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] ... ]
[-copyToLocal [-p] [-ignoreCrc] [-crc] ... ]
[-count [-q] ...]
[-cp [-f] [-p] ... ]
[-createSnapshot []]
[-deleteSnapshot ]
[-df [-h] [ ...]]
[-du [-s] [-h] ...]
[-expunge]
[-get [-p] [-ignoreCrc] [-crc] ... ]
[-getfacl [-R] ]
[-getmerge [-nl] ]
[-help [cmd ...]]
[-ls [-d] [-h] [-R] [ ...]]
[-mkdir [-p] ...]
[-moveFromLocal ... ]
[-moveToLocal ]
[-mv ... ]
[-put [-f] [-p] ... ]
[-renameSnapshot ]
[-rm [-f] [-r|-R] [-skipTrash] ...]
[-rmdir [--ignore-fail-on-non-empty] ...]
[-setfacl [-R] [{-b|-k} {-m|-x } ]|[--set ]]
[-setrep [-R] [-w] ...]
[-stat [format] ...]
[-tail [-f] ]
[-test -[defsz] ]
[-text [-ignoreCrc] ...]
[-touchz ...]
[-usage [cmd ...]]
(0)启动Hadoop集群(方便后续的测试)
[dev1@hadoop102 hadoop-3.1.3]$ start-dfs.sh
[dev1@hadoop103 hadoop-3.1.3]$ start-yarn.sh
(1)-help:输出这个命令参数
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -help rm
(2)-ls: 显示目录信息
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -ls /
(3)-mkdir:在HDFS上创建目录
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir -p /xuexiao/class1
(4)-moveFromLocal:从本地剪切粘贴到HDFS
[dev1@hadoop102 hadoop-3.1.3]$ touch aa.txt
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs - moveFromLocal ./aa.txt /xuexiao/class1
(5)-appendToFile:追加一个文件到已经存在的文件末尾
[dev1@hadoop102 hadoop-3.1.3]$ touch bb.txt
[dev1@hadoop102 hadoop-3.1.3]$ vim bb.txt
输入
I love bigdata
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -appendToFile bb.txt /xuexiao/class1/aa.txt
(6)-cat:显示文件内容
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -cat /xuexiao/class1/aa.txt
(7)-chgrp 、-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -chmod 666 /xuexiao/class1/aa.txt
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -chown dev1:dev1 /xuexiao/class1/aa.txt
(8)-copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -copyFromLocal README.txt /
(9)-copyToLocal:从HDFS拷贝到本地
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -copyToLocal /xuexiao/class1/aa.txt ./
(10)-cp :从HDFS的一个路径拷贝到HDFS的另一个路径
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -cp /xuexiao/class1/aa.txt /aa.txt
(11)-mv:在HDFS目录中移动文件
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -mv /aa.txt /xuexiao/class1/
(12)-get:等同于copyToLocal,就是从HDFS下载文件到本地
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -get /xuexiao/class1/aa.txt ./
(13)-getmerge:合并下载多个文件,比如HDFS的目录 /user/dev1/test下有多个文件:log.1, log.2,log.3,…
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -getmerge /user/dev1/test/* ./dd.txt
(14)-put:等同于copyFromLocal
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -put ./dd.txt /user/dev1/test/
(15)-tail:显示一个文件的末尾
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -tail /xuexiao/class1/aa.txt
(16)-rm:删除文件或文件夹
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -rm /user/dev1/test/cc2.txt
(17)-rmdir:删除空目录
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /test
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -rmdir /test
(18)-du统计文件夹的大小信息
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -du -s -h /user/dev1/test
2.7 K /user/dev1/test
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -du -h /user/dev1/test
1.3 K /user/dev1/test/README.txt
15 /user/dev1/test/cc.txt
1.4 K /user/dev1/test/dd.txt
(19)-setrep:设置HDFS中文件的副本数量
[dev1@hadoop102 hadoop-3.1.3]$ hadoop fs -setrep 5 /README.txt
这里设置的副本数只是记录在NameNode的元数据中,是否真的会有这么多副本,还得看DataNode的数量。因为目前只有3台设备,最多也就3个副本,只有节点数的增加到至少5台时,副本数才能达到5。
hadoop默认情况下开启了权限检查,且默认使用dir.who作为http访问的静态用户,因此可通过关闭权限检查或者配置http访问的静态用户为dev1,二选一即可.
在core-site.xml
中修改http访问的静态用户为dev1
<property>
<name>hadoop.http.staticuser.username>
<value>dev1value>
property>
在hdfs-site.xml中关闭权限检查
<property>
<name>dfs.permissions.enabledname>
<value>falsevalue>
property>
(1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
(2)NameNode返回是否可以上传。
(3)客户端请求第一个 Block上传到哪几个DataNode服务器上。
(4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
(5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
(6)dn1、dn2、dn3逐级应答客户端。
(7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
(8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。
(1)客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
(2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
(3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
(4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
(1)节点距离
在HDFS写数据的过程中,NameNode会选择距离待上传数据最近距离的DataNode接收数据。那么这个最近距离怎么计算呢?
节点距离:两个节点到达最近的共同祖先的距离总和。
例如,假设有数据中心d1机架r1中的节点n1。该节点可以表示为/d1/r1/n1。利用这种标记,这里给出四种距离描述,如图4-2所示。
(2)副本节点选择
机架感知说明
http://hadoop.apache.org/docs/r3.1.3/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#Data_Replication
For the common case, when the replication factor is three, HDFS’s placement policy is to put one replica on the local machine if the writer is on a datanode, otherwise on a random datanode, another replica on a node in a different (remote) rack, and the last on a different node in the same remote rack.
思考:NameNode中的元数据是存储在哪里的?
首先,我们做个假设,如果存储在NameNode节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低。因此,元数据需要存放在内存中。但如果只存在内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此产生在磁盘中备份元数据的FsImage。
这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦NameNode节点断电,就会产生数据丢失。因此,引入Edits文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。这样,一旦NameNode节点断电,可以通过FsImage和Edits的合并,合成元数据。
但是,如果长时间添加数据到Edits中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行FsImage和Edits的合并,如果这个操作由NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode,专门用于FsImage和Edits的合并。
1. `内存中保存元数据`
2. `防止内存中的数据丢失-FsImage`
3. `提高效率-Edits`
4. `降低Namenode合并压力-SecondaryNamenode`
(1)通常情况下,SecondaryNameNode每隔一小时执行一次。
[hdfs-default.xml]
dfs.namenode.checkpoint.period
3600
(2)一分钟检查一次操作次数,3当操作次数达到1百万时,SecondaryNameNode执行一次。
dfs.namenode.checkpoint.txns
1000000
操作动作次数
dfs.namenode.checkpoint.check.period
60
1分钟检查一次操作次数
NameNode故障后,可以采用如下两种方法恢复数据。
【讲解方法一】
方法一:将SecondaryNameNode中数据拷贝到NameNode存储数据的目录;
1.kill -9 NameNode进程
2.删除NameNode存储的数据(/opt/module/hadoop-3.1.3/data/name)
[dev1@hadoop102 hadoop-3.1.3]$ rm -rf /opt/module/hadoop-3.1.3/data/name/*
3.拷贝SecondaryNameNode中数据到原NameNode存储数据目录
scp -r dev1@hadoop104:/opt/module/hadoop-3.1.3/data/namesecondary/* dev1@hadoop102:/opt/module/hadoop-3.1.3/data/name/
4.重新启动NameNode
[dev1@hadoop102 hadoop-3.1.3]$ hdfs --daemon start namenode
方法二:使用-importCheckpoint选项启动NameNode守护进程,从而将SecondaryNameNode中数据拷贝到NameNode目录中。
1.修改hdfs-site.xml中的
dfs.namenode.checkpoint.period
120
dfs.namenode.name.dir
/opt/module/hadoop-3.1.3/data/tmp/dfs/name
2.kill -9 NameNode进程
3.删除NameNode存储的数据(/opt/module/hadoop-3.1.3/data/tmp/dfs/name)
[dev1@hadoop102 hadoop-3.1.3]$ rm -rf /opt/module/hadoop-3.1.3/data/tmp/dfs/name/*
4.如果SecondaryNameNode不和NameNode在一个主机节点上,需要将SecondaryNameNode存储数据的目录拷贝到NameNode存储数据的平级目录,并删除in_use.lock文件
[dev1@hadoop102 dfs]$ scp -r dev1@hadoop104:/opt/module/hadoop-3.1.3/data/tmp/dfs/namesecondary ./
[dev1@hadoop102 namesecondary]$ rm -rf in_use.lock
[dev1@hadoop102 dfs]$ pwd
/opt/module/hadoop-3.1.3/data/tmp/dfs
[dev1@hadoop102 dfs]$ ls
data name namesecondary
5.导入检查点数据(等待一会ctrl+c结束掉)
[dev1@hadoop102 hadoop-3.1.3]$ bin/hdfs namenode -importCheckpoint
6.启动NameNode
[dev1@hadoop102 hadoop-3.1.3]$ hdfs --daemon start namenode
1.概述
(1)NameNode启动
Namenode启动时,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作。
一旦在内存中成功建立文件系统元数据的映像,则创建一个新的fsimage文件和一个空的编辑日志。此时,namenode开始监听datanode请求。
但是此刻,namenode运行在安全模式,即namenode的文件系统对于客户端来说是只读的。
(2)DataNode启动
系统中的数据块的位置并不是由namenode维护的,而是以块列表的形式存储在datanode中。在系统的正常操作期间,namenode会在内存中保留所有块位置的映射信息。
在安全模式下,各个datanode会向namenode发送最新的块列表信息,namenode了解到足够多的块位置信息之后,即可高效运行文件系统。
(3)安全模式退出
如果满足"最小副本条件",namenode会在30秒钟之后就退出安全模式。所谓的最小副本条件指的是在整个文件系统中99.9%的块满足最小副本级别
(默认值:dfs.replication.min=1)。
在启动一个刚刚格式化的HDFS集群时,因为系统中还没有任何块,所以namenode不会进入安全模式。
2.基本语法
集群处于安全模式,不能执行重要操作(写操作)。集群启动完成后,自动退出安全模式。
(1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态)
(2)bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态)
(3)bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态)
(4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)
3.案例
模拟等待安全模式
(1)查看当前模式
[dev1@hadoop102 hadoop-3.1.3]$ hdfs dfsadmin -safemode get
Safe mode is OFF
(2)先进入安全模式
[dev1@hadoop102 hadoop-3.1.3]$ bin/hdfs dfsadmin -safemode enter
(3)创建并执行下面的脚本
在/opt/module/hadoop-3.1.3路径上,编辑一个脚本safemode.sh
[dev1@hadoop102 hadoop-3.1.3]$ touch safemode.sh
[dev1@hadoop102 hadoop-3.1.3]$ vim safemode.sh
添加
#!/bin/bash
hdfs dfsadmin -safemode wait
hdfs dfs -put /opt/module/hadoop-3.1.3/README.txt /
执行
[dev1@hadoop102 hadoop-3.1.3]$ chmod 777 safemode.sh
[dev1@hadoop102 hadoop-3.1.3]$ ./safemode.sh
(4)再打开一个窗口,执行
[dev1@hadoop102 hadoop-3.1.3]$ bin/hdfs dfsadmin -safemode leave
(5)观察
(a)再观察上一个窗口
Safe mode is OFF
(b)HDFS集群上已经有上传的数据了。
(1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
(2)DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。
(3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
(4)集群运行中可以安全加入和退出一些机器。
思考:如果电脑磁盘里面存储的数据是控制高铁信号灯的红灯信号(1)和绿灯信号(0),但是存储该数据的磁盘坏了,一直显示是绿灯,是否很危险?同理DataNode节点上的数据损坏了,却没有发现,是否也很危险,那么如何解决呢?
如下是DataNode节点保证数据完整性的方法。
(1)当DataNode读取Block的时候,它会计算CheckSum。
(2)如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。
(3)Client读取其他DataNode上的Block。
(4)常见的校验算法 crc(32) md5(128) sha1(160)
(5)DataNode在其文件创建后周期验证CheckSum
需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。
dfs.namenode.heartbeat.recheck-interval
300000
dfs.heartbeat.interval
3
0.需求
随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点。
1.环境准备
(1)在hadoop104主机上再克隆一台hadoop105主机
(2)修改IP地址和主机名称
(3)删除原来HDFS文件系统留存的文件(/opt/module/hadoop-3.1.3/data和log)
(4)source一下配置文件
[dev1@hadoop105 hadoop-3.1.3]$ source /etc/profile
2.服役新节点具体步骤
(1)直接启动DataNode,即可关联到集群
[dev1@hadoop105 hadoop-3.1.3]$ hdfs --daemon start datanode
[dev1@hadoop105 hadoop-3.1.3]$ yarn --daemon start nodemanager
DataNode节点
(2)如果数据不均衡,可以用命令实现集群的再平衡
[dev1@hadoop102 hadoop-3.1.3]$ sbin/start-balancer.sh
添加到白名单的主机节点,都允许访问NameNode,不在白名单的主机节点,都会被直接退出。
添加到黑名单的主机节点,不允许访问NameNode,会在数据迁移后退出。
实际情况下,白名单用于确定允许访问NameNode的DataNode节点,内容配置一般与workers文件内容一致。
黑名单用于在集群运行过程中退役DataNode节点。
配置白名单和黑名单的具体步骤如下:
(1)在NameNode的/opt/module/hadoop-3.1.3/etc/hadoop目录下分别创建whitelist 和blacklist文件
[dev1@hadoop102 hadoop]$ pwd
/opt/module/hadoop-3.1.3/etc/hadoop
[dev1@hadoop102 hadoop]$ touch whitelist
[dev1@hadoop102 hadoop]$ touch blacklist
在whitelist中添加如下主机名称,假如集群正常工作的节点为102 103 104 105
hadoop102
hadoop103
hadoop104
hadoop105
黑名单暂时为空。
(2)在NameNode的hdfs-site.xml配置文件中增加dfs.hosts 和 dfs.hosts.exclude配置
dfs.hosts
/opt/module/hadoop-3.1.3/etc/hadoop/whitelist
dfs.hosts.exclude
/opt/module/hadoop-3.1.3/etc/hadoop/blacklist
(3)配置文件分发
[dev1@hadoop102 hadoop]$ xsync hdfs-site.xml
(4)重新启动集群
[dev1@hadoop102 hadoop-3.1.3]$ stop-dfs.sh
[dev1@hadoop102 hadoop-3.1.3]$ start-dfs.sh
注意: 因为workers中没有配置105,需要单独在105启动DN
[dev1@hadoop105 hadoop-3.1.3]$ hdfs --daemon start datanode
[dev1@hadoop105 hadoop-3.1.3]$ yarn --daemon start nodemanager
(5)在web端查看目前正常工作的DN节点
(1)准备使用黑名单退役105
编辑blacklist文件,添加105
[dev1@hadoop102 hadoop] vim blacklist
hadoop105
(2)刷新NameNode
[dev1@hadoop102 hadoop] hdfs dfsadmin -refreshNodes
(3)在web端查看DN状态,105 正在退役中…进行数据的迁移
(4)如果105也启动的NodeManager,也可以刷新yarn状态。【可选查看】
[dev1@hadoop102 hadoop-3.1.3]$ yarn rmadmin -refreshNodes
白名单退役会直接将节点抛弃,没有迁移数据的过程,会造成数据丢失。
(1)删除blacklist的中的内容,恢复 102 103 104 105 正常工作,如图
(2)修改whitelist,将105删除,保留102 103 104
[dev1@hadoop102 hadoop]$ vim whitelist
修改
hadoop102
hadoop103
hadoop104
(3)刷新NameNode
[dev1@hadoop102 hadoop-3.1.3]$ hdfs dfsadmin -refreshNodes
(4)web端查看,发现105节点直接从集群列表中丢弃