文章目录
大数据
大数据简介
1.什么是大数据
# 大数据:
Big Data,数据体量非常大,TB级,日增长在GB级。
B-KB-MB-GB-TB-PB-EB-ZB 彼此之间差1024倍
# 大数据技术:
数据体量大道一定程度,导致传统Web技术无法处理(存储、计算),需要使用新的分布式技术处理,叫做大数据技术。
这套技术可以使计算突破单体计算机的硬件配置的限制。
解决海量数据存储(硬盘,内存)、计算问题(CPU)。
2.大数据特点
# 1.体量大 Volume
MySQL 20G 上限
数据体量达到TB和PB级别,或日增长数据量在GB级别。
例如大型电商网站、金融行业的日志数据、订单数据。
# 2. 多样性 Variety
结构化:二维表
半结构化:JSON XML
非结构化:文本文件、图片、音频、视频、地理位置
# 3. 快速 Velocity
处理数据速度快,时效性要求高。
1小时 1天
# 4. 价值密度低 Value
数据中存在大量无关紧要的数据,不同的业务需求,需要的业务数据又不一样,需要从海量数据中清洗除需要的关键性指标。
3.应用业务方向
应用场景:规律分析、系统预警、定向广告推送、猜你喜欢。。
行业:互联网、工业预警、智慧农业、大数据医疗、金融风控
本质: `海量数据===>有价值数据==>价值`
工作方向
大数据运维工程师
大数据开发工程师(实时计算、数据仓库、ETL、基本挖掘)
大数据分析(算法)
4.大数据起源
1. Google(爬虫+搜索),最早面临大数据的公司。2005年,Google公开了大数据的3个技术论文(公开),并作出了相应的软件产品(不开源)
① GFS Google file system 文件存储系统 (突破单机硬盘限制即存储)
② MapReduce 数据计算 分布式计算 (突破单体计算机内存和CPU限制)
③ BigTable (No SQL数据库) (突破单体计算机DB存储和读取能力)
5.大数据数据来源 (大数据项目开发前置准备)
① 自身公司系统运行产生的日志数据。[用户多、数据量大]
② 爬虫采集互联网免费数据。(谨慎)
③ 行业大数据:
电信移动联通通话记录 ----电信
医疗用户病例、处方 ---智慧医疗
银行交易流水、账户信息 ---金融大数据
政府大数据
④ 大数据交易(贵州),交易过了时效性或者脱敏数据。(或者黑色产业链)
6.大数据核心问题
# 1. 海量数据存储 (突破单机存储限制)
# 2. 海量数据计算 统计 分析 处理(突破单机计算能力)
Hadoop简介
Hadoop是一个由Apache基金会所开发的[分布式系统](https://baike.baidu.com/item/分布式系统)基础架构。
Hadoop实现了一个[分布式文件系统](https://baike.baidu.com/item/分布式文件系统)(Hadoop Distributed File System),简称HDFS。
HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算
总结
HDFS--解决大数据存储问题
MapReduce--解决大数据计算问题
1.起始
Doug Cutting使用Java编程语言开发了Hadoop1.x体系产品。
Hadoop体系 | Google体系 | 含义 |
---|---|---|
HDFS | GFS Google File System | 大数据存储系统 |
MapReduce | MapReduce | 大数据处理计算 |
HBase | BigTable | no sql数据库 |
2.Hadoop发行版
名称 | 收费 | 使用难度 |
---|---|---|
apache的Hadoop | 免费 | 难 |
Cloudera(CDH) | $4000/节点/年 | 中(图形化界面) |
Hortonworks | $12000/10节点/年 | 中 |
FusionInSight(华为) | ||
飞天(阿里) |
3.Hadoop生态圈
解决:大数据问题(存储 计算)
Hadoop Core (HDFS 存 ,MR计算(YARN分布式资源管理系统),MapReduce(离线计算),spark(内存计算),Flink(实时计算))
Hadoop生态工具 (Hive(数据仓库),HBase(分布式数据库),Zookeeper(分布式协调服务保证集群稳定性、可靠性))
Hadoop辅助工具 (Flume (日志采集)Sqoop(数据转换工具导入导出) Azkaban/Oozie (作业调度系统)Hue) mahout(算法库)、Kafka(消息队列)
HDP/CDH(安装部署工具,图形化运维服务器管理)
4.学习核心
1. HDFS 存数据 取数据 2. MR 如何编码、数据计算、与原有Java开发的区别 3. Hive HQL 与SQL95%一样。 4. HBase 类比Redis, 存 取 数据结构 编码--思路--应用场景--原理--源码 5. Flume 日志采集工具 6. Sqoop 数据导入工具,将日志数据导入到hadoop中。 7. zookeeper 服务管理协调工具。(保证集群的稳定性和可靠性) 8. Mahout 算法库[分类、聚类、推荐、关联规则挖掘、回归、降维、进化、向量相似] 30多种。
HDFS
简介
HDFS 全称 Hadoop Distributed File System 中文 Hadoop分布式文件系统。
总结:解决海量数据存储问题。
如何存储的?
思路
1.文件切分成块(按照文件的字节数组下标)
2.按副本备份的把数据块保存在多台数据节点(DataNode)—从slave
3.要有一台主节点(NameNode)管理所有的数据节点—主master
知识点总结
# 核心概念1
1.DataNode:Slave节点,专门用来存储数据块(Block)的廉价服务器。
a.保存切分后的数据,保存副本。
b.定时心跳---->namenode,汇报datanode自己本身的状态信息。
c.定期发送block的checksum。
2.NameNode:Master节点,管理从节点,并接受客户端访问
主节点 master
1. 管理hdfs集群中所有的datanode信息
dn1 192.168.199.11 硬盘空间(数据存储负载均衡)
[文件名1-blk1 路径 大小 时间]
dn2 192.168.199.12 硬盘空间
dn3 192.168.199.13 硬盘空间
2. 管理hdfs中文件的元数据(文件描述信息)---保存内存中
(文件名 路径 大小 时间 权限 用户 组 )
3. 管理dn中block的checksum。
4. 接受客户端的访问。
3.Block:数据块,完整数据的最小组成部分,大小为128MB。
a.过大:单个block数据传输时间过长,更容易出现数据重传情况。(降低传输效率)
b.过小:导致block数量过多,导致namenode元数据过多,导致内空间过早用完,导致
注意:拆分太少,导致单体文件过大,无法并行io操作文件,效率低。
拆分太多,导致io次数过多,降低效率。
4.Client:
java或者命令行工具,用来访问HDFS中的数据的。
a.访问操作hdfs集群中的文件。
b.首先连接namenode,再连接datanode。
# 重要概念2
1.replication:数据块block的副本,备份block,防止单体datanode宕机损坏导致数据丢失。
2.checksum:校验和类似指纹数字签名,dataname中保存数据的数字指纹。(一串字符串)
作用:唯一标记文件的内容。
确保数据的可靠性,hadoop内部在判断文件是否一致或者变化,就对比文件的签名即可。
搭建HDFS单体架构(伪分布式)
架构模型
Client—>访问NameNode (hdfs://ip:50070)
NameNode:hadoop10 (master)-----保存元数据等
DataNode:hadoop10 (slave)-----保存block数据
安装步骤
软件准备
Hadoop: http://archive.apache.org/dist/hadoop/common/hadoop-2.9.2/hadoop-2.9.2.tar.gz
官网:http://hadoop.apache.org/docs/r2.9.2/
1.准备虚拟机
1. 设置hostname
hostnamectl set-hostname hadoop10
2. 设置IP
vim /etc/sysconfig/network-scripts/ifcfg-ens33
----------------网卡对应的文件内容---------------------
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="0bd5d8a5-fe1b-42de-82bd-bfa7d2984b95"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.153.10" # 修改这里的ip地址即可。
PREFIX="24"
GATEWAY="192.168.153.2"
DNS1="192.168.153.2"
DNS2="8.8.8.8"
IPV6_PRIVACY="no"
systemctl restart network (修改后重启生效)
3. 配置hosts(linux+windows)
vim /etc/hosts
----------以下是文件信息------------
192.168.153.10 hadoop10
4. 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
5. 安装jdk1.8。
(略)
6. 配置jdk环境变量。
a.安装jdk
tar -zxvf jdk1.8xxx.gar.gz
b.配置环境变量
vim /etc/profile
## 内容如下
#java_home
export JAVA_HOME=/opt/installs/jdk1.8
#path
export PATH=$JAVA_HOME/bin:$PATH
#classpath
export classpath=. (可以不写)
c.执行命令使环境变量立刻生效
source /etc/profile
7. 必要软件
vim --非必须
tree --非必须
wget --非必须
psmisc --必须
2.安装hadoop
# 解压
[root@hadoop10 module]# tar zxvf hadoop-2.9.2.tar.gz -C /opt/install/
# 配置环境变量
vim /etc/profile
-------------以下是环境变量-------------
# 配置HADOOP_HOME
export HADOOP_HOME=/opt/installs/hadoop2.9.2
# 配置PATH
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# 生效配置信息(重新执行profile中的指令,加载配置信息)
source /etc/profile
bin(客户端命令,hdfs yarn)、etc(hadoop配置文件)、logs(hadoop运行日志)、sbin(hadoop服务端命令)、share(hadoop依赖的jar和参考文档)
3.初始化配置文件(6个)
hadoop-env.sh--(关联JDK)
core-site.xml--(hadoop的NameNode访问路径,数据存放位置)
hdfs-site.xml--(配置副本数)
mapred-site.xml--(Mapreduce的服务 shuffle)
yarn-site.xml--(配置资源调度器--cpu、内存、硬盘)
slaves--(配置从节点)
# hadoop-env.sh (关联JDK)
JAVA_HOME=/opt/installs/jdk1.8
# core-site.xml (hadoop的NameNode访问路径,数据存放位置)
# 配置hdfs入口
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop10:9000</value>
</property>
# 配置 数据保存位置
# 新建 data文件夹
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/install/hadoop2.9.2/data</value>
</property>
# hdfs-site.xml (配置副本数)
# 配置副本个数
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
# mapred-site.xml (Mapreduce的服务 shuffle)
# 拷贝一份mapred-site.xml.template并且重命名mapred-site.xml
cp mapred-site.xml.template mapred-site.xml
# 配置资源调度器yarn
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
# yarn-site.xml (配置资源调度器--cpu、内存、硬盘)
# 配置yarn的服务
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
# slaves (配置从节点)
# 配置从机datanode的ip
hadoop10
4.格式化HDFS数据库
# 一旦hadoop配置启动失败,删除data下的文件,再重新格式化。
#初始化namenode和datanode存放数据的目录
hdfs namenode -format
5.启动HDFS
# 启动hdfs
start-dfs.sh
# 关闭hdfs
stop-dfs.sh
6.测试验证
# 查看hdfs进程---命令行查看java进程
[root@hadoop10 install]# jps
2225 NameNode # master namenode主机
4245 Jps
2509 SecondaryNameNode
2350 DataNode # slave datanode从机
# 查看hdfsWeb服务
1. 查看namenode的web服务
http://hadoop10:50070
2. 查看datanode的Web服务
http://hadoop10:50075
7.日志监控
namenode启动日志
路径:/hadoop2.9.2/logs/hadoop-用户名-namenode-主机名.log
hadoop-root-namenode-主机名字.log
datanode启动日志
路径:/hadoop2.9.2/logs/hadoop-用户名-datanode-主机名.log
hadoop-root-datanode-主机名.log
知识补充
# 启动失败如何处理
场景: 格式化或者启动hadoop失败。
说明:
hadoop/data文件夹
作用: 保存datanode和namenode持久化的数据。
时机:
1. 格式化hdfs namenode -format 会初始化该目录下的文件。
2. hdfs运行期间产生的数据,会操作该目录中的数据。
必要操作:删除格式化或者启动数据保存的文件目录。
# namenode 的 web界面讲解
http://ip:50070
1. 查看namenode中管理的datanode的信息.
2. 管理文件block的元数据。
文件名 用户 用户组 类型 权限 时间 ....
3. 启动过程日志监控(查看错误)
# 监控namenode启动日志
/hadoop2.9.2/logs/hadoop-用户名-namenode-主机名.log
# 监控datanode启动日志
/hadoop2.9.2/logs/hadoop-用户名-datanode-主机名.log
Hadoop
目录结构介绍
1.bin ----二进制脚本,客户端工具命令
2.etc ----配置文件(6个常用的配置文件)
3.include ----
4.logs ----日志
4.lib ----依赖库
5.libexec ----
6.sbin ----hadoop集群服务管理命令(启动、关闭)
7.share
----doc 文档
----hadoop的web服务
8.data ----存放hadoop的数据文件即保存数据(需要手动创建)
HDFS客户端
命令客户端
1.命令所在目录
${hadoop}/bin之下/hdfs的命令
2.HDFS的文件系统结构
Linux管理的文件系统
/
root etc ...
HDFS管理的文件系统
/
user 用户 ...
3.常用命令
HDFS类比linux命令
hdfs dfs -命令 参数
语法:***
hdfs dfs -参数 值
***
命令语法 含义 示例代码 hdfs dfs -ls [-R] hdfs文件路径 查看文件元数据信息 hdfs dfs -ls / hdfs dfs -mkdir -p /目录a/目录b 新建文件夹,如果父目录不存在则添加-p参数 hdfs dfs -mkdir -p /baizhi/file hdfs dfs -put
linux文件路径 hdfs文件路径从linux向hdfs上传文件 hdfs dfs -put /opt/models/jdk /baizhi hdfs dfs -text
hdfs文档路径查看文件内容,可以查看压缩文件内的文档信息 hdfs dfs -text /baizhi/Test.java hdfs dfs -cat hdfs文档路径 查看文件内容 hdfs dfs -cat /baizhi/Test.java hdfs dfs -rm hdfs文件路径 删除文件 hdfs dfs -rm /baizhi/Test.java hdfs dfs -rm -r hdfs文件夹 删除文件夹,非空使用-rmr hdfs dfs -rm -r /baizhi hdfs dfs -get
hdfs文件 linux路径从hdfs下载文件到linux hdfs dfs -get /baizhi/jdk1.8 /opt hdfs dfs -chmod [-R] 权限运算值 hdfs文件 修改hdfs文件权限 hdfs dfs -chmod o+w /baizhi hdfs dfs -cp hdfs文件路径 hdfs文件路径 文件拷贝 hdfs dfs -cp /demo1 /demo2 hdfs dfs -find hdfs文件夹 -name “关键词” 文件查找 hdfs dfs -find / -name “a.txt” hdfs dfs -mv /hdfs/demo1/wordcount1.log /hdfs/demo2 文件移动 hdfs dfs -mv /hdfs/demo1/wordcount1.log /hdfs/demo2 hdfs dfs -checksum
hdfs文件获取文件的checksum hdfs dfs -checksum /hdfs/demo2/wordcount1.log hdfs dfs -du
[-s] hdfs目录查看文件大小,-s是统计该目录总空间大小 hdfs dfs -du [-s] /hdfs hdfs dfs -df
/查看文件系统的磁盘占用情况 hdfs dfs -df /
java客户端
入门 (HDFS下载)
-
核心API
API 含义和作用 Configuration
配置信息,封装hdfs操作的相关配置文件信息 FileSystem
HDFS的分布式文件系统工具,操作HDFS文件。 IOUtils
IO操作的工具类 Path
封装表示HDFS文件路径 -
准备工作
配置windows的hadoop执行环境
1. 将hadoop2.9.2解压到window中,路径不能有中文,不能有空格。 2. 拷贝hadoop的windows执行环境工具到bin路径下,替换客户端工具。 3. 配置环境变量 HADOOP_HOME=hadoop安装路径 PATH=hadoop安装路径/bin 4. 重启IDEA或者eclipse
-
配置文件
-
加入hadoop依赖
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.9.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.9.2</version> </dependency>
-
导入log4j.properties(从linux的hadoop的etc中拷贝)到IDEA中的resource
-
-
编程步骤(文件下载)
1. 创建配置信息,关联HDFS信息:Configuration Configuration conf = new Configuration(); conf.set("fs.defaultFS","hdfs://192.168.153.10:9000"); 2. 获得操作HDFS文件的工具:FileSystem FileSystem fileSystem = FileSystem.get(conf); 3. 通过命令获得java的输入流。 FSDataInputStream fsis = fs.open(new Path("/log4j.properties")); 4. IO操作数据。 FileOutputStream fos = new FileOutputStream("D:/log4j.properties"); IOUtils.copyBytes(fsis, os, 1024, true); // 参数3:使用缓存1024字节 参数4:是否关闭filesystem。
5.程序代码(下载)
public class HDFSClientTest {
@Test
public void test1() throws Exception{
//1.初始化配置文件
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.153.10:9000");
//2.获得HDFS客户端工具 FileSystem
FileSystem fs = FileSystem.get(conf);
//3.写入java代码(hdfs-->java输入流)
//从HDFS下载到本地
// 4.输出下载到本地(java-->window输出流)
//5.IOUtils对接 in out 完成数据传输
FSDataInputStream fsis = fs.open(new Path("/log4j.properties"));
FileOutputStream fos = new FileOutputStream("D:/log4j.properties");
IOUtils.copyBytes(fsis,fos,2014,true);
//6.关流
}
}
6.上传(同理)
public void test2() throws Exception{
//1.初始化配置文件
Configuration conf = new Configuration();
//指定入口
conf.set("fs.defaultFS","hdfs://192.168.153.10:9000");
//指定文件上传的副本数量
conf.set("dfs.replication","1");
//2.获得hdfs文件系统的客户端 FileSystem
FileSystem fs = FileSystem.get(conf);
//3.创建 本地Windows-->java输入流
FileInputStream fis = new FileInputStream("D:/分析.mp4");
//4.创建java-->hdfs 文件上传的输出流
FSDataOutputStream fos = fs.create(new Path("/test/hdfs.mp4"));
//5.使用Hadoop的IOUtils,完成数据搬运
IOUtils.copyBytes(fis,fos,4096,true);
}
7.文件操作
创建文件
public void test3() throws Exception{
//新建文件夹 可以把前两个步骤封装为Utils类
//1.初始化配置文件
Configuration conf = new Configuration();
//指定入口
conf.set("fs.defaultFS","hdfs://192.168.153.10:9000");
//指定文件上传的副本数量
conf.set("dfs.replication","1");
//2.获得hdfs文件系统的客户端 FileSystem
FileSystem fs = FileSystem.get(conf);
boolean b = fs.mkdirs(new Path("/hdfs/demo"));
System.out.println(b);
}
判断文件是否存在
public void test4() throws Exception{
//判断某个文件是否存在
//1.初始化配置文件
Configuration conf = new Configuration();
//指定入口
conf.set("fs.defaultFS","hdfs://192.168.153.10:9000");
//指定文件上传的副本数量
conf.set("dfs.replication","1");
//2.获得hdfs文件系统的客户端 FileSystem
FileSystem fs = FileSystem.get(conf);
boolean b = fs.exists(new Path("/demo"));
System.out.println(b);
}
删除文件
public void test5() throws Exception{
//删除文件 注意给windows的用户开启hdfs文件创建权限。 -rm -r
//1.初始化配置文件
Configuration conf = new Configuration();
//指定入口
conf.set("fs.defaultFS","hdfs://192.168.153.10:9000");
//指定文件上传的副本数量
conf.set("dfs.replication","1");
//2.获得hdfs文件系统的客户端 FileSystem
FileSystem fs = FileSystem.get(conf);
boolean b = fs.delete(new Path("/hdfs/demo"));
System.out.println(b);
}
遍历hdfs文件信息(描述信息)
public void test6() throws Exception{
//查看hdfs文件列表信息
//1.初始化配置文件
Configuration conf = new Configuration();
//指定入口
conf.set("fs.defaultFS","hdfs://192.168.153.10:9000");
//指定文件上传的副本数量
conf.set("dfs.replication","1");
//2.获得hdfs文件系统的客户端 FileSystem
FileSystem fs = FileSystem.get(conf);
FileStatus[] files = fs.listStatus(new Path("/test"));
for (FileStatus file : files) {
System.out.println(file);
//获得路径包含文件名
Path path = file.getPath();
//获取长度
long len = file.getLen();
//获取副本数
short replication = file.getReplication();
}
}
递归遍历文件,并且可以获取文件块所在的位置
public void test7() throws Exception{
/**
* 功能:递归获得目录下的所有文件的元数据信息,
* 并且可以获取文件块所在的位置 获取文件的block信息(大小 所在服务器地址)
* 相当于hdfs的ls命令
* listFiles参数1:要查看的目录
* listFiles参数2:是否递归 -R
*/
//1.初始化配置文件
Configuration conf = new Configuration();
//指定入口
conf.set("fs.defaultFS","hdfs://192.168.153.10:9000");
//指定文件上传的副本数量
conf.set("dfs.replication","1");
//2.获得hdfs文件系统的客户端 FileSystem
FileSystem fs = FileSystem.get(conf);
RemoteIterator<LocatedFileStatus> it = fs.listFiles(new Path("/test"), true);
//LocatedFileStatus (文件元数据信息+block相关信息)
while(it.hasNext()){
LocatedFileStatus next = it.next();
System.out.println(next);
//BlockLocation block在DN中分布信息(block大小,所在的DN的地址)
BlockLocation[] blocks = next.getBlockLocations();
for (BlockLocation block : blocks) {
System.out.println(Arrays.toString(block.getNames())); //块名字
System.out.println(block.getOffset()); //偏移量
System.out.println(block.getLength()); //长度
System.out.println(Arrays.toString(block.getHosts())); //所在主机 因为副本 所以是数组
System.out.println("----------------");
System.out.println("***************");
}
}
其他常见方法(了解)
方法 | 含义 |
---|---|
fs.getDefaultBlockSize(hdfs的path); | 获得默认block大小 |
fs.getFileChecksum(hdfs的path); | 获得checksum(指纹 数字签名) |
fs.getDefaultReplication(hdfs的path); | 获得默认副本集 |
封装FileSystem
配置信息转移文件
- 讲配置文件core-site.xml拷贝到java项目的resources文件夹中。
- 导入log4j配置文件
- 使用classpath类加载输入流指向core-site.xml
InputStream is = Test1.class.getResourceAsStream("/core-site.xml")
- 讲配置文件加入封装到Configuration
conf.addResource(is)
Client读写数据原理(面试)
文件下载流程
文件上传流程
HDFS分布式搭建(Hadoop1.0)
免密登录
# start-x启动的原理。
start-dfs.sh和stop-dfs.sh
会`远程登录`到NN和DN对应的节点执行hadoop-deamon.sh start namenode或者hadoop-deamon.sh start datanode命令启动对应节点的服务。
# 免密登录
1. 生成一对秘钥(私钥+公钥)
ssh-keygen
2. 将公钥拷贝到被免密登录的机器上。
ssh-copy-id 目标主机的ip
# *****注意:
免密登录的设置一定要在hosts hostname ip设置完毕后,在设置免密登录。
集群规划
IP设置:NameNode–DataNode (hadoop11):192.168.153.11
DataNode----(hadoop12):192.168.153.12
DataNode----(hadoop13):192.168.153.13
HDFS集群搭建
# 1. 准备虚拟机
1. hostname
hostnamectl set-hostname 名字
hostname查看
2. ip
vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改IP
systemctl restart network
3. hosts(三个机器)
192.168.153.11 hadoop11
192.168.153.12 hadoop12
192.168.153.13 hadoop13
4. 防火墙
systemctl status firewalld
5. jdk和环境变量配置
javac查看一下
# 2. 安装hadoop
1. 解压
2. 配置环境变量
3. 重新加载配置文件。
# 3. 初始化配置文件
1. hadoop-env.sh
2. core-site.xml
3. hdfs-site.xml
4. mapred-site.xml
5. yarn-site.xml
6. slaves (配置多个DN节点,最好使用vi编辑器)
*****此次安装遇到文件环境污染问题
*****将文件删除重新建立一个新的并编写
# 将hadoop11的配置文件scp远程拷贝到hadoop12 和hadoop13
scp -r ./etc root@hadoop12:/opt/install/hadoop2.9.2
scp -r ./etc root@hadoop13:/opt/install/hadoop2.9.2
# 注意事项
一个hadoop集群中,所有hadoop配置文件要完全一致。
# 4. 免密登录
1. 生成秘钥
ssh-keygen
2. 同步公钥到集群所有节点,包括自己。
ssh-copy-id 机器名字
# 5. 初始化HDFS
1. 删除hadoop的data文件夹
cd /opt/install/hadoop2.9.2/data/
rm -rf *
2. 格式化集群
在namenode节点执行格式化。
hdfs namenode -format
# 6. 启动hadoop集群
1. 在namenode节点,执行start-dfs.sh
NameNode持久化(持久化即把数据从内存转到硬盘存储)
NameNode的数据保存位置
元数据(NameNode)需要存放在内存中
原因:
1.元数据信息数据量比较少(64-128G足够了)
2.客户端对NameNode的元数据访问(读写),操作频率非常高(内存读写速度块)。
NameNode的持久化
NameNode数据存在内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此产生在磁盘中备份元数据的FsImage。这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦NameNode节点断电,就会产生数据丢失。因此,引入Edits文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。这样,一旦NameNode节点断电,可以通过FsImage和Edits的合并,合成元数据。但是,如果一旦长时间添加数据到Edits中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行FsImage和Edits的合并,如果这个操作由NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode,专门用于FsImage和Edits的合并。
SencodaryNameNode(面试)(Hadoop1.0)
1.现存的NameNode面临的问题
问题
① 单点故障数据丢失?
② 日志持久化,容量大,回复慢
③ 快照持久化,短期内数据丢失问题依然存在。
④ 快照从哪儿来,合并的操作由谁做?
现有的持久化机制的特点
持久化机制 Redis(类比) Hadoop-NameNode 优点 缺点 日志增量 AOF EditsLog 数据** 安全性高
**冗余度高、数据恢复慢 快照 RDB FSImage 数据** 恢复快
**、占用空间小只保留数据的最终状态,快照间隔期见,数据可能丢失,安全性低
2.NameNode持久化原理
简介:
① NameNode持久化的时候使用的是EditsLog文件,保障数据安全。
② SencodaryNameNode负责定期将EditsLog中的数据,合并成FSImage的数据状态。(NameNode的助理,负责持久化文件的合并—
checkpoint
) ③ NameNode恢复持久化到内存时,从FSImage恢复,外加从最近合并后产生EdisLog恢复,保障数据加载速度快。
SecondaryNameNode工作原理
CheckPoint原理过程
checkpoint:editslog和FSImage的合并过程
1. SecondaryNameNode向NameNode发起合并请求 2. NameNode将当前的Editslog文件保存改名edits,并新建EditsLog继续持久化工作。 3. 将改名后的edits文件和本地的FSImage(旧)发送给sencondaryNameNode 4. SecondaryNameNode负责将FSImage(旧)+edits文件合并成FSImage(新) 5. 将新的FSImage(新)发送给NameNode保存。
Checkpoin时机
1. 每隔1小时触发一次checkPoint 2. 每100w次操作,触发一次checkpoint 每1分钟检查一次,操作次数
设置时机:
hdfs-site.xml
name value默认 含义 dfs.namenode.checkpoint.period 3600 3600秒触发一次 dfs.namenode.checkpoint.txns 1000000 100w次操作触发一次 dfs.namenode.checkpoint.check.period 60 1分钟检查一次操作次数
检查点工作原理
secondary定制(了解)
默认secondary在namenode所在的机器
位置查看 hdfs-site.xml
dfs.namenode.secondary.http-address=0.0.0.0:50090
dfs.namenode.secondary.https-address=0.0.0.0:50091
- 单独启动secondaryNameNode命令
hadoop-deamon start secondarynamenode
- 指定192.168.153.10为secondarynamenode的机器
<property> <name>dfs.namenode.secondary.http-address</name> <value>192.168.153.10:50090</value> </property> <property> <name>dfs.namenode.secondary.https-address</name> <value>192.168.153.10:50091</value> </property>
DataNode工作机制
序号 步骤 事情 0 启动 NameNode启动时,会启动slaves中所有的datanode 1 注册 DataNode向NameNode注册信息:block数据状态、元数据、校验和、心跳。告诉NameNode自己工作正常,数据完整。 2 周期上报 每隔1小时,会上报所有的block的元数据,校验和。 3 心跳 每3向namenode发送一次心跳,namenode返回心跳结果并包含一些数据操作的命令,如果发现datanode10分钟内没有心跳,则认为该datanode节点不可用
HDFS分布式集群搭建回顾
免密登录
1.Hadoop目前集群的问题
每个datanode的启动,都需要输入密码,如果有1w台,会是一件繁琐且低效的工作。
2.免密登录实现原理
3.免密登录命令
0 测试ssh免密登录前的效果
ssh 目标主机的ip
① 生成公钥和私钥
ssh-keygen -t rsa
ssh-keygen
存放位置:~/.ssh文件夹下
② 给主机颁发公钥
ssh-copy-id root@远程ip地址
③ 测试ssh免密登录之后的效果
ssh 目标主机的ip
④ 退出远程ssh
exit
4.补充远程拷贝命令
scp -r 本地linux文件 root@远程linuxhostname:远程文件路径
安装Hadoop注意事项
注意:如果该设备里面之前安装过且不用的hadoop需要删除hadoop/data/tmp目录下的持久化文件。
如果该设备里面之前安装过且不用的hadoop需要删除hadoop/logs/目录下的日志文件。
启动hadoop集群命令补充
start-all.sh
stop-all.sh
HAHadoop高可用集群搭建(Hadoop2.0,Zookeeper选主机制)
目前hadoop集群的问题
- namenode单节点,一旦宕机,则hadoop文件服务就停止?
- 如果2台namenod,一个主,一个备,如果主机宕机,自动切换到备机,但是客户端的ip访问地址不可变,怎么办?
ZK工作机制
- zk职责
1. 选主:选举出真正的NameNode主机。 2. 管理editslog,一旦切换到备机,会将editslog同步给新主机。
- 原理
① zk主节点不固定,投票算法选主,可靠。 ② 投票过半,则被认定为主机。
3. 工作机制图
psmisc安装
zk使用psmisc做服务器进程的访问和管理
安装:
yum install -y psmisc
ZK安装配置
- 下载
https://downloads.apache.org/zookeeper/zookeeper-3.4.14/
- 安装
tar -zxvf zookeeper-3.4.14.tar.gz -C /opt/install/
- 创建数据文件夹(如果启动有误,删除当前目前文件夹内自动生成的文件)
mkdir $ZK_HOME/data
- 初始化配置文件
配置文件位置:$ZK_HOME/conf/zoo.cfg ① 改名 操作: 修改zoo_sample.cfg改为zoo.cfg 命令: mv zoo_sample.cfg zoo.cfg ② 配置 数据保存位置: dataDir=/opt/installs/zookeeper3.4.14/data 集群管理的服务(投票、选举时使用): server.0=hadoop20.baizhi.com:2888:3888 server.1=hadoop21.baizhi.com:2888:3888 server.2=hadoop22.baizhi.com:2888:3888 说明:下图
- 在zk的data文件夹下创建一个文件(
给主机设置编号
)myid:
0
myid:
1
myid:
2
- 同步zookeeper的安装和配置信息发送到所有需要zk管理的主机上。
scp -r zkhome root@hadoop.baizhi.com:/opt/installs
并修改主机myid.
启动zk服务:在bin目录下
在所有的zk节点上执行:
./zkServer.sh start
投票机制,按照启动顺序 hadoop20启动,本机给自己投票。(自己得1票。)follower hadoop21启动,本机给自己投票,并和集群内的其他成员交换票(自己得2票),过半,则选为主机。 master hadoop21启动,作为 follower
- 查看zk运行状态和主机
./zkServer.sh status
- 进入zk的客户端(在leader主机上执行)
./zkCli.sh
1. 可以使用zookeeper的命令管理zk中的文件 2. zk中可以管理文件,同时文件结构也是树状。(这里未来是要存储zk集群中namenode的editslog文件)
- zk启动问题查看日志
$ZK_HOME/bin/zookeeper.out
高可用hadoop集群搭建
- 删除所有hadoop下的date/tmp下面的文件
① 删除文件
② 执行namenode format
- core-site.xml
name
含义
value
fs.defaultFS 配置namenode入口:使用zk后变成虚拟 hdfs://ns hadoop.tmp.dir hadoop的namenode保存元数据和
datanode保存block数据的位置/opt/installs/hadoop-2.8.3/data/tmp ha.zookeeper.quorum zk服务器的ip列表,端口号是zk的客户端端口 hadoop2.baizhiedu.com:2181,
hadoop3.baizhiedu.com:2181,
hadoop4.baizhiedu.com:2181
- hdfs-site.xml
name 含义 value dfs.replication block副本数量 3 dfs.nameservices 虚拟入口ip
定义namenode的入口名字-虚拟ipns dfs.ha.namenodes.ns 虚拟NN ip
定义zk虚拟的ip下两个namenode的名字nn1,nn2 dfs.namenode.rpc-address.ns.nn1 实际NN入口
定义client rpc访问zk内的NN的实际 host:port
所有虚拟NN节点都要配置 nn1 nn2hadoop20.baizhiedu.com:8020 dfs.namenode.http-address.ns.nn1 实际NN web入口
定义client webhttp访问zk内NN的实际 host:port
所有虚拟NN节点都要配置 nn1 nn2hadoop20.baizhiedu.com:50070 dfs.namenode.shared.edits.dir editslog-rpc同步url
NN的editslog被共享在zk的QJN中,
这是定义位置QJN的RPC地址
最后要以/虚拟入口ip
结尾qjournal://hadoop20.baizhi.com:8485;
hadoop21.baizhi.com:8485;
hadoop22.baizhi.com:8485/nsdfs.journalnode.edits.dir editslog位置
定义journal保存editslog的路径位置,任意。/opt/installs/zookeeper3.4.14/journal/data dfs.ha.automatic-failover.enabled 开启自动故障切换 true dfs.client.failover.proxy.provider.ns 故障切换使用的工具类 org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider dfs.ha.fencing.methods 故障切换使用的方案:远程杀死 sshfence dfs.ha.fencing.ssh.private-key-files 免密远程连接节点 /root/.ssh/id_rsa 思路图:
设置所有slaves(不变)
讲配置文件同步到所有hadoop节点
scp -r /opt/installs/hadoop2.8.3/etc/hadoop root@hadoop21.baizhi.com:/opt/installs/hadoop2.8.3/etc
启动HAHadoop
- 启动各个节点的zkServer.sh (出现
QuorumPeerMain
进程)
zkServer.sh start
- 创建命名空间,在主namenode节点下执行(主机)
./hdfs zkfc -formatZK
- 启动QJN的节点服务(所有jn节点都启动)出现
Journalnode
的java进程
./hadoop-deamon.sh start journalnode
- 在zk主机格式化namenode和所有的QJN。(主机)
./hdfs namenode -format ns
说明:ns就是虚拟ip,为了便于该命令找到所有的QJN
- 在zk主机启动namenode服务(主机)
./hadoop-deamon.sh start namenode
- 在zk的备机,启动standby(备机)
./hdfs namenode -boostrapStandby
- zk备机,启动namenode(备机)
./hadoop-deamon.sh start namenode
- 两个zk节点,启动自动切换机制
./hadoop-deamon.sh start zkfc
- 启动所有datanode
hadoop-deamon.sh start datanode
- web访问namenode的节点验证自动切换的问题。
① kill掉active的namenode,查看standby 从机的切换效果。 测试故障切换 ② 在active的namenode上传一个文件,然后kill掉,查看新切换的active的namenode的文件信息,发现也有数据。 测试 standby充当了secondaryNameNode和备份数据的作用。
HA启动顺序总结
初始化ZK
总结
核心服务
- Namenode
① 作为HDFS分布式文件系统的master主机,统领所有datanode; ② 接收client的访问:hdfs协议和http协议; ③ 保存了元数据:文件名 路径 大小 所有者 所属组 权限 修改时间 副本数 块与datanode映射关系(通过这个才能到对应dn获得真正的数据); ④ 数据保存在内存中。 ⑤ 保存元数据的持久化信息:FsImage和editslog数据。
- DateNode
① 存储真正的数据的Block 单个最大128M ② block的元数据、checksum和编号。 ③ 心跳,向NameNode汇报当前节点的健康状态。(没心跳,则标记宕机) ④ 周期汇报datanode的所有block的校验和等数据,确保数据的正确性。
- Client
① 可以是命令行可以使java程序。 ② client访问namenode确定数据相关信息以及是否存在(如果存在就返回已经存在)。 ③ client真正操作数据会与所有的datanode直接通信。 上传,会与最近的datanode通信。 下载,会与所有存储了block的datanode通信。
- SecondaryNameNode
① NameNode持久化助理,代替NameNode完成FSImage和Editslog的合并过程。(checkpoin)
关键数据
- FSImage
① 完整的集群下的所有block数据的元数据。
- Editslog
① 保存了每一次HDFS的文件操作的日志信息。
HA模式
- Zookeeper
① 集群管理器,自动故障切换,解决单点问题。 ② 管理journalnode,保存hdfs的日志信息,保障editslog和hdfs合并,以及故障切换的快速。 ③ 操作投票,保证
- journalNode
① 管理editslog文件信息。
- leader+follower
① zk集群领导者,负责接收总请求。 ② 协调zk集群所有成员对写请求进行投票,超过半数节点返回成功,该操作即可成功。(确保操作的可靠性,效率几乎不降低)