<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[takeuherat的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/takeuherat</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; takeuherat]]></copyright><item><title><![CDATA[Spark知识点]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/113827932</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/113827932</guid><author>takeuherat</author><pubDate>Tue, 16 Feb 2021 20:21:05 +0800</pubDate><description><![CDATA[Spark知识点
1.Spark的使用场景
Spark官网给出的说法：Spark是一个通用的快速分析引擎。Spark为我们常见的批处理、流处理、数据探索(数据挖掘)、机器学习等场景提供了很好的解决方案，任何有数据分析需求的人都可以使用。
2.“三架马车”
从 2003 年到 2006 年，Google 分别在 ODSI 与 SOSP 发表了 3 篇论文，引起了业界对于分布式系统的广泛讨论，这三篇论文分别是：
SOSP2003：The Google File System；             分布式文件]]></description><category></category></item><item><title><![CDATA[常用的数据结构]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/107598136</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/107598136</guid><author>takeuherat</author><pubDate>Sun, 26 Jul 2020 19:21:38 +0800</pubDate><description><![CDATA[常用的数据结构
字符串
​	在了解什么是字符串之前我们先了解什么是字符。数字、字母、字、符号等等都是字符，如8、H、h、国、&amp;等。将字符连接起来便成了字符串。
存储方式

顺序存储，字符串的顺序存储结构，是用一组地址连续的存储单元来存储串中的字符序列，一般是用定长数组来实现。有些语言会在串值后面加一个不计入串长度的结束标记符，比如 \0 来表示串值的终结。
链式存储，字符串的链式存储结构，与线性表是相似的，但由于串结构的特殊性（结构中的每个元素数据都是一个字符），如果也简单地将每个链结点存储为一个字]]></description><category></category></item><item><title><![CDATA[Hive优化整理]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/107554587</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/107554587</guid><author>takeuherat</author><pubDate>Fri, 24 Jul 2020 10:01:40 +0800</pubDate><description><![CDATA[Hive优化整理
压缩格式
​	常见的压缩格式有Sequence File、RC、ORC、Parquet。生产环境中hive一般用orc，spark一般用parquet，snappy配合parquet性能最高。
注意点
1）orc格式的表不能通过load data导入数据
2）Sequence 可分割，与hadoop文件兼容
3）ORC快速存取，列压缩
Hive函数
内置函数
1.NVL( value，default_value) ，给值为 NULL 的数据赋值
2.CASE WHEN THEN ELSE ]]></description><category></category></item><item><title><![CDATA[Java并发编程—AQS、final]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/107234264</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/107234264</guid><author>takeuherat</author><pubDate>Thu, 09 Jul 2020 17:47:30 +0800</pubDate><description><![CDATA[Java并发编程—AQS、final
AQS
​	AQS 是一个用于构建锁、同步器等线程协作工具类的框架，有了 AQS 以后，很多用于线程协作的工具类就都可以很方便的被写出来，有了 AQS 之后，可以让更上层的开发极大的减少工作量，避免重复造轮子，同时也避免了上层因处理不当而导致的线程安全问题，因为 AQS 把这些事情都做好了。总之，有了 AQS 之后，我们构建线程协作工具类就容易多了。
​	AQS 最核心的三大部分就是状态、队列和期望协作工具类去实现的获取/释放等重要方法。
state状态
在 AQS 中]]></description><category></category></item><item><title><![CDATA[Java并发编程—CAS、死锁]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/107232854</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/107232854</guid><author>takeuherat</author><pubDate>Thu, 09 Jul 2020 16:57:48 +0800</pubDate><description><![CDATA[Java并发编程—CAS、死锁
它的英文全称是 Compare-And-Swap，中文叫做“比较并交换”，它是一种思想、一种算法。
在多线程的情况下，各个代码的执行顺序是不能确定的，所以为了保证并发安全，我们可以使用互斥锁。而 CAS 的特点是避免使用互斥锁，当多个线程同时使用 CAS 更新同一个变量时，只有其中一个线程能够操作成功，而其他线程都会更新失败。不过和同步互斥锁不同的是，更新失败的线程并不会被阻塞，而是被告知这次由于竞争而导致的操作失败，但还可以再次尝试。
CAS 被广泛应用在并发编程领域中，以]]></description><category></category></item><item><title><![CDATA[Java并发编程—Java内存模型]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/107225087</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/107225087</guid><author>takeuherat</author><pubDate>Thu, 09 Jul 2020 11:44:13 +0800</pubDate><description><![CDATA[Java并发编程—Java内存模型
JVM内存模型和Java内存模型

JVM 内存结构和 Java 虚拟机的运行时区域有关；
Java 内存模型和 Java 的并发编程有关。

Java 非常需要一个标准，来让 Java 开发者、编译器工程师和 JVM 工程师能够达成一致。达成一致后，我们就可以很清楚的知道什么样的代码最终可以达到什么样的运行效果，让多线程运行结果可以预期，这个标准就是 JMM，这就是需要 JMM 的原因。
JMM
​	JMM 是和多线程相关的一组规范，需要各个 JVM 的实现来遵守 JM]]></description><category></category></item><item><title><![CDATA[Java并发编程—线程协作]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/107223751</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/107223751</guid><author>takeuherat</author><pubDate>Thu, 09 Jul 2020 11:02:04 +0800</pubDate><description><![CDATA[Java并发编程—线程协作
Semaphore 信号量
​	信号量的一个最主要的作用就是，来控制那些需要限制并发访问量的资源。具体来讲，信号量会维护“许可证”的计数，而线程去访问共享资源前，必须先拿到许可证。线程可以从信号量中去“获取”一个许可证，一旦线程获取之后，信号量持有的许可证就转移过去了，所以信号量手中剩余的许可证要减一。
使用流程
首先初始化一个信号量，并且传入许可证的数量，这是它的带公平参数的构造函数：public Semaphore(int permits, boolean fair)，传入两]]></description><category></category></item><item><title><![CDATA[Java并发编程—ThreadLocal、Future]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/107220440</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/107220440</guid><author>takeuherat</author><pubDate>Thu, 09 Jul 2020 09:17:16 +0800</pubDate><description><![CDATA[Java并发编程—ThreadLocal、Future
ThreadLocal使用场景
场景1，ThreadLocal 用作保存每个线程独享的对象，为每个线程都创建一个副本，每个线程都只能修改自己所拥有的副本, 而不会影响其他线程的副本，这样就让原本在并发情况下，线程不安全的情况变成了线程安全的情况。
这种场景通常用于保存线程不安全的工具类，典型的需要使用的类就是 SimpleDateFormat。
场景2，ThreadLocal 用作每个线程内需要独立保存信息的场景，供其他方法更方便得获取该信息，每个线程]]></description><category></category></item><item><title><![CDATA[Java并发编程—原子类]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/107208940</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/107208940</guid><author>takeuherat</author><pubDate>Wed, 08 Jul 2020 16:29:23 +0800</pubDate><description><![CDATA[Java并发编程—原子类
原子类
​	在编程领域里，原子性意味着“一组操作要么全都操作成功，要么全都失败，不能只操作成功其中的一部分”。而 java.util.concurrent.atomic 下的类，就是具有原子性的类，可以原子性地执行添加、递增、递减等操作。比如之前多线程下的线程不安全的 i++ 问题，到了原子类这里，就可以用功能相同且线程安全的 getAndIncrement 方法来优雅地解决。
​	原子类的作用和锁有类似之处，是为了保证并发情况下线程安全。不过原子类相比于锁，有一定的优势：

粒度]]></description><category></category></item><item><title><![CDATA[Java并发编程—阻塞队列]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/107205203</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/107205203</guid><author>takeuherat</author><pubDate>Wed, 08 Jul 2020 14:28:37 +0800</pubDate><description><![CDATA[Java并发编程—阻塞队列
并发队列

​	Java 提供的线程安全的队列（也称为并发队列）分为阻塞队列和非阻塞队列两大类。
​	阻塞队列的典型例子就是 BlockingQueue 接口的实现类，BlockingQueue 下面有 6 种最主要的实现，分别是 ArrayBlockingQueue(有界)、LinkedBlockingQueue(无界)、SynchronousQueue、DelayQueue、PriorityBlockingQueue 和 LinkedTransferQueue
​	非阻塞并发]]></description><category></category></item><item><title><![CDATA[Java并发编程—并发容器]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/107178305</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/107178305</guid><author>takeuherat</author><pubDate>Tue, 07 Jul 2020 11:44:46 +0800</pubDate><description><![CDATA[Java并发编程—并发容器
HashMap是线程不安全的
public V put(K key, V value) {
    if (key == null)
        return putForNullKey(value);
    int hash = hash(key.hashCode());
    int i = indexFor(hash, table.length);
    for (Entry&lt;K,V&gt; e = table[i]; e != null; e = e.ne]]></description><category></category></item><item><title><![CDATA[Java并发编程基础—锁]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/107149611</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/107149611</guid><author>takeuherat</author><pubDate>Mon, 06 Jul 2020 09:07:49 +0800</pubDate><description><![CDATA[Java并发编程基础—锁
锁的7大分类


偏向锁/轻量级锁/重量级锁；特指 synchronized 锁的状态，通过在对象头中的 mark word 来表明锁的状态
1）如果锁没有竞争，就不需要上锁了，打个标记即可，这就是偏向锁
2）不存在实际竞争，或者竞争时间很短，用CAS就可以解决，这就是轻量级锁
3）开销较大，会让申请却拿不到锁的进程陷入阻塞状态
锁升级的路径：无锁→偏向锁→轻量级锁→重量级锁。


可重入锁/非可重入锁；
1）可重入锁指的是线程当前已经持有这把锁了，能在不释放这把锁的情况下，再次获]]></description><category></category></item><item><title><![CDATA[Java并发编程基础—线程池]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/107107353</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/107107353</guid><author>takeuherat</author><pubDate>Fri, 03 Jul 2020 15:49:09 +0800</pubDate><description><![CDATA[Java并发编程基础—线程池
如果每个任务都创建一个线程会带来哪些问题？
第一点，反复创建线程系统开销比较大，每个线程创建和销毁都需要时间，如果任务比较简单，那么就有可能导致创建和销毁线程消耗的资源比线程执行任务本身消耗的资源还要大。
第二点，过多的线程会占用过多的内存等资源，还会带来过多的上下文切换，同时还会导致系统不稳定。
使用线程池的好处
第一点，线程池可以解决线程生命周期的系统开销问题，同时还可以加快响应速度。因为线程池中的线程是可以复用的，我们只用少量的线程去执行大量的任务，这就大大减小了线程生命]]></description><category></category></item><item><title><![CDATA[Java并发编程基础—线程安全]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/107068284</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/107068284</guid><author>takeuherat</author><pubDate>Wed, 01 Jul 2020 17:26:18 +0800</pubDate><description><![CDATA[Java并发编程基础—线程安全
​	《Java Concurrency In Practice》的作者 Brian Goetz 对线程安全是这样理解的，当多个线程访问一个对象时，如果不用考虑这些线程在运行时环境下的调度和交替执行问题，也不需要进行额外的同步，而调用这个对象的行为都可以获得正确的结果，那这个对象便是线程安全的。
3种典型的线程安全问题
1）运行结果错误；
2）发布和初始化导致线程安全问题；
3）活跃性问题。

死锁，死锁是指两个线程之间相互等待对方资源，但同时又互不相让，都想自己先执行
活锁，]]></description><category></category></item><item><title><![CDATA[Java并发编程—线程基础]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/107065426</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/107065426</guid><author>takeuherat</author><pubDate>Wed, 01 Jul 2020 15:47:34 +0800</pubDate><description><![CDATA[Java并发编程—线程基础
线程的实现方式
1）实现Runnable接口
2）继承Thread类
3）线程池，默认采用 DefaultThreadFactory ，它会给线程池创建的线程设置一些默认值，最终是通过Thread类创建线程的
4）实现Callable接口，Callable 和与之相关的 Future、FutureTask，它们可以把线程执行的结果作为返回值返回
5）定时器Timer
。。。。。。
实现线程的本质
Runnable实现线程需要调用start()方法，它的本质也是调用run()方法
]]></description><category></category></item><item><title><![CDATA[JVM虚拟机—G1回收器]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/107015396</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/107015396</guid><author>takeuherat</author><pubDate>Mon, 29 Jun 2020 10:40:26 +0800</pubDate><description><![CDATA[JVM虚拟机—G1回收器
CMS有一个极端的场景(也是经常出现的场景)。
​	在发生 Minor GC 时，由于 Survivor 区已经放不下了，多出的对象只能提升（promotion）到老年代。但是此时老年代因为空间碎片的缘故，会发生 concurrent mode failure 的错误。这个时候，就需要降级为 Serail Old 垃圾回收器进行收集。这就是比 concurrent mode failure 更加严重的 promotion failed 问题。一次简单的 Major GC，竟然能演化]]></description><category></category></item><item><title><![CDATA[JVM虚拟机—垃圾回收]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/107014493</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/107014493</guid><author>takeuherat</author><pubDate>Mon, 29 Jun 2020 10:06:05 +0800</pubDate><description><![CDATA[JVM虚拟机—垃圾回收
标记
根据 GC Roots 遍历所有的可达对象，这个过程，就叫作标记。
清除
清除阶段就是把未被标记的对象回收掉。但是这种简单的清除方式，有一个明显的弊端，那就是碎片问题。
复制
​	提供一个对等的内存空间，将存活的对象复制过去，然后清除原内存空间。在程序设计中，一般遇到扩缩容或者碎片整理问题时，复制算法都是非常有效的。比如：HashMap 的扩容也是使用同样的思路，Redis 的 rehash 也是类似的。但是，它的弊端也非常明显。它浪费了几乎一半的内存空间来做这个事情，如果资源]]></description><category></category></item><item><title><![CDATA[JVM虚拟机—OOM]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/106999556</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/106999556</guid><author>takeuherat</author><pubDate>Sun, 28 Jun 2020 15:13:54 +0800</pubDate><description><![CDATA[JVM虚拟机—OOM
JVM 是如何判断哪些对象应该被回收？哪些应该被保持呢？
JVM 的 GC 动作，是不受程序控制的，它会在满足条件的时候，自动触发。
在发生 GC 的时候，一个对象，JVM 总能够找到引用它的祖先。找到最后，如果发现这个祖先已经名存实亡了，它们都会被清理掉。而能够躲过垃圾回收的那些祖先，比较特殊，它们的名字就叫作 GC Roots。
从 GC Roots 向下追溯、搜索，会产生一个叫作 Reference Chain 的链条。当一个对象不能和任何一个 GC Root 产生关系时，就会被]]></description><category></category></item><item><title><![CDATA[JVM虚拟机—字节码]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/106998463</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/106998463</guid><author>takeuherat</author><pubDate>Sun, 28 Jun 2020 14:35:41 +0800</pubDate><description><![CDATA[JVM虚拟机—字节码
工具


javap
javap 是 JDK 自带的反解析工具。它的作用是将 .class 字节码文件解析成可读的文件格式。javac中可以指定一些额外内容输出到字节码。

javac -g:lines 强制生成 LineNumberTable。
javac -g:vars  强制生成 LocalVariableTable。
javac -g 生成所有的 debug 信息。



jclasslib
jclasslib 是一个图形化的工具，能够更加直观的查看字节码中的内容。它还分门别类]]></description><category></category></item><item><title><![CDATA[JVM虚拟机—类加载机制]]></title><link>https://blog.youkuaiyun.com/takeuherat/article/details/106992312</link><guid>https://blog.youkuaiyun.com/takeuherat/article/details/106992312</guid><author>takeuherat</author><pubDate>Sun, 28 Jun 2020 09:16:08 +0800</pubDate><description><![CDATA[JVM虚拟机—类加载机制
类加载过程
类的加载很复杂，主要有几个过程：加载、验证、准备、解析、初始化


加载
加载是将外部的.class文件加载到java的方法区内。


验证
验证是为了防止恶意代码，如果代码不符合规范，会抛出 java.lang.VerifyError异常。像低版本的JVM是无法加载高版本的类库的


准备
将为一些类变量分配内存，并将其初始化为默认值。此时，实例对象还没有分配内存。这些动作都是在方法区上的


解析
解析是将符号引用替换为直接引用的过程。这个阶段都做了哪些工作呢？大体]]></description><category></category></item></channel></rss>