一个分区只能被消费者组中的一个消费者消费
一个消费者组中的一个消费者可以消费多个分区
一个消费者组中的不同消费者消费的分区一定不会重复
一个topic可以有多个consumer group,但每个partition只会把消息发给该consumer group中的一个consummer
(1)消费效率高
(2)消费模式灵活(广播模式,单播模式)
(3)便于故障容灾
https://blog.csdn.net/john1337/article/details/103060820
https://www.cnblogs.com/joker-wz/p/11000489.html
linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程和全局变量在另一个进程中看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1吧数据从用户空间考到内核缓冲区,进程2在从内核缓冲区把数据读走,内核提供的这种机制叫做进程间通信。
在进程间完成数据传递需要借助操作系统的提供的特殊方法,如管道、命名管道、信号、消息队列、共享内存、信号量、套接字等。
使用共享内存效率高,但是问题如下:
(1)内存大小
(2)看这个地址吧 https://blog.csdn.net/weixin_30872671/article/details/96263270
进程。
进程是程序的一次执行过程,是个动态概念。是程序在执行过程中分配和管理资源的基本单位,每个进程都有一个自己的地址空间。
线程。
线程是CPU调度和分派的基本单位,它可与同属一个进程的其他线程共享进程的拥有的资源。
区别
根本区别:进程是操作系统分配资源的基本单位,而线程是任务调度和执行的基本单位。
开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间切换会有较大的开销;线程可看成是轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器,线程之间切换开销小。
内存分配方面:系统在运行时会为每个进程分配不同的内存空间;而线程,除了CPU外,系统不会为线程分配内存。
一个进程可以包含>=1个线程。
第一次:客户主动连接服务器,向服务器发送SYN,假设系列号是J,服务器被动打开
第二次:服务器收到SYN后,会发送一个SYN和一个ACK给用户,ACK的序列号是J+1, SYN的序列号是K
第三次:客户收到信的SYN和ACK后,会向服务器回应ACK K+1,表示收到了,然后两边就可以开始发送数据了
get和post是HTTP请求的两种基本方法,
区别:
1.有synchronized关键字修饰的方法
由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态
2.有synchronized修饰的代码块
被该关键字修饰的语句块会自动被加上内置锁,从而实现同步
3.使用特殊域变量volatile实现线程同步
原理是每次线程要访问volatile修饰的变量时都是从内存中读取,而不是从缓存中读取,因此每个线程访问到的变量都是一样的,这样就保证了同步。
volatile不能保证原子操作,因此volatile不能代替synchronized。此外volatile会组织编译器对代码优化,降低了程序的执行效率
4.使用重入锁实现同步
java.util.concurrent包来支持同步
此时注意及时释放锁
5.使用局部变量实现线程同步
ThreadLocal
由于两个过着两个以上的线程相互持有对方需要的资源,导致这些线程处于等待状态,无法执行
1、每个进程、每个资源指定唯一编号
2、设定一张资源分配表,记录各进程与占用资源之间的关系
3、设置一张进程等待表,记录各进程与要申请资源之间的关系
1、抢占资源,从一个或多个进程中抢占足够数量的资源,分配给死锁进程,以解除死锁状态
2、终止(撤销)进程,终止(或撤销)系统中的一个或者多个死锁进程,直到打破循环换了,是系统从死锁状态解脱出来
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
(1) 未提交读
A事务已执行,但未提交;B事务查询到A事务的更新后数据;A事务回滚;—出现脏数据
(2) 已提交读
A事务执行更新;B事务查询;A事务又执行更新;B事务再次查询时,前后两次数据不一致 ---- 不可重复读
(3) 可重复读(默认)
A事务无论执行多少次,只要不提交,B事务查询值都不变;B事务仅查询A事务开始时那一瞬间的数据快照
(4) 串行化
不允许读写并发操作,写执行时,读必须等待
1、B-树将关键字、索引和记录都存放在一起;B+树的非叶子节点中只有关键字和指向下一个节点的索引,记录放在叶子节点中
2、在B-树中,越靠近根节点的记录查找时间越快,只要找到关键字即可确定记录的存在;在B+树中每个记录的查找时间基本是一样的,都需要从根节点走到叶子节点,而且在叶子节点中还要再比较关键字
最左前缀原则是发生在复合索引上的,只有复合索引才会有所谓的左和右之分。
(1)Flume启动停止脚本
#!/bin/bash
case $1 in
"start") {
for i in hd1 hd2 hd3
do
ssh $i "nohup /flume-ng agent --conf-file file-flume-kafk.conf --name a1 -Dflume.root.logger=INFO,LOGFILE > /dev/null 2> &1 &"
done
};;
"stop" ){
for i in hd1 hd2 hd3
do
ssh $i "ps -ef | grep file-flume-kafka |grep -v grep | awk '{print \$2}' | xargs kill"
done
};;
esac
(2)kafka启动停止脚本
#!/bin/bash
case $1 in
"start"){
for i in hd1 hd2 hd3
do
ssh $i "export JMX_PORT=9988 && kafka-server-start.sh -daemon server.properties"
done
};;
"stop"){
for i in hd1 hd2 hd3
do
ssh $i "kafka-server-stop.sh stop"
done
};;
esac
(3)采集通道启动/停止脚本
#! /bin/bash
case $1 in
"start"){
echo " -------- 启动 集群 -------"
echo " -------- 启动 hadoop集群 -------"
/opt/module/hadoop-2.7.2/sbin/start-dfs.sh
ssh hadoop103 "/opt/module/hadoop-2.7.2/sbin/start-yarn.sh"
#启动 Zookeeper集群
zk.sh start
sleep 4s;
#启动 Flume采集集群
f1.sh start
#启动 Kafka采集集群
kf.sh start
sleep 6s;
#启动 Flume消费集群
f2.sh start
};;
"stop"){
echo " -------- 停止 集群 -------"
#停止 Flume消费集群
f2.sh stop
#停止 Kafka采集集群
kf.sh stop
sleep 6s;
#停止 Flume采集集群
f1.sh stop
#停止 Zookeeper集群
zk.sh stop
echo " -------- 停止 hadoop集群 -------"
ssh hadoop103 "/opt/module/hadoop-2.7.2/sbin/stop-yarn.sh"
/opt/module/hadoop-2.7.2/sbin/stop-dfs.sh
};;
esac
列式存储(ORC、parque)
忘说LZO压缩格式存储
https://www.cnblogs.com/bigdatafly/articles/5037745.html
比较行式存储和列式存储
(1)行式存储
优点:基于hadoop系统运行存储结构的优点在于快速数据加载和动态负载的高适应能力,这是因为行存储保证了相同的记录的所有域都在同一个集群节点,即同一个HDFS
缺点:不支持快速查询处理,因为他不能跳过不必要的列读取,压缩比大
(2)列式存储
优点:查询时列存储可以避免读不必要的列,容易得到较大的压缩比
缺点:列存储不能保证同一记录的所有域都存储在同一节点,会导致大量的IO传输
所以,使用列存储的话,最好配合使用压缩,获得最大压缩比
持续更新ing……