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