中间件
2024-04-11 14:17:35 28 举报
AI智能生成
登录查看完整内容
hadoop,hive,hbase,zookeeper,kafka,redis
作者其他创作
大纲/内容
海量、高增长率和多样化的信息资产
主要解决,海量数据的存储和海量数据的分析计算问题
TB,PB,EP
概念
大量:Volume
高速:Velocity
多样:Variety
低价值密度:Value
特点:4V
物流仓储
零售
旅游
商品广告推荐
保险
金融
房产
人工智能
应用
1. 产品人员提出需求(统计总用户数、日活跃用户数、回流用户数等)
2. 数据部门搭建数据平台、分析数据指标
3. 数据可视化(报表展示、邮件发送、大屏幕展示等)
大数据部门业务流程分析
Hadoop、Flume、Kafka、HBase、Spark等宽家平台搭建
集群性能控制
集群性能优化
平台组
ETL工程师——数据清洗
Hive工程师——数据分析、数据仓库建模
数据仓库组
算法工程师
推荐系统工程师
用户画像工程师
数据挖掘组
Java EE工程师
数据开发组
大数据部门组织结构
1.大数据概论
由Apache基金会所开发的分布式系统基础架构
hadoop广义上指Hadoop生态圈
是由Lucene作者,用2年业余时间实现了HDFS和MapReduce机制
Hadoop是什么
学习入门最好
Apache
CDH
Cloudera
Hortonworks
三大发行版本
底层维护多个副本
高可靠性
集群间分配数据任务,可以方便的扩展数以千计的节点
高扩展性
在MapReduce的思想下,hadoop是并行工作的,以加快任务处理速度
高效性
能够自动将失败的任务重新分配
高容错性
Hadoop的优势
MapReduce(计算、资源调度)
HDFS(数据存储)
common(辅助工具)
1.X
MapReduce(计算)
Yarn(资源调度)
Common(辅助工具)
2.X
1.x版本和2.x版本区别
文件名
文件目录结构
文件属性(生成时间、副本数、文件权限)
每个人间的块列表和块所在的DataNode
存储文件的元数据
NameNode:NN
在本地文件系统存储文件块数据
块数据的校验和
DataNode:DN
用于监控HDFS状态的辅助后台程序
每隔一段时间获取HDFS元数据的快照
Second NameNode:2NN
HDFS架构概述
客户端提交作业给RM
处理客户端请求
监控NM节点状态
监控NodeManager
启动或监控ApplicationMaster
资源的分配与调度
作用
常驻,一直存在
ResourceManager:RM
管理单个节点上的资源
处理来自RM的命令
处理来自AM的命令
NodeManager:NM
负责数据的切分
为应用程序申请资源并分配给内部的任务
任务的监控与容错
ApplicationMaster:AM
是Yarn中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等
Container
YARN架构概述
思想、算法
并行处理输入数据
Map
对Map结果进行汇总
Reduce
两个阶段
MapReduce架构概述
数据库(结构化数据)
文件日志(半结构化数据)
视频、ppt等(非结构化数据)
数据涞源层
Sqoop数据传递
Flume日志收集
Kafka消息队列
数据传输层
HBase非关系型数据库
HDFS文件存储
数据存储层
Yarn资源管理
资源管理层
Hive 数据查询
Mahout数据挖掘
MapReduce离线计算
Spark Mlib数据挖掘
Spark R 数据分析
Spark SQL 数据查询
Spark Streaning实时计算
Spark Core内存计算
Storm实时计算
数据计算层
Oozie任务调度
Azkaban任务调度
任务调度层
大数据技术生态体系
Hadoop组成(面试重点)
2.从Hadoop框架讨论大数据生态
SecureCRT工具安装及使用
Sublime ftp插件安装、配置及使用
安装centos虚拟机
修改虚拟机的静态IP
修改主机名
关闭防火钱
创建用户
配置用户root权限
在/opt目录下创建文件夹
虚拟机环境准备
安装JDK
安装Hadoop
bin
Hadoop的配置文件目录,存放Hadoop的配置文件
etc
存放Hadoop的本地库(对数据进行压缩解压缩功能)
lib
存放启动或停止Hadoop相关服务的脚本
sbin
存放Hadoop的依赖jar包、文档、和官方案例
share
重要目录
Hadoop目录结构
3.Hadoop运行环境搭建(开发重点)
官方Grep案例
官方WordCount 案例
本地模式
修改JAVA_HOME
配置Hadoop-env.sh
hdfs://hadoop102:9000
fs.defaultFS
/opt/module/hadoop-2.7.2/data/tmp
hadoop.tmp.dir
配置core-site.xml
1
dfs.replication
配置hdfs-site.xml
配置集群
bin/hdfs namenode -format
格式化NameNode
sbin/hadoop-daemon.sh start namenode
启动NameNode
sbin/hadoop-daemon.sh start datanode
启动DataNode
启动集群
NameNode
DataNode
jsp
查看是否启动成功
http://hadoop102:50070
web端查看HDFS文件系统
目录/opt/module/hadoop-2.7.2/logs
查看产生的Log日志
思考:为什么不能一直格式化NameNode,格式化NameNode,要注意什么?
查看集群
bin/hdfs dfs -mkdir -p /user/jast/input
创建文件夹/目录
bin/hdfs dfs -put wcinput /user/jast/input/
上传文件
bin/hdfs dfs -ls /user/jast/input/wcinput
bin/hdfs dfs -cat /user/jast/input/wcinput
查看文件
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount /user/jast/input/ /user/jast/output
运行MapReduce程序
bin/hdfs dfs -cat /user/jast/output/part-r-00000
查询输出结果
操作集群
启动HDFS并运行MapReduce程序
配置一下JAVA_HOME
配置yarn-env.sh
yarn.nodemanager.aux-services= mapreduce_shuffle
yarn.resourcemanager.hostname=hadoop101
配置yarn-site.xml
配置:mapred-env.sh
mapreduce.framework.name=yarn
配置: (对mapred-site.xml.template重新命名为) mapred-site.xml
启动前必须保证NameNode和DataNode已经启动
sbin/yarn-daemon.sh start resourcemanager
启动ResourceManager
sbin/yarn-daemon.sh start nodemanager
启动NodeManager
http://hadoop102:8088/cluster
YARN的浏览器页面查看
集群操作
启动YARN并运行MapReduce程序
查看程序的历史运行情况
mapreduce.jobhistory.address=hadoop102:10020
mapreduce.jobhistory.webapp.address=hadoop102:19888
配置mapred-site.xml
sbin/mr-jobhistory-daemon.sh start historyserver
启动历史服务器
jps
查看历史服务器是否启动
http://hadoop102:19888/jobhistory
查看JobHistory
应用运行完成以后,将程序运行日志信息上传到HDFS系统上
可以方便的查看到程序运行详情,方便开发调试
在web界面上就可以看到日志
概念及好处
yarn.log-aggregation-enable=true
yarn.log-aggregation.retain-seconds=604800
重启(关闭、启动)NodeManager、ResourceManager和HistoryManager
配置日志的聚集
伪分布式模式
准备三台客户机(关闭防火墙、静态IP、主机名称)
配置环境变量
单点启动
配置ssh
群起并测试集群
分析
secure copy安全拷贝
可以实现服务器与服务器之间的数据拷贝
定义
scp -r 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
基本语法
案例实操
scp
用于备份和镜像
具有速度快、避免复制相同内容和支持符号链接的优点
rsync做文件的复制比scp的速度快,只对差异文件做更新
scp是把所有文件都复制过去
rsync和scp的区别
rsync -rvl 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
-r:递归
-v:显示复制过程
-l:拷贝符号链接
选项
rsync -rvl /opt/software/ root@hadoop102:/opt/software
实例操作
rsync
https://github.com/jast90/awesome-books/issues/5
实现参考
编写集群分发脚本xsync
3个DataNode
1个NameNode
1个SecondaryNameNode
HDFS
1个ResourceManager
3个NodeManager
YARN
规划
fs.defaultFS=hdfs://hadoop102:9000
hadoop.tmp.dir=/opt/module/hadoop-2.7.2/data/tmp
core-site.xml
JAVA_HOME
hadoop-env.sh
dfs.replication=3
dfs.namenode.secondary.http-address=hadoop104:50090
hdfs-site.xml
yarn-env.sh
yarn.nodemanager.aux-services=mapreduce_shuffle
yarn.resourcemanager.hostname=hadoop103
yarn-site.xml
mapred-env.sh
mapred-site.xml
MapReduce
同步hadoop配置,确保每台机器上相同
集群配置
hadoop namenode -format
第一次启动需要格式化NameNode
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
启动DataNode(三台机器上启动)
SecondaryNameNode可以不用启动
集群单点启动
vim /opt/module/hadoop-2.7.2/etc/hadoop/slaves
添加主机IP或名称
同步slaves文件
配置slaves
第一次启动格式化NameNode
sbin/start-dfs.sh
启动HDFS(hadoop102上执行)
sbin/start-yarn.sh
注意:NameNode和ResourceManger如果不是同一台机器,不能在NameNode上启动 YARN,应该在ResouceManager所在的机器上启动YARN。
启动YARN(hadoop103上执行)
群起集群
bin/hdfs dfs -put wcinput/wc.input /user/jast/input
上传文件到集群
/opt/module/hadoop-2.9.2/data/tmp/dfs/data/current/BP-887351770-192.168.99.102-1584863549747/current/finalized/subdir0/subdir0
hadoop hdfs文件存放的位置
集群基本测试
hadoop-daemon.sh start/stop namenode/datanode/secondarynamenode
HDFS
yarn-daemon.sh start/stop resourcemanager/nodemanager
各个服务组件逐一启动/停止
start-dfs.sh/stop-dfs.sh
整体启动HDFS
start-yarn.sh/stop-yarn.sh
整体启动YARN
各模块分开启动
集群启动/停止总结
ntp
crontab
集群时间同步
完全分布式模式
4.Hadoop运行模式
hadoop-2.7.2-src.tar.gz
5.hadoop源码编译
入门
需要一种系统来管理多台机器上的文件
HDFS只是分布式文件管理系统的一种
产生背景
文件系统
分布式
适合一次写入,多次读出的场景,且不支持文件的修改
适合处理大数据
构建在廉价机器上
优点
不适合低延时数据访问
无法高效的对大量小文件进行存储
不支持并发、文件随机修改
缺点
master、主管、管理者
管理HDFS命名空间
配置副本策略
管理数据块映射信息
处理客户端读写请求
Slave
存储实际的数据块
执行数据块的读写操作
客户端
文件切分
与NameNode交互
与DataNode交互
提供一些命令来管理HDFS
通过一些命令来访问HDFS
Client
辅助NameNode,分担其工作量
在紧急情况下,可辅助恢复NameNode
Secondary NameNode
HDFS组成框架
文件在物理上是分块存储,默认大小在Hadoop2.x版本中是128M,老版本中是64M
HDFS文件块大小
HDFS概述
bin/hadoop fs 具体命令 OR bin/hdfs dfs 具体命令
dfs是fs的实现类
通过hadoop fs查看命令
命令基本和Linux命令相似
-appendToFile
-cat
-checksum
-chgrp
命令大全
hadoop fs -help rm
-help
hadoop fs -ls /
显示目录信息
hadoop fs -mkdir -p /user/test
创建目录
-moveFromLocal
从本地剪切粘贴到HDFS
追加一个文件到已经存在的文件末尾
显示文件内容
-chmod
-chown
修改文件所属权限
-copyFromLocal
从本地拷贝文件到HDFS路径去
-copyToLocal
从HDFS拷贝到本地
-cp
从HDFS的一个路径拷贝到另一个路径
-mv
在HDFS目录中移动文件
-get
从HDFS下载文件到本地
-getmerge
合并下载多个文件
-put
-tail
显示文件的末尾
-rm
删除文件或文件夹
-rmdir
删除空目录
-du
统计文件夹的大小信息
-setrep
设置HDFS中文件的副本数量
常用命令实操
HDFS的Shell操作
hadoop-common
hadoop-client
hadoop-hdfs
hadoop jar包
new Configuration创建对象
df.defaultFS=hdfs://hadoop102:9000
设置属性
Configuration类
FileSystem.get(configuration)
构造对象
mkdirs
操作hdfs
FileSystem类
代表HDFS中的目录
Path类
编码
HDFS客户端操作(开发重点)
组件
1.客户端通过Distribute 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步
剖析文件写入
在HDFS写入数据的过程中,NameNode会选择距离带上传数据最近距离的DataNode接受数据
同一节点上的进程,节点距离为0
同一机架上的不同节点,节点距离为2
同一数据中心不同机架上的节点,节点距离为4
不同数据中心的节点,节点距离为6
节点距离:两个节点到达最近的共同祖先的距离总和
网络拓扑-节点距离计算
看官网
副本节点选择
机架感知
写数据流程
1.客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址
2.挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据
3.DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)
4.客户端以Packet为单位接收,现在本地缓存,然后写入目标文件
读数据流程
HDFS的数据流(面试重点)
存在磁盘,效率低
存在内存,数据易丢失
那就内存、磁盘都存储一份
FSImage
Edits
每当有元数据更新或添加元数据时,修改内存中的元数据并追加到Edits中,由NN负责
2NN则负责合并Edits到FSImage
hadoop实现
NameNode元数据存储在哪里?
1.第一次启动NameNode格式化后,创建FsImage和Edits文件;如果不是第一次启动,直接加载Edits文件和FsImage文件到内存
2.客户端对元数据进行增删改的请求
3.NameNode记录操作日志,更新滚动日志
4.NameNode在内存中对数据进行增删改
NameNode启动
1. 2NN询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。
2. 2NN请求执行CheckPoint
3. NameNode滚动正在写的Edits日志
4. 将滚动前的编辑日志和镜像文件拷贝到2NN
5. 2NN 加载编辑日志和镜像文件到内存,并合并
6. 生成新的镜像文件fsimage.chkpoint
7. 拷贝fsimage.chkpoint到NameNode
8. NameNode将fsimage.chkpoint重新命名成fsimage
Secondary NameNode工作
NN和2NN工作机制
fsimage_00000000000000000
fsimage_00000000000000000.md5
seen_txid
VERSION
NameNode被格式化后,将在/opt/module/hadoop-2.9.2/data/tmp/dfs/name/current目录下产生如下文件
HDFS文件系统元数据的一个永久性的检查点
其中包含HDFS文件系统的所有目录和文件inode的序列化信息
Fsimage文件
存放HDFS文件系统的所有更新操作的路径
文件系统客户端执行的所有写操作首先会被记录到Edits文件中
Edits文件
保存的是一个数字
就是最后一个edits_的数字
seen_txid文件
每次NameNode启动的时候都会将Fsimage文件读入内存,加载Edits里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成NameNode启动时就将Fsimage和Edits文件进行了合并
hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径
hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-2.9.2/fsimage.xml
oiv查看Fsimage文件
hdfs oev -p 文件类型 -i编辑日志 -o 转换后文件输出路径
hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-2.9.2/edits.xml
oev查看Edits文件
思考:NameNode如何确定下次开机启动的时候合并哪些Edits?
Fsimage和Edits解析
dfs.namenode.checkpoint.period=3600
SecondaryNameNode每隔一小时执行一次
dfs.namenode.checkpoint.check.period=60
一分钟检查一次操作次数
dfs.namenode.checkpoint.txns= 1000000
当操作次数达到1百万时,SecondaryNameNode执行一次
CheckPoint时间设置
方法一:将SecondaryNameNode中数据拷贝到NameNode存储数据的目录;
方法二:使用-importCheckpoint选项启动NameNode守护进程,从而将SecondaryNameNode中数据拷贝到NameNode目录中。
NameNode故障处理
概述
集群安全模式
NameNode多目录配置
NameNode和SecondaryNameNode
1.一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据(包括数据块的长度,块数据的检验和,以及时间戳)
2.DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息
3.心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制数据块到另一台机器,或删除某个数据块。如果心跳超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
4.集群运行中可以安全加入和退出一些机器
DataNode工作机制
1)当DataNode读取Block的时候,它会计算CheckSum
2)如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏
3)Client读取其他DataNode上的Block
4) DataNode在其他文件创建后周期验证CheckSum
DataNode保证数据完整性的方法
数据完整性
dfs.namenode.heartbeat.recheck-interval=300000
dfs.heartbeat.interval=3
掉线时限参数设置
复制一台机器
直接启动DataNode,即可关联到集群
服役新数据节点
创建dfs.hosts文件,并写入需要运行的DataNode的主机名
在NameNode的hdfs-site.xml文件中添加dfs.hosts属性,值为上一步创建的dfs.hosts文件全路径名
分发hdfs-site.xml
hdfs dfsadmin -refreshNodes
刷新NameNode
yarn rmadmin -refreshNodes
刷新ResourceManager
sbin/start-balancer.sh
如果数据不均衡,可以用命令实现集群的再均衡
添加白名单
文件内容为要退役的主机名
创建dfs.host.exclude文件
值为上一步创建的dfs.host.exclude文件全路径
在NameNode主机上的hdfs-site.xml中添加dfs.hosts.exclude属性
刷新NameNode、ResourceManager
检查web浏览器,退役节点的状态为decommission in progress
等退役节点状态为decommissioned,停止节点的datanode和nodemanager
如果数据不均衡,可以用命令实现集群的再平衡
黑名单退役
不允许白名单和黑名单中同时出现同一个主机名称
退役旧数据节点
DataNode也可配置成多个目录,每个目录存储的数据不一样
具体配置
DataNode多目录配置
DataNode(面试开发重点)
distcp
bin/hadoop distcp hdfs://hadoop102:9000/user/jast/hello.txt hdfs://hadoop103:9000/user/jast/hello.txt
hadoop集群间的递归数据复制
集群件数据拷贝
大量的小文件会耗尽NameNode中的大部分内存
存储小文件需要的磁盘容量和数据块的大小无关
HDFS存储小文件弊端
是一个更高效的文件存档工具
HDFS存档文件HAR文件
解决存储小文件办法之一
小文件存档(HAR)
开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用
fs.trash.interval=1
fs.trash.checkpoint.interval=0
hadoop.http.staticuser.user=jast
/user/jast/.Trash/...
查看回收站
Trash类
hadoop fs -mv
恢复回收站
hadoop fs -expunge
清空回收站
回收站
快照相当于对目录做一个备份,并不会立即复制所有文件,而是记录文件变化
快照管理
HDFS 2.x新特性
HA,即高可用(7*24小时不中断服务)
实现高可用最关键的策略是消除单点故障
Hadoop2.0之前,在HDFS集群中NameNode存在单点故障
NameNode机器发生意外
NameNode 机器需要升级
NameNode主要在以下两个方面影响HDFS集群
HDFS HA 功能通过配置Active/Standnby两个NameNode实现在集群中对Name Node的热备来解决上述问题,如果出现故障,如机器崩溃或机器需要升级维护,这是可以通过此种方式将NameNode很快的切换到另一台机器
HA 概述
通过双NameNode消除单点故障
内存中各自保存一份元数据
Edits日志只有Active状态的NameNode节点可以做写操作
两个NameNode都可以读取Edits
共享的Edits放在一个共享存储中管理
元数据管理方式需要改变
工作要点
HDFS HA工作机制
HDFS HA(高可用)
易于编程
. 良好的扩展性
适合PB级以上海量数据的离线处理
不擅长实时计算
不擅长流式计算
不擅长DAG(有向图)计算
优缺点
核心编程思想
核心思想
MrAppMaster
MapTask
ReduceTask
进程
Map类
Reduce类
Driver类
官方WordCount源码
常用数据序列化类型
Mapper
Reducer
Driver
用户编写的程序分成三个部分
编程规范
需求
需求分析
jar包依赖
log4j
环境准备
源码
编写程序
本地测试
集群上测试
WordCount案例实操
什么是序列化
为什么要序列化
为什么不用java的序列化
序列化概述
具体实现bean对象序列化步骤如下7步。
自定义bean对象实现序列化接口
数据准备
序列化案例实操
序列化
问题引出
MapTask并行度决定机制
切片与MapTask并行度决定机制
Job提交流程源码解析
FileInputFormat切片源码解析
Job提交流程源码和切片源码详解
TextInputFormat
默认的InputFormat
切片机制
案例分析
计算切片大小的公式
切片大小设置
获取切片信息API
参数配置
FileInputFormat切片机制
应用场景
虚拟存储切片最大值设置
虚拟存储
切片
CombineTextInputFormat切片机制
实现过程
CombineTextInputFormat案例实操
思考
KeyValueTextInputFormat
NLineInputFormat
CombineTextInputFormat
自定义InputFormat
常见接口实现类
FileInputFormat实现类
KeyValueTextInputFormat使用案例
NLineInputFormat使用案例
背景
步骤
实现源码
自定义InputFormat案例实操
InputFormat数据输入
MapReduce工作流程
shuffle机制
MapTask工作机制
ReduceTask工作机制
OutputFormat数据输出
Join多种应用
计数器应用
数据清洗(ETL)
MapReduce开发总结
MapReduce框架原理
Hadoop
为分布式应用提供协调服务
负责存储和管理大家都关心的数据
接收观察者的注册
负责通知已经在Zookeeper上注册的观察者
是一个基于观察者模式设计的分布式服务管理框架
一个领导者,多个观察者组成的集群
集群中只要有半数以上节点存活,Zookeeper集群就能正常服务
每个server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的
全局数据一致
来自同一个client的更新请求按其发送顺序一次执行
更新请求顺序进行
一次数据更新要么成功,要么失败
数据更新原子性
在一定范围内,client能读到最新数据
实时性
特点
数据模型结构与unix文件系统很类似
整体可以看作一棵树
默认能够存储1MB的数据
每个节点都可以通过其路径唯一标识
每个节点称作一个ZNode
数据结构
统一命名服务
统一配置管理
统一集群管理
服务器节点动态上下线
软负载均衡
提供服务
scp ~/Downloads/apache-zookeeper-3.8.3-bin.tar root@192.168.0.104:/opt/software
上传Zookeeper安装包到Linux系统下
tar -zxvf a -C b
解压到指定目录
准备
zoo_sample.cfg修改为zoo.cfg
在Zookeeper目录下创建
创建zkData目录
dataDir=/path/to/zookeeper/zkData
修改zoo.cfg
配置修改
bin/zkServer.sh start
启动
QuorumPeerMain
查看进程
bin/zkServer.sh status
查看状体
bin/zkCli.sh
启动客户端
quit
退出客户端
bin/zkServer.sh stop
停止
操作Zookeeper
通信心跳数
Zookeeper与客户端心跳时间,单位毫秒
2000
默认值
tickTime
集群中的Follower跟随者服务器与Leader领导者服务器之间初始连接时能容忍的最多心跳数(tickTime数量)
用它来限定集群中的Zookeeper服务器连接到Leader的时限
LF初始通信时限
10
initLimit
集群中Leader与Follower之间的最大响应时间单位
假如响应超过syncLimit*tickTime,Leader认为Follower死掉,从服务器列表中删除Follower
LF同步通信时限
5
syncLimit
数据目录+数据持久化目录
主要用于保存Zookeeper中的数据
dataDir
监听客户端连接的端口
客户端连接端口
2181
clientPort
配置参数
安装
集群中半数以上机器存活,集群可用
Zookeeper适合安装奇数台服务器
半数机制
Zookeeper工作时,是有一个节点为leader,其他则为Follower
Leader是通过内部的选举机制临时产生的
配置文件中未配置Master和Slave
服务器1启动,此时只有一台服务器启动了,它发出去的报文没有任何响应,所以他的选举状态一直是Looking状态
服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以id值较大的服务器2胜出,但是由于没有达到超过半数以上的服务器都同意选举它(半数以上是3),所以服务器1、2还是继续保持Looking状态
服务器3启动,根据前面的理论分析,服务器3成为服务器1、2、3中的老大,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的Leader
服务器4启动,根据前面的分析,理论上服务器4应该是服务器1、2、3、4中最大的,但是由于前面已经有半数以上的服务器选举了服务器3,所以只能是follower了
服务器5启动,同4
5台服务器集群
选举过程
选举机制
客户端和服务器断开连接后,创建的节点不删除
持久
客户端和服务器断开连接后,创建的节点自己删除
短暂
节点类型
创建节点时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护
顺序节点
内部原理
hadoop102
hadoop103
hadoop104
3个节点
集群规划
tart -zxvf zookeeper-3.4.10.tar.gz -C /opt/module
echo 2>>myid
在zkData目录下创建myid文件
dataDir=/opt/module/zookeeper-3.4.10/zkData
2888是这个服务器与集群中的Leader服务器交换信息的端口
3888是万一集群中的leader服务器挂了,需要一个端口来重新进行选举,选出一个新的leader,而这个端口就是用来执行选举时服务器互相通信的端口
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
zoo.cfg
配置
在hadoop102上安装配置
分别在hadoop103,hadoop104上修改dataDir/myi中的值为3,4
分发到hadoop103,hadoop104
三台机器分别启动Zookeeper
JMX enabled by defaultUsing config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfgMode: follower
查看状态
分布式安装部署
help
ls path [watch]
-s 有序列
-e 临时
create
get path [watch]
set
stat
delete
rmr
客户端命令行操作
org.apache.logging.log4j:log4j-core:2.8.2
org.apache.zookeeper:zookeeper:3.4.10
jar
ZooKeeper
类
API应用
Watcher
监听服务器节点动态上下线案例
实战
Zookeeper的选举机制
监听原理
部署方式
集群中的角色
集群最少几台机器
常用命令
企业面试真题
Zookeeper
是Cloudera提供的一个高可用、高可靠的,分布式的海量日志采集、聚合和传输的系统
基于流式架构、灵活简单
一个JVM进程
以事件的形式将数据从源头送至目的
是Flume数据传输的基本单元
是负责接收数据到Flume agent的组件
avro
thrift
适用于监控一个实时追加的文件
不能保证数据不丢失
exec
jms
保证数据不丢失,且能够实现断点续传
延迟较高,不能实时监控
spooling directory
netcat
sequence generator
syslog
http
legacy
保证数据不丢失
实现断点续传
能攻进行实时监控
taildir
1.7新增
可以处理各种类型、各种格式的日志数据
source
位于source和sink之间的缓冲区
允许Source和Sink运作在不同速率上
可以同时处理几个source的写入操作和几个sink的读取操作
线程安全的
内存中的队列
不需要关心数据丢失
适用场景
Memory Channel
将所有事件写到磁盘
数据不丢失
File Channel
类型
replicating(默认值)
Multiplexing
自定义
Channel Selector
channel
sink不断轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者发送到另一个Flume Agent
在从channel批量删除数据前,每个sink用channel启动一个事物
批量事件一旦成功写出到存储系统或下一个Flume Agent,sink就利用Channel提交事物
事物一旦被提交,该channel从自己的内部缓冲区删除事件
Sink是完全事务性的
hdfs
logger
ipc
null
HBase
solr
sink组件的目的地包括
sink
组成
agent
传输单元
Flume数据传输的基本单元
以事件的形式将数据从源头送至目的地
event
组成架构
Flume agent连接
单source,多channel、sink
flume负载均衡
flume agent聚合
拓扑结构
将事件传递给拦截器,拦截事件
channel 处理器
会将source过来的event发往所有channel
Replicating Channel Slector
可以配置发往哪些channel
Multiplexing Channel Selector
channel 选择器
sink处理器
flume agent内部原理
官网地址
1.7.0
版本
tar包上传到/opt/software目录下
tar -zxcf *flume*.tar.gz -C /opt/module
解压tar到/opt/module目录下
mv *flume* flume
改名为flume
mv flume/conf/flume-env.sh.template flume-env.sh
从模板创建配置文件flume-env.sh
export JAVA_HOME=/opt/module/jdk**
修改flume-env.sh
安装部署
快速入门
启动flume任务,监控本机44444端口,服务端
通过netcat工具向本机44444端口发送消息,客户端
flume将监听的数据实时显示在控制台
案例需求
nc localhost 44444
sudo yum insgtall -y nc
安装netcat
sudo netstat -tunlp|grep 44444
判断端口是否占用
mkdir job
创建job目录
touch flume-netcat-logger.conf
创建Flume agent配置文件
参考官网
https://github.com/jast90/awesome-books/issues/19
vim flume-netcat-logger.conf
添加内容
创建Flume agent配置文件flume-netcat-logger.conf
先开启flume监听端口
使用netcat工具向本机的44444端口发送内容
在Flume监听页面观察接收数据情况
实现步骤
监控端口数据官方案例
实时监控Hive日志,并上传到HDFS中
/opt/module/hive/logs/hive.log作为source
HDFS作为sink
commons-configuration-1.6.jar
hadoop-auth-2.7.2.jar
hadoop-common-2.7.2.jar
hadoop-hdfs-2.7.2.jar
commons-io-2.4.jar
htrace-core-3.1.0-incubation.jar
Flume 要想将数据输出到HDFS,必须有Hadoop相关jar包,拷贝到/opt/module/flume/lib
官网文档
参考
在job目录下创建flume-file-hdfs.conf文件
bin/flume-ng agent --conf conf/ --name a2 --conf-file job/flume-file-hdfs.conf
开启hadoop和hive并产生日志
在HDFS上查看文件
实时读取本地文件到HDFS案例(exec source)
使用Flume监听整个目录的文件
被监控的目录/opt/module/flume/upload
spooldir 作为source
memory channel
在job目录下创建配置文件flume-dir-hdfs.conf
bin/flume-ng agent --conf conf/ --name a3 --conf-file job/flume-dir-hdfs.conf
启动监控文件夹命令
mkdir upload
touch 1.txt
touch 1.tmp
touch 1.log
向upload文件夹中添加文件
查看HDFS上的数据
除了tmp文件,其他文件全部加上.COMPLETED文件后缀
等待1s,再次查看upload文件夹
实时读取目录文件到HDFS案例(spooldir source)
使用flume监听整个目录的实时追加文件,并上传至HDFS
taildir作为source
实时监控目录下的多个追加文件(taildir source)
单数据源多出口案例(选择器)案例
单数据源多出口案例(Sink组)案例
多数据源汇总案例
企业开发案例
实现Interceptor接口
initialize()
处理单个Event
处理多个Event
intercept()
close()
实现响应的接口方法
在source中定义interceptors
使用flume采集服务器本地日志,需要按照日志类型的不同,将不同种类的日志发往不同的分析系统
测试
自定义Interceptor
官方提供的source类型并不能满足实际开发当中的需求,需要根据需求自定义某些source
继承AbstractSource类
实现Configurable和PollableSource接口
getBackOffSleepIncrement()
getMaxBackOffSleepInterval()
configure(Context context)
process()
实现方法
使用flume接收数据,并给每条数据添加前缀,输出到控制台
实现configure(Context context)、process()
通过maven打包成无依赖jar,并上传到flume目录下的lib目录下
在job目录下创建mysource.conf文件
配置文件
开启任务
自定义Source
官方提供的source类型并不能满足实际开发当中的需求,需要根据需求自定义某些sink
继承AbstractSink类
实现Configurable接口
使用flume接收数据,并在Sink端给每条数据添加前缀和后缀,输出到控制台。前缀可在flume任务配置文件中配置
在job目录下创建mysink.conf文件
自定义sink
自定义组件
sudo yum -y install httpd php
安装httpd服务和php
sudo yum -y install rrdtool perl-rrdtool rrdtool-devel
sudo yum -y install apr-devel
安装其他依赖
sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo yum -y install ganglia-gmetad
sudo yum -y install ganglia-web
sudo yum install -y ganglia-gmond
安装ganglia
sudo vim /etc/httpd/conf.d/ganglia.conf
修改内容:Allow from all
修改配置文件/etc/httpd/conf.d/ganglia.conf
data_source \"hadoop102\" 192.168.9.102
修改配置文件/etc/ganglia/gmetad.conf
参考:http://blog.sina.com.cn/s/blog_c30a9e680102z2ep.html
修改配置文件/etc/ganglia/gmond.conf
SELINUX=disabled
修改配置文件/etc/selinux/config
sudo service httpd start
sudo service gmetad start
sudo service gmond start
启动ganglia
http://192.168.9.102/ganglia
出现权限不足错误时,sudo chmod -R 777 /var/lib/ganglia
打开网页浏览ganglia页面
Ganglia的安装与部署
JAVA_OPTS=\"-Dflume.monitoring.type=ganglia-Dflume.monitoring.hosts=192.168.9.102:8649-Xms100m-Xmx200m\"
修改/opt/module/flume/conf目录下的flume-env.sh配置
启动Flume任务
发送数据观察ganglia监测图
http://blog.sina.com.cn/s/blog_c30a9e680102z2eq.html
操作Flume测试监控
Flume监控之Ganglia
^
$
*
[a-z]
常见正则表达式语法
http://blog.sina.com.cn/s/blog_c30a9e680102z2er.html
练习
知识扩展
如何实现Flume数据传输的监控
Flume的Channel Selectors
Flume参数调优
Flume的事物机制
Flume采集数据会丢失吗
http://blog.sina.com.cn/s/blog_c30a9e680102z2es.html
企业真实面试题
Flume
异步处理
一对一
消费者主动拉取数据
消息收到后消息清除
点对点模式
一对多
数据生产后,推送给所有订阅者
发布/订阅模式
模式
消息队列
解耦
冗余
扩展性
灵活性&峰值处理能力
可恢复性
顺序保证
缓冲
异步通信
为什么需要消息队列
消息保存时根据Topic进行归类
kafka集群有多个kafka实例
一个分布式的基于发布/订阅模式的消息队列
主要应用于大数据实际处理领域
依赖zookeeper
什么是Kafka
消息生产者
producer
消息消费者
consumer
理解为一个队列
topic
kafka用来实现一个topic消息的广播和单播的手段
一个topic可以有多个CG
topic的消息会复制到所有的CG,但是每个partion只会把消息发给CG中的一个consumer
如果需要实现广播,只要每个consumer有一个嘟咧的CG就可以
要实现单播只要所有的consumer在同一个CG
??
用CG还可以将consumer进行自由的分组而不需要每次发送消息到不同的topic
consumer group
一台服务器就是一个broker
一个集群由多多个broker组成
一个broker可以容纳多个topic
broker
为了实现扩展性,一个非常大的topic可以分不到多个broker上
partition中的每条消息都会被分配一个有序的id(iffset)
kafka只能保证一个partion中的顺序将消息发送给consumer,不能保证一个topic的整体(多个partition)的顺序
partition
kafka的存储文件都是按照offset.kafka来命名
用offset做名字的好处是方便查找
the first offset就是00000000000.kafka
offset
架构
zk
kafka
kafka下载地址
tar包下载
tar -zxvf kafka_2.11-0.11.0.0.tgz -C /opt/module/
解压安装包
mv kafka_2.11-0.11.0.0/ kafka
修改解压后的文件名
mkdir logs
创建logs目录
cd config
broker.id=0
delete.topic.enable=true
log.dirs=/opt/module/kakfa/logs
vi server.properties
修改配置文件
export KAFKA_HOME=/opt/module/kafka
export PATH=$PATH:$KAFKA_HOME/bin
sudo vi /etc/profile
source /etc/profile
分发安装包
bin/kafka-server-start.sh conf/server.properties &
bin/kafka-server-stop.sh stop
关闭集群
集群部署
bin/kafka-topic.sh --zookeeper hadoop102:2181 --list
查看当前服务器中的所有topic
bin/kafka-topics.sh --zookeeper hadoop102 2181 \\ --create --replication-factor 3 --partitions 1 --topic first
--topic:定义topic名
--replication-factor:定义副本数
--partitions:定义分区数
选项说明
创建topic
bin/kafka-topic.sh --zookeeper hadoop102:2181 --delete --topic first
需要server.properties中设置delete.topic.enable=true,否则只是标记删除或者直接重启
删除topic
bin/kafka-console-producer.sh --broker-list hadoop102:9092 --topic first
发送消息
bin/kafka-console-consumer.sh --zookeeper hadoop102:2181 --from-beginning --topic first
--from-beginning:会把first主题中以往所有的数据读取出来,根据业务场景选择是否增加该配置
消费消息
bin/kafka-topics.sh --zookeeper hadoop102:2181 --describe --topic first
查看某个topic的详情
Kafaka命令操作
producer采用推模式将消息发布到broker
顺序写磁盘效率比随机写内存要高,保障kafka吞吐量
每条消息都被追加到分区中,属于顺序写磁盘
写入方式
消息发送时都被发送到一个topic,其本质就是一个目录
而topic是由一些partition logs(分区日志)组成
每个partition中的消息都是有序的,生产的消息不断追加到partition log上,其中的每一个消息都被赋予了一个唯一的offset值
方便在集群中扩展,每个partition可以通过调整以适应他所在的机器,而一个topic又可以有多个partition组成,因此整个集群就可以适应任意大小的数据了
可以跳高并发,因为可以以partition为单位读写
分区原因
指定了partition,则直接使用
未指定partition但指定key,通过对key的value进行hash出一个partition
partition和key都未指定,使用轮询选出一个partition
分区原则
分区
对应server.properties配置中的default.replication.factor=N
同一个分区partition可能会有多个replication
没有replication的情况下,一旦broker宕机,其上所有partition的数据都不可被消费,同时producer也不能再将数据存于其上的partition
引入replication之后,同一个partition可能会有多个replication,而这时需要在这些replication之间选出一个leader,producer和consumer只与整个leader交互,其它replication作为follower从leader中复制数据
副本
生产过程分析
物理上把topic分成一个或多个partition
每个partition物理上对应一个文件夹
存储方式
无论消息是否被消费,kafka都会保留所有消息
log.retention.hours=168
基于时间
log.retention.bytes=1073741824
基于大小
删除旧数据的策略
Kafk读取特定消息的时间复杂度为O(1)
存储策略
Zookeeper存储结构
broker保存消息
消费过程分析
工作流程几文件存储机制
consumer采用pull模式从broker中读取数据
push 模式很难适应消费速率不同的消费者,因为消息发送速率由broker决定
broker的目标是尽可能以最快速度传递消息,但是这样容易造成consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞
消息发送速率由broker决定
不需要轮询
push
可以根据consumer的消费能力以适当的速率消费消息
针对这一点,kafka的消费者在消费数据时会传入一个时长参数timeout,如果当前没有数据可供靠费,consumer会等待一段时间后再返回,这段时长即为timeout
kafka的改进?
如果kafka没有数据,消费者可能会陷入循环中,一直返回空数据
pull
pull VS push
消费方式
RoundRobin
Range
分区配置策略
offset的维护
消费者组案例
Kafka消费者
生成着生产数据,要写入到log文件中,写的过程是一直追加到文件末端,为顺序写
顺序写磁盘
零拷贝技术
高效读写数据
Zookeeper在Kafka中的作用
架构深入
Kafka的Producer发送消息采用的是异步发送的方式
将消息发送给RecordAccumulator
partitioner
serializer
interceptors
流程
main线程
不断从RecordAccumulator中拉取消息发送到kafka broker
sender线程
两个线程
RecordAccumulator
一个线程共享变量
只有数据累积到batch size之后,sender才会发送数据
batch.size
如果数据迟迟未达到batch.size,sender等待linger.time之后就会发送数据
linger.ms
消息发送流程
org.apache.kafka:kafka-clients:0.11.0.0
依赖
生产者对象用于发送数据
KafkaProducer
生产者配置参数
ProducerConfig
每条数据都要封装成一个ProducerRecord对象
ProducerRecord
带回调的函数的API
不带回调函数的API
异步发送API
同步的意思是,一条消息发送之后,会阻塞当前线程,直至返回ack
同步发送
Producer API
KafkaConsumer
ConsumerConfig
ConsumerRecord
是否开启自动提交offset
enbale.auto.commit
自动提交offset的时间间隔
auto.commit.interval.ms
自动提交offset
自动提交十分简洁方便,但是由于其是基于时间提交的,开发人员难以把握offset提交的时机。
阻塞当前线程,一直到提交成功,并且会自动失败重试
commitSync
没有失败重试机制,故有可能提交失败
commitAsync
都会提交本次poll的一批数据最高的偏移量提交
手动提交offset的方法
enbale.auto.commit设为false
consumer.commitSync()
同步提交
consumer.commitAsync()
异步提交
无论是同步提交还是异步提交offset,都有可能会造成数据的漏消费或者重复消费
先提交offset后消费,有可能造成数据的漏消费
先消费后提交offset,有可能会造成数据的重复消费
消费者端去保证
0.11之前版本
Kafka实现精准一次
0.11之后版本
如何避免
数据漏消费和重复消费分析
手动提交offset
0.9之前,offset存储在zookeeper
0.9之后,默认将offset存储在kafka的一个内置的topic中
Kafka还可以选择自定义存储offset
offset的维护是相当繁琐的,需要考虑到消费者的rebalance
当有新的消费者加入消费者组,已有的消费者推出消费者组或者所订阅的主题的分区发生变化,就会出发到分区的重新分配
消费者要首先获取到自己被重新分配的分区,并且定位到每个分区最近提交的offset位置继续消费
rebalance
ConsumerRebalanceListener
接口
consumer.subscribe()时传递一个ConsumerRebalanceListener对象
自定义存储offset
Consumer API
Producer拦截器是在kafka0.10版本被引入的,主要用于实现clients端的定制化控制逻辑
拦截器使得用户在消息发送前以及producer回调逻辑前有机会对消息做一些定制化需求,比如修改消息
指定多个拦截器时会形成一个拦截器链
原理
org.apache.kafka.clients.producer.ProducerInterceptor
类、接口
Kafka API
下载
上传压缩包
解压
kafka-manage.zkhosts=\
修改配置文件conf/application.conf
bin/kafka-manager
启动kafka-manager
登入hadoop102:9000页面查看详细信息
Kafka Manager
官网
Kafka Monitor
Kafka监控
参考
Flume对接Kafka
Kafka中的ISR、OSR、AR分别代表什么?
Kafka中的HW、LEO分别代表什么?
Kafka中是怎么体现消息顺序性的?
Kafka中的分区器、序列化器、拦截器是否了解?它们之间的顺序是什么?
Kafka生产者客户端的整体结构是什么样子的?使用几个现成处理?分别是什么?
“消费组中的消费者个数如果超过topic的分区,那么就会有消费者消费不到数据”这句话是否正确?
消费者提交消费位移时提交的是当前消费到的最新消息的offset还是offset+1?
有哪些情形会造成重复消费?
有哪些情景会造成消息漏消费?
当你使用kafka-topics.sh 创建一个topic之后,Kafka背后会执行什么逻辑?
topic的分区数可不可以增加?如果可以,怎么增加?如果不可以,那又是为什么?
topic的分区数可不可以减少?如果可以,怎么减少?如果不可以,那又是为什么?
Kafka有内部的topic吗?如果有是什么?有什么用?
Kafka分区分配的概念?
简述kakfa的日志目录结构?
如果我指定一个offset,Kafka Controller怎么查找对应的消息?
聊一聊kafka Controller的作用?
Kafka中哪些地方需要选举?这些地方的选举策略又是哪些?
失效副本是这什么?有哪些应对措施?
kafka的那些设计让它如此高的性能?
Kafka面试题
Kafka
由Facebook开源用于解决海量结构化日志的数据统计
基于Hadoop的一个数据仓库工具,可将结构化的数据文件映射为一张表,并提供类SQL查询功能
Hive处理的数据存储在HDFS
Hive分析数据底层的实现是MapReduce
执行程序运行在Yarn上
本质是:将HSQL转化成MapReduce程序
什么是 Hive
操作接口采用类SQL语法,提供快速开发的能力
避免了去写MapReduce,减少开发人员的学习成本
Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合
Hive的优势在于处理大数据,对于处理小数据没有优势,因此Hive的执行延迟比较高
Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数
迭代式算法无法表达
数据挖掘方面不擅长
Hive的HQL表达能力有限
Hive自动生成的MapReduce作业,通常情况下不够智能化
Hive调优比较困难,粒度较粗
Hive的效率比较低
Hive的优缺点
元数据包括:表名、表所属的数据库(默认default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录
derby只能打开一个连接
默认存储在自带的derby数据库,推荐使用MySQL存储Metastore
meta store
使用HDFS进行存储,使用MapReduce进行计算
hadoop
将SQL字符串转换成抽象语法树AST,这一步一般都是用第三方工具库完成,比如antlr;
对AST进行语法分析,比如表是否存在,字段是否存在,SQL语义是否有误
解析器
将AST编译成逻辑执行计划
编译器
对逻辑执行计划进行优化
优化器
把逻辑执行计划转换成可以运行的物理计划。对Hive来说,就是MR/Spark
执行器
Hive通过给用户提供的一系列交互接口,接收到用户的指令,使用自己的Driver,结合元数据,将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行返回的记过输出到用户交互接口
Hive架构原理
HSQL
SQL
查询语句
hive是建立在Hadoop之上的,所有的Hive的数据都是存储在HDFS中的。
数据库则可以将数据保存在块设备或者本地文件系统中
数据存储位置
Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此Hive中不建议对数据的改写,所有的数据都是在加载的时候确定好的。
数据库中的数据通常是需要经常进行修改的,因此可以使用INSERT INTO ...VALUES添加数据,使用UPDATE...SET修改数据
数据更新
Hive在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些key建立索引。
Hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。
由于MapReduce的引入,Hive可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive仍然可以体现出优势
由于数据的访问延迟较高,决定了Hive不适合在线数据查询
Hive
通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟
数据库
索引
Hive中大多数查询的执行是通过Hadoop提供的MapReduce来实现的
数据库通常有自己的执行引擎
执行
Hive查询时,由于没有索引,需要扫描整个表,延迟较高,另一个导致Hive执行延迟高的因素是MapReduce框架
当数据规模较小时,数据库的延迟较低
执行延迟
Hive的可扩展性和Hadoop的可扩展性是一致的,世界最大的hadoop集群在Yahoo!
数据库由于ACID语义的严格限制,扩展性非常有限
可扩展性
Hive可以支持很大规模的数据
数据库可以支持的数据规模较小
数据规模
Hive和数据库的比较
文档地址
下载地址
github地址
地址
上传tar包到hadoop102
mv hive-env.sh.template hive-env.sh
创建hive-env.sh文件
export HADOOP_HOME=/opt/module/hadoop
Hadoop路径
export HIVE_CONF_DIR=/opt/module/hive/conf
Hive配置路径
配置hive-env.sh
Hive安装配置
启动hdfs、yarn
bin/hadoop fs -mkdir /tmp
bin/hadoop fs -mkdir -p /user/hive/warehouse
bin/hadoop fs -chmod g+w /tmp
bin/hadoop fs -chmod g+w /user/hive/warehouse
在HDFS上创建/tmp和/user/hive/warehouse目录并修改它们的同组权限可写
Hadoop集群配置
bin/hive
启动hive
show databases
查看数据库
use default
使用默认数据库
show tables
显示数据库中的表
创建一张表
desc student
查看表的结构
向表中插入数据
select * from student
查询表中数据
退出hive
Hive基本操作
mkdir datas
在/opt/module/目录下创建datas
touch student.txt
vim student.txt
在/opt/module/datas目录下创建student.txt文件并添加数据
显示数据库
显示默认数据库中的表
删除已创建的student表
创建student表,并声明文件分隔符'\\t'
加载/opt/module/datas/student.txt文件到student数据库表中
查询结果
hive实际操作
再打开一个客户端窗口启动hive,会产生java.sql.SQLException异常
遇到的问题
将本地文件导入Hive案例
拷贝mysql java驱动到hive/lib目录
驱动拷贝
在/opt/module/hive/conf目录下创建一个hive-site.xml
根据官方文档配置参数,拷贝数据到hive-site.xml文件中
配置完毕后,如果启动hive异常,可以重新启动虚拟机
配置metastore到mysql
先启动MySQL
再次打开多个窗口,分别启动hive
启动hive后,回到MySQL窗口查看数据库,显示增加了metastore数据库
多窗口启动hive测试
Hive元数据配置到MySQL
启动hiveserver2
启动beeline
连接hiveserver2
Hive JDBC访问
bin/hive -help
bin/hive -e
bin/hive -f
Hive常用交互命令
退出hive窗口
查看hdfs文件系统
查看本地文件系统
查看所有历史命令
Hive其他命令
Hive数据仓库位置配置
查询后信息显示配置
Hive运行后日志信息配置
参数配置方式
Hive常见属性配置
基本数据类型
集合数据类型
hive的原子数据类型可以进行隐式转换
类型转化
Hive数据类型
create database db_hive
create database if not exists db_hive
create database db_hive2 location '/db_hive2.db'
创建数据库
show databases like 'db_hive'
desc database db_hive
desc database extended db_hive
查看数据库详情
查询数据库
修改数据库的dbproperties设置键值对
修改数据库
drop database db_hive2
删除空数据库
drop database if exists db_hive2
带判断的删除数据库
drop database db_hive cascade
数据库不为空,用cascade强制删除
删除数据库
字段见识说明
建表语法
理论
普通创建表
根据查询结果创建表(查询结果会添加到新表)
根据已经存在的表结构创建表
查询表的类型
管理表
表是外部表,hive并非认为其完全拥有这份数据。
删除该表不会删除掉这份数据,不过描述表的元数据信息会被删除掉。
每天将收集到的网站日志定期流入HDFS文本文件
在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过select+insert进入内部表
管理表和外部表使用场景
原始数据
建表语句
查看创建的表
向外部表中导入数据
查看表格式化数据
外部表
查询表类型
修改内部表为外部表
修改外部表为内部表
注意:('EXTERNAL'='TRUE')和('EXTERNAL'='FALSE')为固定写法,区分大小写!
管理表与外部表的互相转换
创建表
引入分区表
创建分区表
加载数据到分区表
单分区查询
多分区联合查询
查询分区表中的数据
添加单个分区
添加多个分区
增加分区
删除单个分区
删除多个分区
删除分区
查看分区表有多少分区
查看分区表结构
基本操作
创建二级分区表
加载数据到二级分区表中
查询分区数据
正常的加载数据
方式一:上传数据后修复
方式二:上传数据后添加分区
方式三:创建文件夹后load数据到分区
把数据直接上传到分区目录上,让分区表和数据产生关联的三种方式
注意事项
重命名表
增加、修改和删除表分区
增加/修改/替换列信息
修改表
删除表
分区表
DDL数据定义
向表中装载数据(Load)
通过查询语句向表中插入数据(Insert)
查询语句中创建表并加载数据
创建表时通过location指定加载数据路径
Import数据到指定Hive表中
数据导入
insert导出
hadoop命令导出到本地
hive shell命令导出
export导出到hdfs上
sqoop导出
数据导出
清除表中数据(truncate)
DML数据操作
表数据准备
全表查询
选择特定列查询
全表和特定列查询
列别名
算术运算符
求总行数:count
请工资的最大值:max
请工资的最小值:min
求工资的总和:sum
求工资的平均值:avg
常用函数
limit语句
基本查询
比较运算符
like和RLike
逻辑运算符
where语句
group by
having语句
分组
只支持等值连接,不支持非等值连接
等值join
好处
表的别名
内连接
左外连接
右外连接
满外连接
多表连接
笛卡尔积
连接谓词中不支持or
join语句
全局排序(order by)
按照别名排序
多个列排序
每个MapReduce内部排序(sort by)
分区排序(distribute by)
cluster by
排序
分桶表数据存储
分桶抽样查询
分桶及抽样查询
函数说明
查询
空字段赋值:NVL
case when
concat
concat_ws
collect_set
相关函数
创建txt文件
创建hive表并导入数据
按需求查询数据
行转列
lateral view
explode
说明
创建txt文件,写入数据
列转行
over
lag
lead
ntile
创建txt文件并写入数据
需求实现
窗口函数(开窗函数)
rank
dense_rank
row_number
函数
创建本地score.txt写入数据
其他常用查询函数
show funtions;
desc function upper;
详细
desc function extended upper;
系统内置函数
自定义函数
创建一个maven工程hive
添加依赖
创建一个类
打成jar包上传到服务器/opt/module/jars/
将jar包添加到hive的classpath
创建临时函数于开发好的java class关联
即可在hql中使用自定义的函数mylower
自定义UDF函数
资源准备
jar包安装
编译源码
hadoop源码编译支持snappy压缩
压缩参数配置
开启Map输出阶段压缩
开启Reduce输出阶段压缩
TEXTFILE
SEQUENCEFILE
ORC
PARQUET
文件存储格式
存储和压缩结合
压缩和存储
fetch抓取
表的优化
数据倾斜
并行执行
严格模式
JVM重用
推测执行
压缩
企业级调优
BigTable是一个分布式存储系统
利用谷歌提出的MapReduce分布式并行计算模型来处理海量数据
使用谷歌分布式文件系统GFS作为底层数据存储
采用Chubby提供协同服务管理
可以扩展到PB级别的数据和上千台及其,具备广泛应用性、可扩展性、高性能和高可用性等特点
谷歌的许多项目都存储在BigTable中,包括搜索、地图、财经、打印、社交网站Orkut、视频共享网站YouTube和博客网站Blogger等
从BigTable说起
关系型数据库已经流行很多年,并且Hadoop已经有了HDFS和MapReduce,为什么需要HBase?
HBase简介
数据类型
数据操作
存储模式
数据索引
数据维护
可伸缩性
区别
HBase与传统关系数据库的对比分析
Native Java API
HBase Shell
Thrift Gateway
REST Gateway
Pig
HBase访问接口
HBase是一个稀疏、多维度、排序的映射表,这张表的索引是行键、列族、列限定符和时间戳
每个值是一个未经解释的字符串,没有数据类型
用户在表中存储数据,每一行都有一个客排序的行键和任意多的列
表在水平方向由一个或多个列族组成,一个列族中可以包含任意多个列,同个列族里面的数据存储在一起
列族支持动态扩展,可以很轻松地添加一个列族或列,无需预先定义列的数量以及类型,所有的列均以字符串形式存储,用户需要自行进行数据类型转换
HBase中执行更新操作时,并不会删除数据旧的版本,而是生成一个新的版本,旧有的版本仍然保留(这是和HDFS只允许追加不允许修改的特性相关的)
数据模型概述
HBase采用表来组织数据,表由行和列组成,列划分为若干列族
表
每个HBase表都由若干行组成,每个行由行键(row key)来标识
行
一个HBase表被分组成许多列族(column family)的集合,他是基本的访问控制单元
列族
列族里的数据通过列限定符(或列)来定位
列限定符
在HBase表中,通过行、列族和列限定符确定一个单元格(cell),单元格中存储的数据没有数据类型,总被视为字节数组byte[]
单元格
每个单元格都保存着同一份数据的多个版本,这些版本采用时间戳进行索引
时间戳
示例
数据模型相关概念
HBase中需要根据行键、列族、列限定符和时间戳来确定一个单元格,因此可以视为一个“四维坐标”,即[行键,列族,列限定符,时间戳]
数据坐标
概念视图
物理视图
把一条记录存储在相邻的位置上
行式存储
把一行数据按列拆分,列单独存储
列式存储
面向列的存储
HBase数据模型
库函数
一个Master主服务器
许多个Region服务器
三个主要功能组件
主服务器负责管理和维护HBase表的分区信息,维护Region服务器列表,分配Region,负载均衡
Region服务器负责存储和维护分配给自己的Region,来处理来自客户端的读写请求
客户端并不是直接从Master主服务器上读取数据,而是在获得Region的存储位置信息后,直接从Region服务器上读取数据
客户端并不依赖Master,而是通过Zookeeper来获得Region位置信息,大多数客户端甚至从来不和Master通信,这种设计方式使得Master负载很小
HBase功能组件
开始只有一个Region,后来不断分裂
Region拆分操作非常快,接近瞬间,因为拆分之后的Region读取的仍然是原存储文件,直到“合并”过程把存储文件异步地写到独立的文件之后,才会读取新文件
每个Region的最佳大小取决于单台服务器的有效处理能力
目前每个Region最佳大小建议1GB-2GB(2013年以后的硬件配置)
每个Region默认大小是100MB到200MB(2006年以后的硬件配置)
同一个Region不会被分拆到多个Region服务器
每个Region服务器存储10-1000个Region
表和Region
元数据表,又名.META表,存储了Region和Region服务器的映射关系
当HBase表很大时,.META.表也会被分裂成多个Region
根数据表,又名-ROOT-表,记录所有元数据的具体位置
-ROOT-表只有唯一一个Region,名字是在程序中被写死的
Zookeeper文件记录了-ROOT-表的位置
Region的定位
HBase的实现原理
架构图
zookeeper服务器
Master
Region服务器
HBase系统架构
Region服务器向HDFS文件系统中读写数据
用户读写数据过程
缓存刷新
StoreFile的合并
Region服务器工作原理
Store是Region服务器的核心
单个StoreFile合并成一个
单个StoreFile过大时,又触法分裂操作,一个父Region被分裂成两个子Region
StoreFIle的合并会和分裂过程
Store工作原理
分布式环境必须考虑系统出错。HBase采用HLog保证系统恢复
HBase系统为每个Region服务器配置了一个HLog,它是一种预写式日志(Write Ahead Log)
用户更新数据必须首先写入日志后,才能写入MemStore缓存,并且,直到MemStore缓存内容对应的日志已经写入磁盘,该缓存内容才能被刷写到磁盘
Zookeeper会实时检测每个Region服务器的状态,当某个Region服务器发生故障时,Zookeeper会通知Master
Master首先会处理该故障Region服务器上面遗留的HLog文件,这个遗留的HLog文件中包含了来自多个Region对象的日志记录
系统会根据每条日志记录所属的Region对象对HLog数据进行拆分,分别放到相应Region对象的目录下,然后再将失效的Region重新分配到可用的Region服务器中,并把与该Region对象相关的HLog日志记录也发送给相应的Region服务器
Region服务器领取到分配给自己的Region对象以及与之相关的HLog日志记录以后,会重新做一遍日志记录中的各种操作,把日志记录中的数据写入到MemStore缓存中,然后,刷新到磁盘的StoreFile文件中,完成数据恢复
共同日志优点:提高对表的写操作性能了;缺点:恢复时需要分拆日志
HLog工作原理
HBase运行机制
行键
InMemory
Max Version
Time To Live
HBase实际应用中的性能优化方法
Master-status(自带)
Ganglia
OpenTDDB
Ambari
HBase性能监控
HIve整合HBase
Phoenix
方案
在HBase之上构SQL引擎
HBase只有一个针对行键的索引
通过单个行键访问
通过一个行键的区间来访问
全表扫描
访问HBase表中的行,只有三种方式
endpoint
observer
提供两个实现
observer允许我们在记录put前后做一些处理,因此,而我们可以在插入数据时同步写入索引表
非侵入性
每插入一条数据需要向索引表插入数据,即耗时是双倍,对HBase的集群的压力也是双倍
Coprocessor构建二级索引
Hindex二级索引
HBase+Redis
HBase+solr
使用其他产品为HBase行键提供索引功能
构建HBase二级索引
HBase应用方案
版本兼容
HBase-1.5.x
HBase-2.2.x
hadoop-2.9.2
版本选择
清华大学mirror
下载安装包hbase-2.2.5-bin.tar.gz
解压安装包hbase-2.2.5-bin.tar.gz至/usr/local
配置系统环境,将hbase下的bin目录添加到系统path中
HBase安装
JDK
单机模式不需要,伪分布式和分布式需要
SSH
先决条件
启动Hadoop->启动HBase
关闭HBase->关闭Hadoop
启动关闭Hadoop和HBase的顺序
由HBase自己管理Zookeeper
true
启动独立的Zookeeper
false
取值
单机版HBase 使用自带Zookeeper;集群版安装HBase则采用单独Zookeeper集群
建议
HBASE_MANAGES_ZK
HBase配置
HBASE_MANAGES_ZK=true
conf/hbase-env.sh
hbase.rootdir=file:///opt/module/hbase-2.2.5/hbase-tmp
conf/hbase-site.xml
bin/start-hbase.sh
http://192.168.99.100:16010/
web-ui
单机模式
需要运行hadoop
前提
hbase.cluster.distributed=true
hbase.rootdir=hdfs://hadoop100:9000/hbase
hbase.tmp.dir
hbase.unsafe.stream.capability.enforce
删除配置
./bin/hadoop fs -ls /hbase
在HDFS中检查HBase目录
SSH免密登入
RegionServer
hadoop100
Master(backup)
hadoop101
删除localhost
vim conf/regionservers
配置regionservers
配置master备份
hbase.zookeeper.property.dataDir=/opt/module/zookeeper
vim conf/hbase-site.xml
配置zookeeper
分发
确保任何节点为启动HBase
确保启动zookeeper,hadoop
在hadoop100上启动集群
验证进程是否启动
http://hadoop100:16010
master
http://hadoop101:16010
第二master
Web UI
运行模式
HBase的安装与配置
bin/hbase shell
进入HBase shell
create : 创建表
list:列出HBase中的所有的表信息
disable 'tempTable'
enable/disable:使表有效或无效
drop 'tempTable'
drop:删除表
表操作
一次只能为一个表的一行数据中的一列添加一个数据
put:向表、行、列指定的单元格添加数据
添加
scan 'tempTable'
scan:浏览表的相关信息
从tempTable中,获取第r1行、第‘f1:c1'列的值
从tempTable中获取第r1行、第‘f1:c3'列的值
get:通过表名、行、列、时间戳、时间范围和版本号来获取相应的单元格的值
查看
deleteall
删除
创建表时指定版本数
插入数据后更新,使其长生历史版本数据
查询时,指定查询的历史版本数。默认会查询出最新的数据。(有效取值为1到5)
查询历史数据
exit
退出
HBase常用Shell命令
maven依赖
HBase常用Java API 及应用实例
HBase编程实践
Sqoop是一款开源的工具,主要用于Hadoop(Hive)与传统数据库(MySQL,PostgreSQL...)间进行数据的传递
可以将一个关系型数据库中的数据导进Hadoop的HDFS中
也可以将HDFS的数据导进到关系数据库中
简介
将导入或导出命令翻译成MapReduce程序来实现
在翻译出的MapReduce中主要对inputformat和outputformat进行定制
上传gz包,并解压到/opt/module
mv sqoop-env-template.sh sqoop-en.sh
创建sqoop-env.sh
修改sqoop-env.sh
cp mysql-connector-java***-bin.jar /opt/module/sqoop-***.bin_hadoop***/lib/
拷贝JDBC驱动
bin/sqoop help
验证Sqoop
测试是否能够成功连接数据库
全部导入
查询导入
导入指定列
使用Sqoop关键字筛选查询导入
RDBMS到HDFS
RDBMS到Hive
RDBMS到Hase
导入数据
Hive/HDFS到RDBMDS
导出数据
创建.opt文件
编写sqoop脚本
执行脚本
脚本打包
简单实用案例
一些常用命令及参数
Sqoop
什么是Spark
Spark SQL
Spark Streaming
Spark Mlib
Spark GraghX
Spark core
独立调度器
Mesos
Spark内置模块
快
易用
通用
兼容性
Spark特点
文档
spark-2.4.5-bin-without-hadoop.tgz
安装地址
spark-2.4.5-bin-without-hadoop 不配置hadoop目录的话会出现ClassNoFoundException
解压安装配置
bin/spark-submit
官方求pi案例
准备文件
spark shell application ui
启动spark-shell
wordcount案例
安装使用
Local模式
使用Spark自带的简单集群管理器
修改spark-env.sh
分发spark
注意
官方求PI案例
启动spark shell
spark-env.sh
xsync spark-env.sh
hadoop100启动全部节点
spark HA 集群访问
HA 配置
Standalone模式
使用YARN作为集群管理器
spark
同步分发
执行PI程序
安装配置
YARN模式
使用Mesos作为集群管理器
Mesos模式
Spark运行模式
spark-core
scala-maven-plugin
maven-assembly-plugin
插件
maven配置
WordCount
集群运行
本地调试
运行
基础
Spark 采用textFile()方法从文件系统中加载数据创建RDD
file://文件目录
本地文件系统的地址
hdfs://hostname:9000/...
分布式文件系统HDFS的地址
Amazon S3的地址
该方法把文件的URI作为参数,这个URI可以是
从文件系统中加载数据创建RDD
可以调用SparkContext的parallelize方法,在Driver中一个已经存在的集合上创建
通过并行集合创建RDD
RDD创建
filter
map
flatMap
groupByKey
reduceByKey
常用RDD转换操作API
转换操作
count
collect
first
take
reduce
foreach
常用RDD行动操作API
行动操作
惰性机制
RDD操作
可以通过持久化(缓存)机制避免这种重复计算的开销
可以使用persist()方法对一个RDD标记为持久化
之所以说“标记为持久化”,是因为出现persist()语句的地方,并不会马上计算生成RDD并把它持久化,而是要等到遇到第一个行动操作触发真正计算以后,才会把计算结果进行持久化
持久化后的RDD将会被保留在计算节点的内存中被后面的行动操作重复使用
MEMORY_ONLY
MEMORY_AND_DISK
持久化级别
persist
会调用persist(MEMORY_ONLY)
cache
unpersist
常用方法
持久化
增加并行度
减少通信开销
RDD分区的一个原则是使得分区的个数尽量等于集群中的CPU核心数目
spark.default.parallelism配置默认分区数
默认为本地机器的CPU数目,若设置了local[N],则默认为N
默认分区数为8
Apache Mesos
在集群中所有CPU核心数目总和和2二者中取较大值作为默认值
Standalone或YARN
原则
创建RDD时手动指定分区个数
使用repartition方法重新设置分区个数
设置分区的个数
HashPartitioner
RangePartitioner
spark自带的分区方法
继承org.apache.spark.Partitioner类
numPartitions:Int
getPartition(key:Any):Int
equals()
代码
实例
实现自定义分区类
自定义分区方法
从文件系统中读取文件,按\" \"拆分单词,并统计各单词的个数
运算步骤
集群中部署Hadoop和Spark
在集群中执行词频统计过程示意图
word count
一个综合实例
RDD编程基础
通过map函数
从文件中加载
并行集合创建
键值对RDD的创建
reduceByKey(func)
keys
values
sortByKey
mapValues
join
combineByKey
常用的键值对RDD转换操作
自己实现
参考实现
键值对RDD
SparkContext.textFile
读取
RDD.saveAsTextFile
写入
方法
本地文件系统的数据读写
分布式文件系统HDFS的数据读写
JSON文件的数据读写
数据涞源
文件数据读写
HBase概念及操作参见HBase结点
创建HBase表
配置Spark
编写程序读取HBases数据
编写程序向HBase写入数据
读写HBase数据
数据读写
求TOP值
求最大最小值
文件排序
二次排序
连接操作
综合案例
Spark编程基础
Spark Core
什么是Spark SQL
易整合
统一的数据访问方式
兼容Hive
标准的数据连接
Spark SQL的特点
什么是DataFrame
什么是DataSet
SparkSession新的起点
从Spark数据源进行创建
从RDD进行转换
从 HiveTable进行查询返回
创建
SQL风格语法(主要)
DSL风格语法(次要)
RDD转换为DataFrame
DataFrame转换为RDD
DataFrame
RDD转换为DataSet
DataSet转换为RDD
DataSet
DataFrame转DataSet
DataSet转DataFrame
DataFrame与DataSet的互操作
三者的共性
三者的区别
RDD、DataFrame、DataSet
IDE创建Spark SQL程序
用户自定义UDF函数
用户自定义聚合函数
用户自定义函数
Spark SQL编程
手动指定选项
通用加载/保存方法
通过SparkSession.read.json()去加载一个一个JSON文件
JSON文件
SparkSession.read.parquet()
Parquet文件
在启动spark shell时添加jdbc驱动
spark.read.jdbc
JDBC
Hive数据库
Spark SQL数据源
Spark SQL实战
尚硅谷
Spark Streaming是什么
容错
易整合到Spark体系
Spark Streaming特点
基于SparkContext的StreamContext
Spark Streaming架构
WordCount案例操作
DStream 入门
streamingConext.textFileStream(dataDirectory)
文件需要有相同的数据格式
文件进入dataDirectory的方式需要通过移动或者重命名来实现
一档文件移动进目录,则不能在修改,即便修改了也不会读取新数据
用法及说明
读取本地/HDFS文件系统
不能用来监听追加内容文件,如日志文件
小结
文件数据源
ssc.queueStream(queueOfRDDs)
RDD队列
spark-streaming-kafka-0-10_2.12
Kafka数据源
自定义数据源
DStream 创建
map(func)
flatMap(func)
filter(func)
repartition(numPartitions)
reduce(func)
count()
union(otherStream)
countByValue()
transform(func)
无状态转换操作
滑动窗口转换操作
需要跨批次之间维护状态使,就必须使用updateStateByKey操作
跨批次词频统计实例
updateStateByKey操作
有状态转换操作
DStream 转换
输出的是目录
DStream.saveAsTextFiles(\"\")
把DStream输出到文本文件中
DStream.foreachRDD()
JDBC操作
把DStream写入到MySQL数据库中
DStream 输出
DStream 编程进阶
spark 2.0之前,使用Spark Streaming,基于RDD的数据抽象
spark 2.0之后,新增了Structured Streaming,基于DataFrame的数据抽象,采用“微批次模式”
2.0中只是测试版本,2.2版本才正式发布
spark 2.3重磅发布,新版本Structured Streaming引入了持续流式处理模式,可将流处理延迟降低至毫秒级别,与Flink一较高下
Spark流计算组件的演进
把不断输入的流式数据加载为内存中一张没有边界的数据库表,每一条新来的数据都会作为一行数据新增到这张表中
每一条查询的操作都会产生一个结果集-Result Table。每一个出发间隔(比如说1秒),当新的数据新增到表中,都会最终更新Result Table
Structured Streaming 的基本原理
重新抽象了流式计算
易于实现数据的exactly-once。2.0之前的Spark Streaming只能做到at-least once,框架层次很难帮你做到exactly-once。现在通过重新设计流式计算框架,使得实现exactly-once变得容易了。
为什么设计Structured Streaming
Structured Streaming
Spark
Shell脚本程序
Java程序
MapReduce程序
Hive脚本
一个完整的数据分析系统通常都是由大量任务单元组成
各任务单元之间存在时间先后及前后依赖关系
为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行
案例
为什么需要工作流调度系统
任务存在依赖关系
类似一个有向无环图
什么是Azkaban
兼容任何版本的 hadoop
易于使用的 Web 用户界面
简单的工作流的上传
方便设置任务之间的关系
调度工作流
模块化和可插拔的插件机制
认证/授权(权限的工作)
能够杀死并重新启动工作流
有关失败和成功的电子邮件提醒
简单的任务调度:直接使用 crontab 实现;
复杂的任务调度:开发调度平台或使用现成的开源调度系统,比如 ooize、azkaban 等
常见工作流调度系统
ooize 和 azkaban 特性对比
azkaban web server
azkaban executor server
mysql
azkaban的架构
存在一个问题内存3G限制,没有3G不执行job
3.90.0
通过配置可忽律内存限制
3.81.0
下载源码
编辑build.gradle
配置阿里云私服仓库
执行完后会生成build/install目录
./gradlew installDist
azkaban-web-server
azkaban-exec-server
azkaban-db
使用模块
在MySQL中创建相关的数据库、表
修改时区
修改mysql配置
azkaban.properties
azkaban-exec-server
HTTPS(可选)
azkaban.properties
添加用户
azkaban-users.xml
bin/start-exec.sh
激活executor
启动azkaban-exec-server
启动服务
启动azkaban-web-server
http://hadoop100:8081/
账号:admin admin,azkaban-users.xml中配置的
HTTP
HTTPS
管理界面
解决方法
源码安装、配置、启动、管理
文件内容是固定的
.project文件
command
java
javaprocess
hadoopJava
pig
flow
Job类型:type取值
嵌套流程
Job配置
Job依赖
Flow配置
文件内容
.flow文件
将.project文件和 .flow文件打包到同一个zip包中
zip包
通过Web UI 上传zip并创建工作流
创建工作流
单一job案例
多job工作流
Java操作任务
HDFS操作任务
MapReduce任务
Hive脚本任务
Spark脚本任务
Python脚本任务
实战及源码
Azkaban
https://github.com/jast90/shells/blob/master/cdh-install.md
脚本化安装
CDH6
CDH5
cloudera manager 5.16.2
parcel 5.16.2
20G
磁盘
4G
内存
2.4及以上版本,3.0不支持
Python
Perl
python-psycopg2 package
iproute package
资源要求
3台2核CPU 16G CentOS 6
编写脚本下载需要的安装包
chkconfig iptables off
查看防火墙
service iptables stop
关闭防火墙
setenforce 0
vim /etc/selinux/config
禁用selinux
vim /etc/ssh/sshd_config
配置SSH
sudo passwd
修改root密码
init 6
重启
GCP虚拟机设置
GCP:Google 云平台
MySQL
软件要求
集群监控数据库amon
hive数据库hive
解压cloudera-manager到/opt
参考agent中的config.ini
拷贝mysql驱动包到/usr/share/java中
所有结点创建用户
在mysql中创建cm库
修改config.ini文件
分发cm
拷贝下载文件
分发cloudera
CM安装
hadoop001
服务结点
hadoop002
hadoop003
工作结点
查看端口
http://hadoop001:7180
关闭
启动与关闭服务结点和agent结点
卸载自带的mysql
解压zip包
进入mysql-libs目录
安装包准备
mysql 安装包下载脚本
安装mysql服务器
查看产生的随机密码
查看mysql状态
启动mysql
安装MySQL服务器
安装mysql客户端
连接mysql
修改密码
退出mysql客户端
安装MySQL客户端
MySQL中的user表中主机配置
mysql_secure_installation
MySQL安装
https://cdn.mysql.com/archives/mysql-8.1/mysql-8.1.0-1.el9.x86_64.rpm-bundle.tar
tar -xvf mysql-8.1.0-1.el9.x86_64.rpm-bundle.tar
mysql 8
https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar
mysql-community-client-5.7.44-1.el7.x86_64.rpm
mysql-community-common-5.7.44-1.el7.x86_64.rpm
mysql-community-devel-5.7.44-1.el7.x86_64.rpm
mysql-community-embedded-5.7.44-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.44-1.el7.x86_64.rpm
mysql-community-embedded-devel-5.7.44-1.el7.x86_64.rpm
mysql-community-libs-5.7.44-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.44-1.el7.x86_64.rpm
mysql-community-server-5.7.44-1.el7.x86_64.rpm
mysql-community-test-5.7.44-1.el7.x86_64.rpm
文件
tar -xvf mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar -C /opt/software
rpm -ivh mysql-community-common-5.7.44-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.44-1.el7.x86_64.rp
rpm -ivh mysql-community-client-5.7.44-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.44-1.el7.x86_64.rpm
mysql --version
查看版本
错误日志文件
/var/log/mysqld.log
mysql 配置文件
/etc/my.cnf
数据目录
/var/lib/mysql
文件及目录
systemctl start|status|restart|stop mysqld.service
启动MySQL
grep 'temporary password' /var/log/mysqld.log
查看初始密码
mysql -uroot -p
初始密码登入
set global validate_password_policy=0
设置全局密码验证策略
set global validate_password_length=1
设置全局密码验证长度
alter user 'root'@'localhost' identified by '123456';
修改初始密码
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;flush privileges;
授权其他机器远程登入
[mysqld] 下添加 character_set_server=utf8
vim /etc/my.cnf
设置MySQL的字符集为utf-8
firewall-cmd --statefirewall-cmd --zone=public --add-port=3306/tcp --permanentfirewall-cmd --reload
防火墙开放3306端口
mysql 5.7.44安装使用
https://cloud.tencent.com/developer/article/1886339
mysql 5.7.44
创建索引
读锁/共享锁
写锁/排他锁
对数据操作类型划分
lock tables user read
lock tables user write
unlock tables
表级别的S锁、X锁
select column from table ... lock in share mode
select column from table ... for update
意向锁
自增锁
begin; select * from user;
一个session查询表
begin;alter table user add column last_name varchar(100);
会阻塞
一个session 添加列
begin;select * from user;
读锁会阻塞写锁,继续执行读锁此读锁也阻塞
show processlist
元数据锁:MDL
表级锁
begin;update user set first_name='张三1' where id=1
一个session更新记录
beginselect * from user where id = 1 lock in share mode;
阻塞
一个session加锁查询记录
begin;update user set first_name=\"张三3\" where id=1;
一个session更新相同记录
记录锁:record locks
仅仅是为了防止插入幻影记录而提出的
begin;select * from user where id=6 lock in share mode;
间隙5到9
一个session对一个间隙内不存在的记录加锁读
一个session添加间隙内的新纪录
间隙锁:Gap Locks
本质就是一个记录锁和一个gap锁的合体
临键锁:Next-key Locks
插入意向锁:insert intention locks
行级锁
页级锁
锁粒度角度划分
悲观锁
乐观锁
对待锁的态度
隐式锁
显示锁
枷锁方式
全局锁
死锁
其他
锁
id
SIMPLE
PRIMARY
UNION
DEPENDENT UNION
UNION RESULT
SUBQUERY
DEPENDENT SUBQUERY
DERIVED
MATERIALIZED
UNCACHEABLE SUBQUERY
UNCACHEABLE UNION
select_type:查询类型
table
system
const
eq_ref
ref
fulltext
ref_or_null
index_merge
unique_subquery
index_subquery
range
index
ALL
type:连接类型
possible_keys
key_len
rows
Extra
explain
rpm -qa|grep java
rpm -e *java*
linux 自带jdk卸载
wget https://github.com/frekele/oracle-java/releases/download/8u212-b10/jdk-8u212-linux-x64.tar.gz
下载jdk
tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/software
解压tar
export JAVA_HOME=/opt/module/jdk1.8.0_212
配置JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin
配置PATH
vim /etc/profile.d/jdk.sh 文件内容
添加环境变量
生效配置
jdk
最初表示“反SQL”运动用新型的非关系数据库取代关系数据库,现在表示关系和非关系型数据库各有优缺点彼此都无法相互取代
灵活的可扩展性
灵活的数据模型
与云计算紧密融合
Google
Facebook
Mozilla
Adobe
Foursquare
LinkedIn
Digg
McGraw-Hill Education
Vermont public Radio
百度、腾讯、阿里、新浪、华为......
使用NoSQL数据库的公司
NoSQL简介
无法满足海量数据库的管理需求
无法满足数据库高并发的需求
无法满足高可扩展性和高可用性的需求
主要表现在一下几个方面
复杂性
数据库复制
扩容问题
动态数据迁移问题
MySQL集群是否可以完全解决问题?
关系数据库已经无法满足Web2.0的需求。
关系模型作为统一的数据模型既被用于数据分析,也被用于在线业务。但这两者一个强调高吞吐,一个强调低延时,已经演化出完全不同的架构。用同一套模型来抽象显然是不合适的
Hadoop就是针对数据分析
MongoDB、Redis等是针对在线业务,两者都抛弃了关系模型
“One size fits all”模式很难适用于截然不同的业务场景
Web2.0网站系统通常不要求严格的数据库事务
Web2.0并不要求严格的读写实时性
Web2.0通常不包含大量复杂的SQL查询(去结构化,存储空间换取更好的查询性能)
关系数据库的关键特性包括完善的事务机制和高效的查询机制。但是,关系数据库引以为傲的两个关键特性,到了Web2.0时代却成了鸡肋,主要表现在以下几个方面:
兴起原因
以完善的关系代数理论作为基础,有严格的标准,支持事务ACID四性,借助索引机制可以实现高效的查询,技术成熟,有专业公司的技术支持
优势
可扩展性较差,无法较好支持海量数据存储,数据模型过于死板,无法较好支持Web2.0应用,事务机制影响了系统的整体性能等
劣势
关系数据库
可以支持超大规模数据存储,灵活的数据模型可以很好地支持Web2.0应用,具有强大的横向扩展能力等
缺乏数学理论基础,复杂查询性能不高,大都不能实现事务强一致性,很难实现数据完整性,技术尚不成熟,缺乏专业团队的技术支持,维护较困难
NoSQL数据库
电信、银行等领域的关键业务系统,需要保证强事务一致性
关系数据库应用场景
互联网企业,传统企业的非关键业务(比如数据分析)
NoSQL数据库应用场景
关系数据库和NoSQL数据库各有优缺点,彼此无法取代
案例:亚马逊公司使用不同类型的数据库来支撑它的电子商务应用
对于购物篮这种临时性数据,采用键值对存储会更加高效
当前的产品和订单信息则适合存放在关系数据库中
大量的历史订单信息则适合保存在类似MongoDB的文档数据库中
采用混合架构
总结
NoSQL与关系数据库的比较
Redis
Riak
SimpleDB
Chordless
Scalaris
Memcached
相关产品
键值对
键是一个字符串对象
值可以是任意类型的数据,比如整型、字符型、数组、列表、集合等
数据模型
涉及频繁读写、拥有简单数据模型的应用
内容缓存,比如会话、配置文件、参数、购物车等
存储配置和用户数据信息的移动应用
典型应用
扩展性好,灵活性好,大量写操作时性能高
无法存储结构化信息,条件查询效率较低
不是通过键而是通过值来查:键值数据库根本没有通过键值查询的途径
需要存储数据之间的关系:在键值数据库中,不能通过两个或两个以上的键来关联数据
需要事务的支持:在一些键值数据库中,产生故障时,不可以回滚
不适用情形
百度云数据库(Redis)
Github(Riak)
BestBuy(Riak)
Twitter(Redis和Memcached)
StackOverflow(Redis)
Instagram(Redis)
Youtube(Memcached)
Wikipedia(Memcached)
使用者
键值数据库
BigTable
Cassandra
HadoopDB
GreenPlum
PNUTS
分布式数存储与管理
数据在地理上分布于多个数据中心的应用程序
可以容忍副本中存在短期不一致情况的应用程序
拥有动态字段的应用程序
拥有潜在大量数据的应用程序,大到几百TB的数据
查找速度快,可扩展性强,容易进行分布式扩展,复杂性低
功能较少,大都不支持强事务一致性
需要ACID事务支持的情形,Cassandra等产品就不适用
Ebay(Cassandra)、Instagram(Cassandra)、NASA(Cassandra)、Twitter(Cassandra and HBase)、Facebook(HBase)、Yahoo!(HBase)
列族数据库
MongoDB、CouchDB、Terrastore、ThruDB、RavenDB、SisoDB、RaptorDB、CloudKit、Perservere、Jackrabbit
键/值值(value)是版本化的文档
存储、索引并管理面向文档的数据或者类似的半结构化数据比如,用于后台具有大量读写操作的网站、使用JSON数据结构的应用、使用嵌套结构等非规范化数据的应用程序
性能好(高并发),灵活性高,复杂性低,数据结构灵活提供嵌入式文档功能,将经常查询的数据存储在同一个文档中既可以根据键来构建索引,也可以根据内容构建索引
缺乏统一的查询语法
在不同的文档上添加事务。文档数据库并不支持文档间的事务,如果对这方面有需求则不应该选用这个解决方案
百度云数据库(MongoDB)、SAP (MongoDB)、Codecademy (MongoDB)、Foursquare (MongoDB)、NBC News (RavenDB)
文档数据库
Neo4J、OrientDB、InfoGrid、Infinite Graph、GraphDB
图结构
专门用于处理具有高度相互关联关系的数据,比较适合于社交网络、模式识别、依赖分析、推荐系统以及路径寻找等问题
灵活性高,支持复杂的图形算法,可用于构建复杂的关系图谱
复杂性高,只能支持一定的数据规模
Adobe(Neo4J)、Cisco(Neo4J)、T-Mobile(Neo4J)
图形数据库
MySQL产生年代较早,而且随着LAMP大潮得以成熟。尽管其没有什么大的改进,但是新兴的互联网使用的最多的数据库
MongoDB是个新生事物,提供更灵活的数据模型、异步提交、地理位置索引等五花十色的功能
Redis是键值存储的代表,功能最简单。提供随机数据存储。就像一根棒子一样,没有多余的构造。但是也正是因此,它的伸缩性特别好。就像悟空手里的金箍棒,大可捅破天,小能成缩成针
不同类型数据库比较分析
NoSQL的四大类型
C(Consistency):一致性
A(Availability):可用性
P(Tolerance of Network Partition):分区容忍性
CAP含义
RDBMS
CA
CouchDB
DynamoDB
AP
MongoDB
CP
一个分布式系统不可能同时满足一致性、可用性和分区容忍性这三个需求,最多只能同时满足其中两个,正所谓鱼和熊掌不可兼得
CAP理论告诉我们
多个库中同一记录值一致,且有多个进程操作该记录
初始状态
一个进程更新该记录的值为新的值,系统正确传播该记录新值到另外一个系统,另外一个进程读取到最新的记录值
正常执行
一个进程更新该记录的值为新的值,系统错误传播该记录新值到另外一个系统,另外一个进程读取到旧的记录值
跟新传播失败
一个牺牲一致性来换取可用性的实例
CAP
A(Atomicity):原子性,是指事务必须是原子工作单位,对于其数据修改,要么全部执行,要么全都不执行
C(Consistency):一致性,是指事务在完成时,必须使所有的数据都保持一致状态
I(Isolation):隔离性,是指由并发事务所做的修改必须与任何其他并发事务所做的修改隔离
D(Durability):持久性,是指事务完成之后,他对于系统的影响是永久性的,该修改即使出现致命的系统故障也将一直保持
一个数据库事务具有ACID四性
基本可用,是指一个分布式系统的一部分发生问题变得不可用时,其他部分仍然可以正常使用,也就是允许分区失败的情形出现
基本可用
软状态(soft-state)是与硬状态(hard-state)相对应的一种提法。数据库保存的数据是硬状态时,可以保证数据一致性,即保证数据一直是正确的。软状态是值状态可以有一段时间不同步,具有一定的滞后性
软状态
BASE的基本含义是基本可用(Basically Availble)、软状态(Soft-state)和最终一致性(Eventual consistency)
BASE
因果一致性
读己之所写一致性
单调读一致性
最终一致性根据更新数据后各进程访问的时间和方式的不同,又可以区分为:
会话一致性
单调写一致性
最终一致性根据更新数据后各进程访问到数据的时间和方式的不同,又可以区分为:
如何实现各类型的一致性?
最终一致性
NoSQL的三大基石
分析
事务
互联网
OldSQL
一种架构支持多类应用
NewSQL
NoSQL
多架构支持多类应用
大数据引发数据处理架构变革
关系数据库、NoSQL和NewSQL数据库产品分类图
从NoSQL到NewSQL数据库
MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统
在高负载的情况下,添加更多的节点,可以保证服务器性能
MangoDB旨在为WEB应用提供可扩展的高性能数据存储解决方案
MongoDB文档类似于JSON对象。字段值可以包含其他文档,数组及文档数组
MongoDB将数据存储为一个文档,数据结构由键值对组成
提供了一个面向文档存储,操作起来比较简单和容易
可以设置任何属性的索引来实现更快的排序
具有较好的水平扩展性
支持丰富的查询表达式,可轻松查询文档中内嵌的对象及数组
可以实现替换完成的文档或者一些指定的数据字段
MongDB中的Map/Reduce主要是用来对数据进行批量处理和聚合操作
MongDB安装简单
主要特点
一个mongodb中可以建立多个数据库
MongodDB的默认数据库为“db”,该数据库存储在data目录中
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中
文档是一个键值(key-value)对(即BSON)。MongoDB的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系数据库有很大的区别,也是MongoDB非常突出的特点
集合时MongoDB文档组,类似于RDBMS中的表格
集合存在于数据库中,集合没有固定的结构,这意味着你在集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性
集合
MongoDB数据类型
在MongoDB中基本的概念是文档、集合、数据库
概念解析
解压tgz到/usr/local
添加mongdb目录到PATH
下载安装
/data/db
目录
mongodb服务器
mongod
mongodb shell客户端
mongo
mongodb 分片
mongos
...
如果数据库不存在,则创建数据库,否则切换到指定数据库
创建数据库:use dbname
空数据库不显示
查看所有数据库:show dbs
删除当前数据库
删除数据库:db.dropDatabase
不需要创建集合。当你插入一些文档时,MongoDB会自动创建集合
options
查看集合:show collections或show tables
db.collection.drop()
删除集合
如果_id主键存在则更新数据,如果不存在就插入数据
新版本中已废弃,使用insertOne或replaceOne来代替
insert
若插入的数据主键已经存在,则会抛org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据
save
writeConcern:写入策略,默认为1,即要求确认写操作,0是不要求
ordered:指定是否按顺序写入,默认true,按顺序写入
参数
insertMany
插入文档
update的查询条件
类似sql update查询内where后面的
query
update
upsert:可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入
multi:可选,mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来的多条记录全部更新
writeConcern:可选,抛出异常的级别
文档数据
doc
{ writeConcern:doc}
更新文档
可选,删除文档的条件
可选,如果设置为true或1,则只删除一个文档,如果不设置该参数,或使用默认值为false,则删除所有匹配条件的文档
justOne
可选,抛出异常的级别
writeConcern
remove
删除文档
可选,使用查询炒作符指定查询条件
可选,使用投影操作符指定返回的键。查询时返回文档中所有键值,只需要省略该参数即可(默认省略)
projection
格式化的方式显示所有文档
pretty()
比较
find方法可以传入多个键,每个键以逗号隔开
语法
AND 条件
$or
OR 条件
查询文档
大于:$gt
小于:$lt
大于等于:$gte
小于等于:$lte
条件操作符
基于BSON类型来检索集合中匹配的数据类型,并返回结果
获取col集合中title为String的数据
$type操作符
可以接受一个数字参数,该参数指定从MongoDB中读取的记录数。
limit()方法
跳过指定数量的数据,接受一个数字参数作为跳过的记录条数
skip方法
可以实现分页
limit与skip
1:升序排列
-1:降序排列
{key:1/-1}
sort方法
Key值为要创建的索引字段,1为指定升序创建索引,-1为降序创建索引
createIndex/ensureIndex
aggregate()方法
统计用户数据
聚合
保证数据的安全性
数据高可用性
灾难恢复
无需停机维护
分布式读取数据
什么是复制?
mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。
一主一从
一主多从
mongodb各个节点常见的搭配方式为
主节点记录在其上的所有操作oplog,从节点定期轮巡主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致
客户端应用驱动,读写在主节点
主节点与从节点进行数据交互保障数据的一致性
复制结构图
N个节点的集群
任何节点可作为主节点
所有写入操作都在主节点上
自动故障转移
自动恢复
副本集特征
MongoDB复制原理
官方文档
子主题
MongoDB 副本集设置
复制
分片
备份与恢复
监控
shell 操作
https://www.runoob.com/mongodb/mongodb-tutorial.html
查询分析
高级索引
索引限制
全文检索
高级教程
文档数据库MongoDB
教程
lua脚本
事务 vs. lua脚本 vs. 管道
键值对数据库Redis
First in First out
FIFO
Least Recently Used
最近最少使用
最近最长时间未使用的,通过记录上次使用时间,按时间
LRU
Least Frequently Used
最近最不常用
最近使用次数最少,通过统计使用次数,按使用数
LFU
算法
免费开源、高性能、分布式内存对象缓存系统
特性
memcached
1k=1000 bytes
1kb=1024 bytes
k与kb的区别(1m与1mb依次类推)
大小写不敏感(不区分大小写)
单位
可以包含其他配置文件
include 其他配置文件全路径名
可以有多个
例如:include /path/to/local.conf
包含
启动时加载模块
如果服务不能加载模块他将终止
可以加载多个模块
模块
默认情况下,如果未指定“ bind”配置指令,则Redis侦听来自服务器上所有可用网络接口的连接。可以使用“ bind”配置指令仅侦听一个或多个所选接口,然后侦听一个或多个IP地址。
控制哪些机器可以连接上redis服务器
默认配置:bind 127.0.0.1
bind配置
默认配置:protected-mode yes
保护模式
redis服务器的端口
默认配置:port 6379
port配置
在每秒请求数很高的环境中,您需要大量积压,以避免客户端连接速度慢的问题。 请注意,Linux内核会以无提示的方式将其截断为/proc/sys/net/core/somaxconn的值,因此请确保同时提高somaxconn和tcp_max_syn_backlog的值,以获得所需的效果。
默认值:tcp-backlog 511
tcp监听backlog
无默认值
Unix socket
默认值:timeout 0,表示不关闭闲置客户端
闲置客户端关闭时间
用于发送ACKs的时间间隔
300秒
默认配置:tcp-keepalive 300
TCP保活
网络
默认配置:daemonize no
如果设置为守护线程,即:daemonize yes,redis将pid写入到/var/run/redis.pid文件
守护线程
无监督
默认配置:supervised no
监督
指定了pid文件,启动时写到指定的文件,退出时删除
默认配置:pidfile /var/run/redis_6379.pid
pid文件指定
默认配置:loglevel notice
日志级别
默认配置:logfile \"\"
日志文件名
默认配置:syslog-enabled no
是否启用系统日志
默认配置:syslog-ident redis
系统日志标志
默认配置:syslog-facility local0
指定系统日志设施
默认配置:databases 16
数据库数量
默认配置:always-show-logo yes
总是显示logo
快照
安全
内存管理
惰性释放
追加模式
LUA脚本
Redis集群
集群docker/NAT支持
慢查询日志
延迟监视器
事件通知
高级配置
主动碎片整理
配置文件详情
纯内存操作
单线程操作,避免了频繁的上下文切换
采用了非阻塞I/O多路复用机制
单线程redis为什么这么块?
保存策略
属性配置
两次保存的时间间隔内,服务器宕机,或者发生断电问题
数据丢失的情况
触发
RDB
appendfsync always
默认的
appendfsync everysec
appendfsync no
如果AOF文件中出现了残余命令,会导致服务器无法启动。此时需要借助redis-check-aof工具来修复,命令:redis-check-aof --fix 文件
文件的修复
备份机制更稳健,丢失数据概率更低
可读的日志文本,通过操作AOF稳健,可以处理误操作【redis-check-aof 文件】
比起RDB占用更多的磁盘空间
恢复备份速度要慢
每次读写都同步的话,有一定的性能压力
存在个别bug,造成恢复不能
AOF
如何选择持久化配置?
redis 配置文件
原则:配从不配主
配置:在从服务器上执行SLAVEOF ip:port命令
查看:执行 info replication命令
从机会同步主机上的所有数据
从机只会读,不能写入
Error reply to PING from master:
Error condition on socket for SYNC: Connection refused
临时建立
在从机配置文件中,编写slaveof属性配置
永久建立
slaveof no one
恢复身份
建立
从机是从头开始复制主机的信息,还是只复制切入以后的信息?
从机是否可以写?
主机shutdown后,从机是上位还是原地待命?
主机又回来后,主机新增记录,从机还能否顺利复制?
从机宕机后,重启,宕机期间主机的新增记录,从机是否会顺利复制?
其中一台从机down后重启,能否重认旧主?
如果两台从机都从主机同步数据,此时主机的IO压力会增大,如何解决?
常见问题
只能在主服务器上进行写操作,主服务宕机后,写操作不可用
主从复制
sentinel.conf文件
./redis-sentinel sentinel.conf
启动哨兵
新主登基
群仆俯首
旧主俯首
主机宕机后
哨兵模式
通过发送握手和响应握手建立连接
节点A会为节点B创建一个clusterNode结构,并将结构添加到自己的clusterState.nodes字典里面
节点A将根据cluster meet命令给定的IP地址和端口号,向节点B发送一条meet消息
如果一切顺利,节点B将接收到节点A发送的meet消息,节点B会为节点A创建一个clusterNode结构,并将该结构添加到自己的clusterState.nodes字典里面
之后,节点B将向节点A返回一条PONG消息
如果一切顺利,节点A将接收到节点B返回的PONG消息,通过这条PONG消息节点A可以直到节点B成功地接收到了自己发送的meet消息
之后,节点A将向节点B返回一条PINg消息
如果一切顺利,节点B将接收到节点A返回的PING消息,通过这条PING消息节点B可以直到节点A已经成功地接收到自己返回的PONG消息,握手成功。
实现
节点A会将节点B的信息通过Gossip协议传播给集群中的其他节点,让其他节点业余节点B进行握手,最终,经过一段时间之后,节点B会被集群中的所有节点认识。
Gossip协议
cluster meet ip port:连接节点
cluster nodes:查看集群节点
启动节点
节点
槽slot
上线状态:ok
下线状态:fail
集群状态
cluster info:集群信息
cluster addslots <slot> [slot ...]
槽指派
接收命令的节点会计算出命令要处理的数据库键属于哪个槽,并检查这个槽是否指派给了自己
如果键所在的槽正好就指派给了当前节点,那么节点直接执行这个命令
如果键所在的槽并没有指派给当前节点,那么节点会向客户端返回一个moved错误,指引客户端转向至正确的节点,并再次发送之前想要执行的命令
执行流程
CRC16(key)语句用于计算键key的CRC-16校验和
&16383语句则用于计算出一个介于0至16383之间的整数作为键key的槽
CRC16(key) & 16383
可以查看一个给定键属于哪个槽
cluster keyslot <key>
计算键属于哪个槽
如果clusterState.slots[i]等于clusterState.myself,那么说明槽i由当前节点负责,节点可以执行客户端发送的命令
如果clusterState.slot[i]不等于clusterState.myself,那么说明槽i并非由当前节点负责,节点会根据clusterState.slots[i]指向的clusterNode结构所记录的节点IP和端口号,向客户端返回MOVED错误,指引客户端转向至正在处理槽i的节点
当节点计算出键所属的槽i之后,节点就会检查自己在clusterState.slots数组中的项i,判断键所在的槽是否由自己负责
判断槽是否由当前节点负责处理
当节点发现键所在的槽并非由自己负责处理的时候,节点就会向客户端返回一个moved错误,指引客户端转向至正在负责槽的节点
格式:moved <slot> <ip>:<port>
当客户端接收到节点返回的moved错误时,客户端会根据moved错误中提供的ip地址和端口号,转向至负责处理槽slot的节点,并向该节点重新发送之前想要执行的命令。
一个集群客户端通常会与集群中的多个节点创建套接字连接,而所谓的节点转向实际上就是换一个套接字来发送命令。
如果客户端尚未与想要转向的节点创建套接字连接,那么客户端会先根据moved错误提供的ip地址和端口号来连接节点,然后再进行转向。
集群模式的redis-cli客户端在接收到moved错误时,并不会打印出moved错误,而是根据moved错误自动进行节点转向,并打印出信息,所以我们是看不见节点返回的moved错误的
单机模式的redis-cli客户端执行相同的命令,moved错误就会被客户端打印出来。这是因为单机模式的redis-cli客户端不清楚moved错误的作用,所以会直接将moved错误打印出来,而不会进行自动转向
被隐藏的moved错误
MOVED错误
集群节点保存键值对过期时间的方式,与单机Redis服务器保存键值对以及键值对过期时间的方式完全相同
节点和单机服务器在数据库方面的一个区别是,节点只能使用0号数据库,而单机Redis服务器则没有这一限制
除了将键值对保存在数据库里面之外,节点还会用clusterState结构中的slots_to_keys跳跃表来保存槽和键之间的关系
节点数据库的实现
在集群中执行命令
Redis集群的重新分片操作可以将任意数量已经指派给某个节点的槽改为指派给另一个节点,并且相关槽所属的键值对也会从源节点被移动到目标节点。
可以在线进行,再重新分片的过程中,集群不需要下线,并且源节点和目标节点都可以继续处理命令请求。
是由Redis集群管理软件redis-trib负责执行的
Redis提供了进行重新分片需要的所有命令,而redis-trib则通过向源节点和目标节点发送命令来进行重新分片操作。
1)redis-trib对目标节点发送cluster setslot <slot> importing <source_id>命令,让目标节点准备好从源节点导入属于槽slot的键值对
2)redis-trib对源节点发送cluster setslot <slot> migrating <target_id> 命令,让源节点准备好将属于slot的键值对迁移(migrate)至目标节点
3)redis-trib向源节点发送cluster getkeysinslot <slot> <count> 命令,获得最多count个属于槽slot的键值对的键名。
4)对于步骤3获得的每个键名,redis-trib都向源节点发送一个migrate <target_ip> <target_port> <key_name>0<timeout>命令,将被选中的键原子地从源节点迁移至目标节点。
5)重复执行步骤3和步骤4,直到源节点保存的所有属于槽slot的键值对都被迁移至目标节点为止。
6)redis-trib向集群中的任意一个节点发送cluster setslot <slot> node <target_id>命令,将槽slot指派给目标节点,这一指派信息会通过消息发送至整个集群,最终集群中的所有节点都会直到槽slot已经指派给了目标节点。
redis-trib对集群的单个槽slot进行重新分片的步骤
实现原理
重新分片
重新分片存在的问题
被隐藏的ASK错误
cluster setslot importing命令的实现
cluster setslot migrating命令的实现
ASK错误
ASKING命令
ASK错误和moved错误的区别
cluster replicate <node_id>
设置从节点
ping消息
故障检测
主节故障
1)复制下线主节点的所有从节点里面,会有一个从节点被选中
2)被选中的从节点会执行slaveof no one命令,成为新的主节点
3)新的主节点会撤销所有对已下线的主节点槽指派,并将这些槽全部指派给自己
4)新的主节点向集群广播一条pong消息,这条pong消息可以让集群中的其他节点立即直到这个节点已经由从节点变成了主节点,并且这个节点已经接管了原本有已下线节点负责处理的槽
5)新的主节点开始接收和自己负责处理的槽有关的命令请求,故障转移完成
故障转移的执行步骤
故障转移
新的主节点是通过选举产生的
1)集群的配置纪元是一个自增计数器,它的初始值为0
2)当集群里的某个节点开始以此故障转移操作时,集群配置纪元的值会被增1
3)对于每个配置纪元,集群里面每个负责处理槽的主节点都有以此投票的机会,而第一个向主节点要求投票的从节点将获得主节点的投票
4)当从节点发现自己正在复制的主节点进入已下线状态时,从节点会想集群广播一条clustermsg_type_failover_auth_request消息,要求所有收到这条消息、并且具有投票权的主节点向这个个从节点投票
5)如果一个主节点具有投票权(它正在负责处理槽),并且并且这个主节点尚未投票给其他从节点,那么主节点将向要求投票的从节点返回一条clustermsg_type_failover_auth_ack消息,表示这个节点支持从节点成为新的主节点
6)每个参与选举的主节点都会接收clustermsg_type_failover_auth_ack消息,并根据自己收到了多少条这种消息来统计自己获得了多少主节点的支持
7)如果集群里有n个具有投票权的主节点,那么当一个从节点收集到大于等于n/2+1张支持票时,这个从节点就会当选新的主节点
8)因为在每一个配置纪元里面,每个具有投票权的主节点只能投一次票,所以如果有n个主节点进行投票,那么具有大于等于n/2+1张支持票的从节点只会有一个,这确保了新的主节点只会有一个
9)如果在一个配置纪元里面没有用从节点能收集到足够多的支持票,那么集群进入一个新的配置纪元,并且再次进行选举,直到选出新的主节点为止
集群选举新的主节点的方法
选举新的主节点
复制与故障转移
发送者接受者
meet消息
pong消息
FAIL消息
PUBLISH消息
消息类型
消息
集群
redis github
解压:tar xzf redis-XXX.tar.gz
进入目录并make
后台启运行
启动服务端
单机安装
下载reids:wget https://download.redis.io/releases/redis-6.0.9.tar.gz
解压:tar xzf redis-6.0.9.tar.gz
7000
7001
7002
7003
7004
7005
创建6个子目录
内容
其中port不同
6个子目录下创建redis.conf文件
../redis-6.0.9/src/redis-server ./redis.conf
分别进入6个目录启动redis服务
创建cluster-test目录
创建集群
集群客户端操作redis集群
集群安装
通过Jedis操作redis
通过连接池JedisPool操作
使用
单机
jedis
Lettuce
redis java client
spring data redis
Java编程操作redis
实践
redis
内存中存储数据库,可以比磁盘读取更快
支持
memcache
亚秒级延迟
Redis和Memcached在语法上都易于使用,并且需要最少的代码就能集成到您的应用程序中。
开发人员易用
Redis和Memcached都允许您在多个节点之间分配数据。这使您可以扩展以在需求增长时更好地处理更多数据。
数据分区
Redis和Memcached都有许多可供开发人员使用的开源客户端。支持的语言包括Java,Python,PHP,C,C ++,C#,JavaScript,Node.js,Ruby,Go等。
支持多语言
除了字符串,Redis还支持列表,集合,排序集合,哈希,位数组和超级日志。 应用程序可以使用这些更高级的数据结构来支持各种用例。 例如,您可以使用Redis Sorted Sets轻松实现游戏排行榜,该排行榜按玩家的排名对他们进行排序。
不支持
高级数据结构
由于Memcached是多线程的,因此可以利用多个处理核心。这意味着您可以通过扩大计算能力来处理更多操作。
不支持,单线程
多线程架构
借助Redis,您可以使用时间点快照将数据保留在磁盘上,该快照可用于归档或恢复。
Redis允许您创建Redis主数据库的多个副本。这使您可以扩展数据库读取并具有高度可用的集群。
Redis支持事务,使您可以将一组命令作为隔离的原子操作执行。
Redis支持具有模式匹配的发布/订阅消息传递,您可以将其用于高性能聊天室,实时评论流,社交媒体供稿和服务器互通。
发布/订阅
Redis允许您执行事务性Lua脚本。脚本可以帮助您提高性能并简化您的应用程序。
Lua脚本
Redis具有专用命令,可大规模处理实时地理空间数据。 您可以执行一些操作,例如查找两个元素(例如人或地方)之间的距离以及查找点给定距离内的所有元素。
地理位置
memcached VS redis
缓存
通用特性
属性
主题
producer.send(record)
发送并忘记
producer.send(record).get()
异步发送
发送消息的方式
键
值
键相同的PreducerRecord会存储在相同的分区
PreducerRecord
要有多少个分区副本收到消息,消费者才认为消息写入成功
该参数影响消息的丢失
不需分区节点收到消息,消息就算发成功
0
只要首领节点收到消息,消息才算发送成功
只有当所有节点都收到消息,消息才算发送成功
all
acks
发送消息失败时,重试的次数,重试达到该次数时放弃重试并返回错误
reties
实现org.apache.kafka.clients.producer.Partitioner接口
默认实现org.apache.kafka.clients.producer.internals.DefaultPartitioner#partition
自定义分区策略
生产者
归属一个消费者群组
订阅主题
消费主题部分或全部分区的消息
消费者
group.id相同的多个消费者
同组中的消费者不会重复消费主题消息
群组中添加或减少消费者,会进行分区再均衡,使消费者消费各分区
消费者数量不要超过主题分区数量,超过了消费者会分不到分区,消费者会闲置、不处理消息、浪费资源
消费者群组
群组协调器
分区再均衡
消息轮询是消费者的核心API
轮询
消费者分配的分区的偏移量不存在或失效时该如何处理
最新的记录开始读取(即:消费者启动之后生成的记录)
latest
分区的起始位置开始读取
earliest
auto.offset.reset
消费者是否自动提交偏移量
自动提交偏移量
手动提交偏移量
enable.auto.commit
分区分配给消费者的策略
连续的分区分配给消费者
分区逐个的分配给消费者
partition.assignment.strategy
其他的JMS队列需要得到消费者的确认
消费者使用kafka来追踪消息在分区中的位置(偏移量)
每个分区有各自的偏移量
消费者往一个叫做_consumer_offset的特殊主题发送消息,消息包含每个分区的偏移量
消费者读取分区的最后一次提交的偏移量,然后从指定的地方继续处理
如何实现偏移量
提交的偏移量小于消费者处理的最后一个消息的偏移量
消息重复消费
提交的偏移量大于消费者处理的最后一个消息的偏移量
消息丢失
偏移量的提交对消息消费影响
偏移量
enable.auto.commit=true
auto.commit.interval.ms默认值是5s
消费者会定时的把poll()方法接收到的最大偏移量提交上去
时间由auto.commit.interval.ms决定
运行原理
如果在auto.commit.interval.ms时间内发生了增加或减少消费者且一次poll()的消息有一部分消息已被处理时,可能会出现消息重复消费的情形
存在的缺陷
自动提交
enable.auto.commit=false
调用consumer.poll(),处理消息,调用consumer.commitSync()
请自行查看consumer.commitSync()源码
只要没有发生不可恢复的错误时,commitSync()会一直重试
commitSync()会提交该批次的最新的偏移量
commitSync()会一直阻塞
由于会阻塞,导致系统的吞吐量不高
不会存在重复消费
调用consumer.poll(),处理消息,调用consumer.commitAsync()
请自行查看consumer.commitAsync()源码
commitAsync()不会重试
支持回调
如果异步提交通信失败的话?
失败后会重试?
如何保证多次异步提交的顺序?
不解之谜
再均衡后会出现消息重复
如果多次提交会覆盖的话,即:提交3000的请求在提交2000的请求之前执行的话,offset的值3000被后边2000覆盖的话
确保异步提交的offset是最新的不会小的覆盖掉大的
如何避免缺陷
关闭消费者或者再均衡时,需要确保偏移量准确提交
参考同步提交和异步提交
同步和异步组合提交
poll()消息后,需要在处理消息中间时提交偏移量
提交特定的偏移量
提交偏移量的方式
默认处理是怎样的?
通过再均衡监听器ComsumerRebalanceListener来处理再均衡时偏移量的递交
消息处理和再均衡同时发生时如何提交偏移量?
在调用subscribe()时传入
如何使用
ComsumerRebalanceListener
再均衡和提交偏移量
提交和偏移量
在另外的线程中调用consumer.wakeup()
consumer.wakeup()可以退出poll(),并抛出WakeupException
在主线程中,即main()方法中,可以通过Runtime.getRuntime().addShutdownHook(new Thrad(()->{consumer.wakeup()}));
只要键相同就会在同一个分区
保证消息在同一个分区
保证消息发送的顺序
确保消费者对分区的offset的正确的提交
如何保证消息顺序
基本概念
RabbitMQ
顺序消息
延时消息
批量消息
过滤消息
事务消息
RocketMQ
MQ
包含多种Document
Schemal.xml
solrconfig.xml
组成元素
Core:索引
Document
core join
操作
倒排表
与MySQL的区别
本文参考的是《Elasticsearch实战》一书,但是很多API操作已经是结合最新的官方文档做了更新的
elasticsearch-7.10.0
ES版本
分词器
介绍
Elasticsearch是面向文档的,索引和搜索数据的最小单位是文档
同时包含字段和取值
自我包含
文档中包含新的文档。
层次型的
文档不依赖于预先定义的模式
拥有灵活的结构
也就是说并非所有的文档都需要拥有相同的字段,它们不是受限于同一个模式
文档是无模式的
文档的逻辑容器,类似于表格是行的容器
每个类型中字段的定义成为映射
Removal of mapping types
Elasticsearch7.0以后会弃用类型,8.0以后会直接移除类型
创建多个类型时会报错
默认类型是_doc
一个索引中只能有一个类型
各版本说明
索引是映射类型的容器
逻辑设计
物理设计
索引一篇文档
索引新数据
单个类型和单个索引中进行搜索
多个类型和单个索引中进行搜索
多个索引中进行搜索
所有索引中搜索
搜索案例
在哪里搜索
took:搜索消耗的时间,单位毫秒
timed_out:搜索是否超时
时间
total:总分片数
successful:成功分片数
failed:失败分片数
_shards
tatal:匹配文档总数
max_score:匹配文档的最高得分
hits
命中统计数据
_index
_type
_id
_score
查询时未指定feilds时返回
_source
查询时指定了fields时返回
fields
hits.hits
结果文档
回复的内容
url请求参数q
url请求参数fields
通过URL搜索
指定字段,默认值是_all
default_field
操作符,默认值为or
default_operator
query_string
在指定字段查询一个词,term查询可能更快捷、更直接
term
过滤器是不带得分的,过滤查询更为快速,而且更容易缓存
查询是带得分的
filtered
过滤
通过聚集来进行各种统计
aggregations
聚集
通过JSON指定搜索条件
如何搜索
为了获取具体的文档,必须要知道它所属的索引和类型,以及它的ID
found:代表文档是否存在
回复
通过id获取文档
搜索并获取数据
深入功能
定义新映射
获取目前的映射
检索和定义映射
扩展现有的映射
使用映射来定义各种文档
字符串类型
数值类型
日期类型
布尔类型
用于定义文档字段的核心类型
更新现有文档
通过ID删除单个文档
删除映射类型和全部文档
删除匹配某个查询的所有文档
删除索引
关闭/打开索引
删除数据
索引、更新和删除数据
所有的REST搜索请求使用_search的REST端点
搜索整个集群
搜索指定索引
确定搜索范围
搜索请求中最重要的组成部分
它配置了基于评分返回的最佳文档,也包括了你不希望返回哪些文档
字段精确查询
匹配文字、日期、数字、布尔
match
范围
返回文档的数量
size
和size一起使用,from用于分页操作
from
指定_source字段如何返回
默认是返回完整的_source字段
默认的排序是基于文档的得分
sort
搜索请求的基本模块
使用from和size参数实现结果分页
改变结果的顺序
在你期望的回复中限制source的字段
按关键词查询
基于URL的搜索请求
使用from和size参数来实现结果分页
返回指定字段
结果排序
基于请求主体的搜索请求
搜索请求的结构
这一节官方文档讲的更好,请参 考官方参考文档翻译下的 查询DSL
介绍查询和过滤器DSL
搜索数据
使用字符过滤器转变字符
字符过滤
将文本切分为单个或多个分词
文本切分为词
使用分词过滤器转变每个分词
分词过滤
将这些分词存储到索引中
分词索引
什么是分析
定义分词器
定义过滤器
在索引创建时增加分析器
不知道最新文档是否已经删除,没有找到相关的文档
在配置中添加分析器
在映射中指定某个字段的分析器
为文档使用分析器
_analyze
使用分析API来分析文本
文本的默认分析器
standard analyzer:标准分析器
只使用了小写转换分词器
simple analyzer:简单分析器
根据空白将文本切分为若干分词
whitespace analyzer:空白分析器
额外过滤了停用词
stop analyzer:停用词分析器
将整个字段当作一个单独的分词
keyword analyzer:关键词分析器
允许指定一个分词切分的模式
pattern analyzer:模式分析器
相应的插件
语言和多语言分析器
snowball analyzer:雪球分析器
内置的分析器
standard tokenizer:标准分词器
keyword tokenizer:关键词分词器
letter tokenizer:字母分词器
lowercase tokenizer:小写分词器
whitespace tokenizer:空白分词器
pattern tokenizer:模式分词器
UAX URL: 电子邮件分词器
path hierarchy tokenizer:路径层次分词器
standard token filter:标准分词过滤器
lowercase token filter:小写分词过滤器
length token filter:长度分词过滤器
stop token filter:停用词分词过滤器
truncate token filter:截断分词过滤器
trim token filter :修建分词过滤器
limit token count token filter:限制分词数量分词过滤器
reverse token filter:颠倒分词过滤器
unique token filter:唯一分词过滤器
ASCII folding token filter:折叠分词过滤器
synonym token filter:同义词分词过滤器
分词过滤器
分析器、分词器和分词过滤器
N元语法、侧边N元语法和滑动窗口
提取词干
分析索引字段
分析器分析文本
分析API
分析数据
打分公式
文档打分是如何运作的
打分的首要方式是,查看一个词条在文本中出现的次数
词频:TF
如果一个分词在索引的不同文档中出现越多的次数,那么它就越不重要。
没有区分度
逆文档频率:IDF
人类语言解释:给定查询q和文档d,其得分是查询中每个词条t的等分总和。而每个每个词条的得分是该词在文档d中的词频的平方根,乘以该词频的平方和,乘以该文档字段的归一化因子,乘以该词的提升权重
lucene评分公式:TF-IDF
Elasticsearch的打分机制
可能是lucene中第二流行的评分方法,仅次于TF-IDF
Okapi BM25
随机性分歧,DFR相似度
基于信息的,IB相似度
LM Doirichlet相似度
LM Jelinek Mercer相似度
其他打分方法
需要修改时,需要重新索引文档
计算文档的最终得分可能会丢失精度
,boost是运用于一个词条的。因此,在被boost的字段中如果匹配上了多个词条,就意味着多次的boost,将会进一步增加字段的权重。
不鼓励的原因
不鼓励使用
索引期间的boosting
鼓励使用
查询期间的boosting
跨越多个字段的查询
boosting
解释查询
解释一篇文档不匹配的原因
使用解释来理解文档是如何被评分的
在大多数正常的查询中,计算文档的得分只需要少量的开销。
使用脚本的评分
进行phrase词组查询,搜索在一定距离内出现的单词
使用场景:在成千上万的文档上运行时
再打分
使用查询再打分来减小评分操作的性能影响
weight函数
合并得分
field_value_factor函数
脚本
随机
衰减函数
配置选项
使用function_score来定制得分
尝试一起使用它们吧
使用脚本排序
字段数据
使用相关性进行搜索
度量聚集
桶聚集
嵌套聚集
使用聚集来探索数据
对象类型
嵌套文档
父子关系
反规范化
文档间的关系:代替sql中的join
不机器上直接解压运行即可;相同机器上解压修改端口后运行。
向集群加入节点
通过广播
通过单播
选举主节点和识别错误
发现其他节点
删除集群中的节点
升级节点
展示分配到每个节点的分片数量。
allocation
统计整个集群或索引中文档的数量。
展示集群的健康状态。
health
展示现有索引的信息。
indices
显示目前被选为主节点的节点。
显示集群中所有节点的不同信息。
nodes
显示集群中正在进行的分片恢复状态。
recovery
展示集群中分片的数量、大小和名字。
shards
展示已安装插件的信息。
plugins
使用_cat API
有意的为索引创建大量分片,用于未来增加节点的过程
每个分片都是完整的lucene索引,它需要为索引的每个分段创建一些文件描述符,增加相应的内存开销。
占用支撑性能的内存,触及及其文件描述符或内存的极限
增加压缩文件数量
主分片的数量永远是不能改变的。
存在问题
过度分片
如,按年份创建索引,按城市创建索引
将单个索引拆分成多个索引
将数据切分为索引和分片
默认情况下,在数据更新到主分片和所有副本分片之前,请求是不会完成的。
在索引的节点将副本分片的数量减少到1是有利的,然后在集中索引阶段结束后将这个数量重新增加为1或多个
索引时
主分片和副本分片都可用于搜索
通过加入更多的副本分片,搜索可以更快
搜索时
最大化吞吐量
扩展策略
为什么别名是很有用处的
_aliases API
管理别名
什么是别名
别名的创建
别名
路由
向外扩展:高可用
提升性能
管理集群
理论:Elasticsearch实战
子查询语句
bool
复合查询语句
什么时候用查询什么时候用过滤器?
在查询上下文中,查询子句回答问题“此文档与该查询子句的匹配程度如何?”除了决定文档是否匹配之外,查询子句还计算_score元数据字段中的相关性得分 。
查询上下文
在过滤器上下文中,查询子句回答问题“此文档是否与此查询子句匹配?答案很简单,是或否-不计算分数。过滤器上下文主要用于过滤结构化数据,例如日期、固定取值
常用过滤器将由Elasticsearch自动缓存,以提高性能。
过滤器上下文
到底是用查询还是过滤器?
查询和过滤上下文
用于组合多个子查询或组合查询
must
should
must_not
minimum_should_match
子句
constant_score
dis_max
function_score
组合查询
Intervals 查询:间隔查询
match查询是用于执行全文搜索(包括模糊匹配选项)的标准查询。
match查询:模糊查询
match_bool_prefix查询:前缀匹配查询
match_phrase查询:短语匹配查询
match_phrase_prefix查询:短语前缀匹配查询
multi_match查询:多字段匹配查询
使用具有严格语法的解析器,根据提供的查询字符串返回文档。
query_string查询
simple_query_string查询
全文查询
exists查询:存在与否查询
fuzzy查询:模糊查询
IDs查询:根据一个/多个id查询
prefix查询:前缀查询
range查询:范围查询
regexp:正则表达式查询
term:术语查询
terms:多术语查询
terms_set:最少包含术语查询
wildcard:通配符查询
term级别查询
geo_bounding_box查询:地理边界框查询
geo_distance查询:地理距离查询
geo_polygon查询:geo多边形查询
geo_shape查询:
GEO查询
match_all查询
match_none查询
shape查询
连接查询
通常用于对法律文件或专利进行非常具体的查询。
span查询:跨度查询
查询DSL(特定领域语言)
将您的数据汇总为指标,统计信息或其他分析
按字段值,范围或其他条件将文档分组为桶
桶聚合
字段总和,平均值
指标聚合
从其他聚合获取输入
管道聚合
分类
运行聚合
改变聚合的范围
返回聚合的结果
运行多个聚合
运行子聚合
添加自定义元数据
返回聚合类型
在聚合中使用脚本
聚合缓存
长整型的限制
可以有子聚合
date_histogram:日期直方图聚合
date_range:日期范围聚合
histogram:直方图聚合
ip_ranges:ip范围聚合
geo_distance:地理位置距离聚合
range:范围聚合
terms:术语聚合
rare_terms:稀有术语聚合
可以用作桶聚合的子聚合
avg:平均值聚合
max:最大值聚合
min:最小值聚合
sum:求和聚合
箱型图 维基百科
boxplot:箱型图聚合
cardinality:基数聚合
管道聚合工作于其他聚合而不是文档集所产生的输出,从而将信息添加到输出树中。
聚合中的聚合,如:聚合结果中求平均值、最大值等操作
avg_bucket:桶平均聚合
cumulative_sum:累计求和
max_bucket:桶最大值聚合
min_bucket:桶最小值聚合
sum_bucket:桶求和聚合
文本分析
官网参考文档翻译
使用教程
重启es
分析文档
学习笔记
IK中文分词器
中文拼音分词器
中文分词器
REST API
Java REST API
API
Elastic:菜鸟上手指南
《Elasticsearch实战》
学习参考
如何规划分片数量
ES官网Java客户端案例
Spring Data ES 案例
爬取CSDN文章到ES进行搜索
同步mysql中表到es:表数据60多万条记录
通过logstash实现
通过canal实现
MySQL同步到ES
编程实战
Elasticsearch
Logstash
下载解压即可启动
配置默认语言为中文
Kibanna
ELK
维基百科
Raft论文中文翻译
Raft算法
Paxos算法
一致性/共识算法
一致性哈希
zookeeper实现
分布式锁
XA
两阶段提交
Saga
柔性事务
分布式事务
脑裂
挑战
分布式理论
创建虚拟机并安装centos6.10
创建一般用户并加入到sudoers
更改主机名称
通过centos网络配置设置
局域网访问
静态ip
用于联网
NAT
网卡配置
修改hosts
主机之间免密远程登入
重新安装JDK
虚拟机配置
VirtualBox
虚拟机
在本地机器上生成ssh密钥
将jast.pub文件内容添加到GCP元数据
通过SecureCRT连接远程主机
GCP
云平台
https://nginx.org/en/download.html
wget https://nginx.org/download/nginx-1.18.0.tar.gz
proxy_pass
反向代理
upstream
负载均衡
location
动静分离
Nginx
授权码授权模式,是使用公开的客户端和密钥来获取token
用户通过重定向URL返回到客户端后,应用程序将从URL获得授权代码,并使用它来请求访问令牌。
建议所有客户端也将PKCE扩展与此流程一起使用,以提供更好的安全性。
What is the OAuth 2.0 Authorization Code Grant Type?
获取用户的权限
用户输入用户名密码登入并授权
返回允许结果
不允许
执行接下来步骤
允许
授权用户资源
跳转到redirect_uri并带回code
通过code获取access_token
获取token的步骤
authorization-code
客户端使用“客户端证书”授予类型来获取用户上下文之外的访问令牌。
客户端通常使用它来访问有关其自身的资源,而不是访问用户的资源。
Client Credentials
通过client_id和client_secret直接获取
client credentials
设备流中的无浏览器或受输入限制的设备使用设备代码授权类型,以将先前获得的设备代码交换为访问令牌。
设备代码授权类型值为urn:ietf:params:oauth:grant-type:device_code。
Token Request
通过device_code和client_id获取
device code
客户端使用“刷新令牌”授予类型在访问令牌过期时将刷新令牌交换为访问令牌。
这允许客户端继续拥有有效的访问令牌,而无需与用户进行进一步的交互。
Refreshing Access Tokens
直接通过之前获取token时返回的refresh_token获取
refresh token
Implicit流是先前推荐用于本机应用程序和JavaScript应用程序的简化的OAuth流,在本机应用程序和JavaScript应用程序中,无需额外的授权代码交换步骤即可立即返回访问令牌。
不建议使用隐式流(某些服务器完全禁止该流),因为存在HTTP重定向中返回访问令牌而未确认客户端已接收到它的固有风险。
公共客户端(例如本机应用程序和JavaScript应用程序)现在应该使用带有PKCE扩展名的授权代码流。
What is the OAuth 2.0 Implicit Grant Type? (developer.okta.com)
获取token
用户输入用户名密码登入
授权
跳转到redirect_uri并带回access_token
implicit:遗弃
密码授予类型是一种将用户凭据交换为访问令牌的方式。 因为客户端应用程序必须收集用户的密码并将其发送到授权服务器,所以不建议再使用此授权。
该流程没有为多因素身份验证或委托帐户之类的机制提供任何机制,因此在实践中是相当有限的。
最新的OAuth 2.0安全性最佳最新实践完全禁止密码授予。
What is the OAuth 2.0 Password Grant Type? (developer.okta.com)
通过用户名密码及client_id直接获取token
password:遗弃
授权类型:OAuth Grant Types
令牌自省扩展为资源服务器定义了一种机制,以获取有关访问令牌的信息。 使用此规范,资源服务器可以检查访问令牌的有效性,并找出其他信息,例如哪个用户和哪些范围与令牌相关联。
令牌自省
令牌吊销扩展定义了一种机制,该机制使客户端可以向授权服务器指示不再需要访问令牌。 这用于在客户端中启用“注销”功能,从而允许授权服务器清除与授权关联的所有安全凭证。
令牌撤销
JSON Web令牌(JWT,RFC 7519)是一种在JSON文档中对声明进行编码的方法,然后对该签名进行签名。
JWT可以用作OAuth 2.0承载令牌,以将访问令牌的所有相关部分编码为访问令牌本身,而不必将其存储在数据库中。
JSON Web Token
令牌和令牌管理
OAuth 2.0 的四种方式——阮一峰
中文资料
开发文档
OAuth2AuthenticationProcessingFilter
resource server
authorization server
Spring Security OAuth2
spring security oauth2 boot
Java
构建authorization server
构建resource server
构建client
https://github.com/spring-projects/spring-security/wiki/OAuth-2.0-Migration-Guide
https://docs.spring.io/spring-security/site/docs/current/reference/html5/#oauth2resourceserver
执行过程日志
添加依赖spring-boot-starter-security和spring-boot-starter-oauth2-resource-server
添加jwk-set-uri
web security中启动oauth2ResourceServer和jwt
如何实现
Spring Security 提供的Resource Server实现
如何调试Spring Security?
OAuth2 Java实现Spring Security OAuth2退出历史舞台,未来如何发展?
OAuth2
MQTT
协议
部署
服务
WebUI功能
nacos
1.7.2
安装运行
sentinel
工具准备
导入spring-cloud-alibaba-dependencies
导入依赖jar包
添加@EnableDiscoveryClient
在bootstarp.yaml中配置nacos服务发现服务器地址
使用nacos做服务注册
注意一定要是bootstrap.yml
在bootstrap.yaml中配置nacos配置中心服务器地址
nacos官方文档
引入nacos配置中心中配置文件
使用nacos做配置中心
微服务中的controller中配置sentinal
openfeign中配置sentinel
使用sentinel做熔断、服务降级、限流
编写微服务
Spring Cloud Gateway旨在提供一种简单而有效的方法来路由到API,并为它们提供跨领域的关注点,例如:安全性,监视/指标和弹性。
运行流程
默认使用Authorization Code跳转到登入页面的
spring-boot-starter-oauth2-client
spring.security.oauth2.registration
spring.security.oauth2.provider
spring.cloud.gateway.routes[*].filters[TokenRelay]
使用配置
需要spring-boot-starter-oauth2-client依赖
reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalArgumentException: Unable to find GatewayFilterFactory with name TokenRelay
错误
TokenRelayGatewayFilterFactory
编写网关Spring Cloud Gateway
Spring Cloud
微服务
用户付款到平台提供方账户
支付
支付宝对账单下载API
微信支付交易账单下载API
第三方支付下载账单API
对账:reconciliation
平台提供方打款给商家
支付宝企业付款到银行卡
微信企业付款到银行卡
第三方支付打款API
自动结算
用户发起
触发方式
结算:settlement
业务术语
公众账号ID
小程序id
应用id
app_id
商户号
mch_id
签名需要,微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
key
pkcs12格式(Java),退款需要
证书
需要的东西
支付产品
分账接收方商户id
支付工具
普通商户
服务商
微信支付
发送请求时需要
签名需要
应用私钥
支付宝公钥
支付宝支付
第三方支付
平台
聚合支付
https://issues.sonatype.org/secure/Signup!default.jspa
注册JIRA账号
https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134
Summary
有域名的填写自己的域名
创建完后会提示在github上创建一个仓库表明账户是你自己的
到github创建https://github.com/jast90/OSSRH-62929仓库
创建完成后回复配置仓库地址
没域名的可以使用io.github.用户名/com.github.用户名
Group Id
Project URL
SCM url
必填信息
创建issue
https://gpgtools.org/
安装GPG
password在后面deploy会用到
输入name、email、password
gpg --gen-key
生成GPG密钥对
uid ultimate上一行
gpg –list-keys
查看GPG公钥
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys 上一步获取到的公钥
上传GPG公钥
安装并配置GPG
server
配置maven的setting.xml
name
url
description
apache
mongodb
license
scm
developers
distributionManagement
profile
配置pom.xml
会弹出gpg输入密钥的密码
mvn deploy -Darguments=\"-DskipTests\
发布jar包
https://oss.sonatype.org/#stagingRepositories
用JIRA账号登入
登入后就能够看到deploy的jar包
点击close,能正常关闭的话就可以release
可以查看下方的提示信息,只要pom.xml文件完善的话就没什么问题
不能close,
选中相关的Repository
release后到JIRA回复发布了第一个版本,就会收到回复
查看发布的jar包
https://blog.fundebug.com/2019/01/14/how-to-deploy-jar-to-maven-central-repository/
发布jar包到maven中心仓库
使用 Maven 构建和测试 Java
使用 Maven 发布 Java 包
发布 Docker 映像
github CI/CD
Java项目管理
FastDfs
AliOSS
分布式文件系统
中间件
0 条评论
回复 删除
下一页