hive基础-2
hive基础-2分区表和分桶表分区表分区表实际上就是对应一个 HDFS 文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive 中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过 WHERE 子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。
语法:partitioned by 【order by】
分区表基本操作
引入分区表(需要根据日期对日志进行管理, 通过部门信息模拟)
123dept_20200401.logdept_20200402.logdept_20200403.log
创建分区表语法
12345hive (default)> create table dept_partition(deptno int, dname string, loc string)partitioned by (day string)row format delimited fields terminated by '\t';
注意:分区字段不能是表中已经存在的数据,可以将分区字段看作表的伪列。
加载数据到分 ...
Hive基础-1
Hive基础-1Hive基本概念视频资料和笔记资料来自尚硅谷:https://www.bilibili.com/video/BV1EZ4y1G7iL
什么是Hive简介Hive:由 Facebook 开源用于解决海量结构化日志的数据统计工具。
Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL 查询功能。
本质将 HQL 转化成 MapReduce 程序
Hive 处理的数据存储在 HDFS
Hive 分析数据底层的实现是 MapReduce
执行程序运行在 Yarn 上
Hive 的优缺点优点
操作接口采用类 SQL 语法,提供快速开发的能力(简单、容易上手)
避免了去写 MapReduce,减少开发人员的学习成本。
Hive 的执行延迟比较高,因此 Hive 常用于数据分析,对实时性要求不高的场合。
Hive 优势在于处理大数据,对于处理小数据没有优势,因为 Hive 的执行延迟比较高。
Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
缺点
Hive 的 HQL 表达能力有限 ...
训练计划tips
推(较弱):
平板卧推 4 X 6 – 8
坐姿肩上推举 4 X 8-12
上斜哑铃推举 3 X 8 – 12
俯卧撑 3 X 10
哑铃侧平举 3 X 10 -15
绳索三头下压 3 X 10-15
有氧
拉(较弱):
辅助引体向上 4×8-12
俯身杠铃划船 4×6-8
窄握绳索下拉 3×8-12
绳索面拉 3×10-15
杠铃弯举 3×8-12
绳索垂式弯举 3×10-15
有氧
腿
深蹲 4×6-8
罗马尼亚深蹲 4×8-12
史密斯臀推 3×6-8
俯身腿弯举 3×8-12
坐姿腿屈伸 3×8-15
负重提踵 3×10-15
博客美化
npm安装123// 懒加载npm install hexo-lazyload-image --save
深入理解Phaser
Phaser介绍1以下从java jdk1.8的api中摘录
一个可重复使用的同步屏障,功能类似于CyclicBarrier和CountDownLatch,但支持更灵活的使用。
注册机制 与其他barrier的情况不同,Phaser中的“注册的同步者(parties)”会随时间而变化。Phaser可以通过构造器初始化parties个数,也可以在Phaser运行期间随时加入(register)新的parties,以及在运行期间注销(deregister)parties。运行时可以随时加入、注销parties,只会影响Phaser内部的计数器,它建立任何内部的bookkeeping(账本),因此task不能查询自己是否已经注册了,当然你可以通过实现子类来达成这一设计要求。
1234567//伪代码 Phaser phaser =new Phaser(); phaser.register();//parties count: 1 .... phaser.arriveAndDeregister()://count : 0; ....
Cy ...
多线程高级
1.synchronized 关键字
1.1.说一说自己对于 synchronized 关键字的了解synchronized 关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。
另外,在 Java 早期版本中,synchronized 属于 重量级锁,效率低下。
为什么呢?
因为监视器锁(monitor)是依赖于底层的操作系统的 Mutex Lock 来实现的,Java 的线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操作系统实现线程之间的切换时需要从用户态转换到内核态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高。
庆幸的是在 Java 6 之后 Java 官方对从 JVM 层面对 synchronized 较大优化,所以现在的 synchronized 锁效率也优化得很不错了。JDK1.6 对锁的实现引入了大量的优化,如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。
所以,你会发现目前的话,不论是各种开源框 ...
深入理解Semaphore
深入理解Semaphore1以下从java jdk1.8的api中摘录
介绍Semaphore:一个计数信号量。在概念上,信号量维持一组许可证。如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它。每个release()添加许可证(只要调用这个方法就会添加,在写项目的时候要注意这个问题),潜在的释放阻塞获取地方。
信号量通常用于限制线程数,而不是访问某些(物理或逻辑)资源
例如,这是一个使用信号量来控制对一个项目池的访问的类:
pool对这个pool类进行了改造,验证线程池的可用
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364class Pool { private static final int MAX_AVAILABLE = 100; private final Semaphore available = new Semaphore(MA ...
volatile的底层实现
知识点计算机组成
cpu读取数据
三级缓存
cpu读取数据的时候,先从寄存器中读取数据,如果没有然后从L1(一级缓存)中读取数据,如果没有然后从L2(二级缓存总读取数据),如果没有然后从L3中读取数据,L3中没有,从内存中读取数据,内存中还没有从磁盘中读取数据,拿到数据后在一级一级放回(L3到L2到L1到寄存器)
cpu线程切换
每个线程独占cpu寄存器中的数据,当第二个线程执行的之后,把寄存器中的数据保存起来,然后读取第二个线程的数据到寄存器,然后执行第二个线程
一核两线程cpu是,一核内有两个寄存器,在两个线程切换的时候,不需要切换寄存器中的数据
cpu缓存意义
时间局部性:如果某个数据被访问,那么在不久的将来它很有可能会被再次访问。
空间局部性:如果某个数据被访问,那么与它相邻的数据很快也能被访问。
缓存行
按块预读取(也叫缓存行)(cache line)缓存在读取的数据的时候并不是只拿需要的数据,这样缓存的意义也就没有了,获取一个数据的时候,其周边的数据也会顺便拿过来,这如果当这个数据执行完成后,马上会旁边的数据的情况下,可以立即从最近的缓存中直接拿到,而不用 ...
偏向锁四秒延迟探究
在项目中发现偏向锁并不是立即生效的,而是有着一个默认延迟,下面深入探究一下,为什么偏向锁有着四秒延迟,以及怎么调优
问题123456789101112131415/** * @author Lvzixin * @date 2021/8/26 17:00 */public class JOL { public static void main(String[] args) { Object o = new Object(); System.out.println(ClassLayout.parseInstance(o).toPrintable()); synchronized (o){ System.out.println(ClassLayout.parseInstance(o).toPrintable()); } }}
打印:
1234567891011121314151617java.lang.Object object inte ...
多线程2
原子性操作原子变量类 (Atomics)是基于CAS实现的能够保障对共享变量进行read-modify-write更新操作的原子性和可见性的一组工具类。所谓的read-modify-write更新操作,是指对共享变量的更新不是一个简单的赋值操作,而是变量的新值依赖于变量的旧值,例如自增操作 “count++”。由于volatile无法保障自增操作的原子性,而原子变量类的内部实现通常借助一个volatile变量并保障对该变量的read-modify-write更新操作的原子性,因此它可以被看作增强型的volatile变量。原子变量类一共有12个,可以被分为4组:
AtomicInteger主要为因为在多线程下,i++不是一个原子性的操作,所以java提供了一个AtomicInteger
原理
Compare And Set(比较并交换)
cas(value,expected,newValue)
cpu指令级别的执行(原子性)
1if(value == expected){ value = newValue}
ABA问题
如果知识一个值是没有影响的,但是如果是 ...
多线程1
什么是线程和进程?何为进程?进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。
在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。
如下图所示,在 windows 中通过查看任务管理器的方式,我们就可以清楚看到 window 当前运行的进程(.exe 文件的运行)。
何为线程?线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
Java 程序天生就是多线程程序,我们可以通过 JMX 来看一下一个普通的 Java 程序有哪些线程,代码如下。
123456789101112public class MultiThread { public static ...
CAS
CAS:compar and swap,是一种自旋锁
属于乐观锁,是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在CAS指令之前返回该位置的值。CAS有效地说明了“我认为位置V应该包含值A;如果包含该值,则将B放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。
ABA问题加入有三个线程,线程A读取内存中数据为0,然后i++,线程B读取内存中数据位0,然后i++,线程A运行比较慢,线程B把1写入内存,然后有一个线程C,读取内存中数据位1,进行i–操作,然后把0写入内存,这个时候线程A才运行完毕,然后读取内存中数据位0,认为没有发生修改,则把1写入数据。
这个时候线程A认为内存中0的数据没有修改,写入内存了,但是这个数据确实发生了修改。这就是ABA问题
解决方案:
不管
这个一个值,我不在在乎,你想改就改,我要的是最终的值
添加版本
这是一个引用,应用的地址没有发生改 ...
JOL使用
查看普通java对象的内部布局工具JOL(JAVA OBJECT LAYOUT)
使用此工具可以查看new出来的一个java对象的内部布局,以及一个普通的java对象占用多少字节。
导入依赖或者jar包
可以选择导入pom依赖
12345678<!-- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core --><dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.9</version> <scope>provided</scope></dependency>
可以使用jar包
地址:https://mvnrepository.com/artifact/org.openjdk.jol/jol-core/0.9
使用12345 ...
hospot虚拟机中的synchronized底层实现
概述synchronized作用
原子性:synchronized保证语句块内操作是原子的
可见性:synchronized保证可见性(通过“在执行unlock之前,必须先把此变量同步回主内存”实现)
有序性:synchronized保证有序性(通过“一个变量在同一时刻只允许一条线程对其进行lock操作”)
synchronized的使用
修饰实例方法,对当前实例对象加锁
修饰静态方法,多当前类的Class对象加锁
修饰代码块,对synchronized括号内的对象加锁
用户态和内核态内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序。
用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被剥夺,cpu资源可以被其他程序获取。
为什么要有用户态和内核态?
在最初的时候,没有这样的权限划分,程序可以访问所有的内容,这样很容易就直接把系统卡死,影响其他程序的运行,所以后来添加了访问限制。
由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划 ...
ReentrantLock底层实现原理
前言Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到原理层,并通过ReentrantLock的基本特性和ReentrantLock与AQS的关联,来深入解读AQS相关独占锁的知识点,同时采取问答的模式来帮助大家理解AQS。由于篇幅原因,本篇文章主要阐述AQS中独占锁的逻辑和Sync Queue,不讲述包含共享锁和Condition Queue的部分(本篇文章核心为AQS原理剖析,只是简单介绍了ReentrantLock,感兴趣同学可以阅读一下ReentrantLock的源码)。
1 ReentrantLock1.1 ReentrantLock特性概览ReentrantLock意思为可重入锁,指的是一个线程能够对一个临界资源重复加锁。为了帮助大家更好地理解ReentrantLock的特性,我们先将ReentrantLock跟常用的Synchronized进行比较,其 ...