Scala基础-1
Scala基础Scala 入门概述为什么学习 Scala
Spark—新一代内存级大数据计算框架,是大数据的重要内容。
Spark就是使用Scala编写的。因此为了更好的学习Spark, 需要掌握Scala这门语言。
Spark的兴起,带动Scala语言的发展!
Scala 发展历史联邦理工学院的马丁·奥德斯基(Martin Odersky)于2001年开始设计Scala。
马丁·奥德斯基是编译器及编程的狂热爱好者,长时间的编程之后,希望发明一种语言,能够让写程序这样的基础工作变得高效,简单。所以当接触到JAVA语言后,对JAVA这门便携式,运行在网络,且存在垃圾回收的语言产生了极大的兴趣,所以决定将函数式编程语言的特点融合到JAVA中,由此发明了两种语言(Pizza & Scala)。
Pizza和Scala极大地推动了Java编程语言的发展。
JDK5.0 的泛型、增 强for循 环、自动类型转换等,都是从Pizza引入的新特性。
JDK8.0 的类型推断、Lambda表达式就是从Scala引入的特性。
JDK5.0和JDK8.0的编辑器就是马丁·奥德斯基写的 ...
Scala基础-2
Scala基础-2面向对象Scala 的面向对象思想和 Java 的面向对象思想和概念是一致的。
Scala 中语法和 Java 不同,补充了更多的功能。
Scala 包
基本语法
package 包名
Scala 包的三大作用(和 Java 一样)
区分相同名字的类
当类很多时,可以很好的管理类
控制访问范围
包的命名命名规则
只能包含数字、字母、下划线、小圆点.,但不能用数字开头,也不要使用关键字。
案例实操
12demo.class.exec1 //错误,因为 class 关键字demo.12a //错误,数字开头
命名规范
12一般是小写字母+小圆点com.公司名.项目名.业务模块名
案例实操
123com.atguigu.oa.model com.atguigu.oa.controllercom.sohu.bank.order
包说明(包语句)
说明
Scala 有两种包的管理风格,一种方式和 Java 的包管理风格相同,每个源文件一个包(包名和源文件所在路径不要求必须一致),包名用“.”进行分隔以表示包的层级关系,如com.atguigu.scala。 ...
无题
Spark基础-2SparkSQLSparkSQL 概述SparkSQL 是什么
Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。
Hive and SparkSQLSparkSQL 的前身是 Shark,给熟悉 RDBMS 但又不理解 MapReduce 的技术人员提供快速上手的工具。
Hive 是早期唯一运行在 Hadoop 上的 SQL-on-Hadoop 工具。但是 MapReduce 计算过程中大量的中间磁盘落地过程消耗了大量的 I/O,降低的运行效率,为了提高 SQL-on-Hadoop的效率,大量的 SQL-on-Hadoop 工具开始产生,其中表现较为突出的是
Drill
Impala
Shark
其中 Shark 是伯克利实验室 Spark 生态环境的组件之一,是基于 Hive 所开发的工具,它修改了下图所示的右下角的内存管理、物理计划、执行三个模块,并使之能运行在 Spark 引擎上。
Shark 的出现,使得 SQL-on-Hadoop 的性能比 Hive 有了 10-100 倍的提 ...
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';
注意:分区字段不能是表中已经存在的数据,可以将分区字段看作表的伪列。
加载数据到分 ...
Kafka基础
Kafka 概述定义Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。
消息队列传统消息队列的应用场景
使用消息队列的好处
解耦
允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
可恢复性
系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
缓冲
有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。
灵活性 & 峰值处理能力
在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。
异步通信
很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
消息队 ...
HBase基础
HBase简介HBase 定义HBase 是一种分布式、可扩展、支持海量数据存储的 NoSQL 数据库。
HBase 数据模型逻辑上,HBase 的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase 的底层物理存储结构(K-V)来看,HBase 更像是一个 multi-dimensional map。
HBase 逻辑结构
HBase 物理存储结构
数据模型
Name Space
命名空间,类似于关系型数据库的 DatabBase 概念,每个命名空间下有多个表。HBase 有两个自带的命名空间,分别是 hbase 和 default,hbase 中存放的是 HBase 内置的表,default 表是用户默认使用的命名空间。
Region
类似于关系型数据库的表概念。不同的是,HBase 定义表时只需要声明列族即可,不需要声明具体的列。这意味着,往 HBase 写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBase 能够轻松应对字段变更的场景。
Row
HBase 表中的每行数据都由一个 RowKey 和多个 Column(列)组 ...
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
深入理解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 ...
深入理解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 ...
多线程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.synchronized 关键字
1.1.说一说自己对于 synchronized 关键字的了解synchronized 关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。
另外,在 Java 早期版本中,synchronized 属于 重量级锁,效率低下。
为什么呢?
因为监视器锁(monitor)是依赖于底层的操作系统的 Mutex Lock 来实现的,Java 的线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操作系统实现线程之间的切换时需要从用户态转换到内核态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高。
庆幸的是在 Java 6 之后 Java 官方对从 JVM 层面对 synchronized 较大优化,所以现在的 synchronized 锁效率也优化得很不错了。JDK1.6 对锁的实现引入了大量的优化,如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。
所以,你会发现目前的话,不论是各种开源框 ...
hospot虚拟机中的synchronized底层实现
概述synchronized作用
原子性:synchronized保证语句块内操作是原子的
可见性:synchronized保证可见性(通过“在执行unlock之前,必须先把此变量同步回主内存”实现)
有序性:synchronized保证有序性(通过“一个变量在同一时刻只允许一条线程对其进行lock操作”)
synchronized的使用
修饰实例方法,对当前实例对象加锁
修饰静态方法,多当前类的Class对象加锁
修饰代码块,对synchronized括号内的对象加锁
用户态和内核态内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序。
用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被剥夺,cpu资源可以被其他程序获取。
为什么要有用户态和内核态?
在最初的时候,没有这样的权限划分,程序可以访问所有的内容,这样很容易就直接把系统卡死,影响其他程序的运行,所以后来添加了访问限制。
由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划 ...
偏向锁四秒延迟探究
在项目中发现偏向锁并不是立即生效的,而是有着一个默认延迟,下面深入探究一下,为什么偏向锁有着四秒延迟,以及怎么调优
问题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 ...
volatile的底层实现
知识点计算机组成
cpu读取数据
三级缓存
cpu读取数据的时候,先从寄存器中读取数据,如果没有然后从L1(一级缓存)中读取数据,如果没有然后从L2(二级缓存总读取数据),如果没有然后从L3中读取数据,L3中没有,从内存中读取数据,内存中还没有从磁盘中读取数据,拿到数据后在一级一级放回(L3到L2到L1到寄存器)
cpu线程切换
每个线程独占cpu寄存器中的数据,当第二个线程执行的之后,把寄存器中的数据保存起来,然后读取第二个线程的数据到寄存器,然后执行第二个线程
一核两线程cpu是,一核内有两个寄存器,在两个线程切换的时候,不需要切换寄存器中的数据
cpu缓存意义
时间局部性:如果某个数据被访问,那么在不久的将来它很有可能会被再次访问。
空间局部性:如果某个数据被访问,那么与它相邻的数据很快也能被访问。
缓存行
按块预读取(也叫缓存行)(cache line)缓存在读取的数据的时候并不是只拿需要的数据,这样缓存的意义也就没有了,获取一个数据的时候,其周边的数据也会顺便拿过来,这如果当这个数据执行完成后,马上会旁边的数据的情况下,可以立即从最近的缓存中直接拿到,而不用 ...