hive培训
hive 目前最好用的大数据sql引擎

cascade关键字  百度查询。
hive的common join
map join 速度快,数据量过大时容易报错。
HQL的优化 尽量多使用分区键
带分区条件的时候,将分区条件放在on中
或者使用子查询
hive尽量少用count(distinct[column]) 由于这个操作会用一个reduce task操作,这个reduce处理的数据量太大,就会导致整个job很那完成,一般先使用group by 再count。

数据倾斜
由于本地读写数据量很大;导致数据倾斜的操作:group by,count,distinct,join 原因:key 分布不均匀,业务数据的本身特点。

使用count,distinct个group by造成的数据倾斜
存在大量空值或null,或者某一个值得记录特别多,可以先把该值过滤掉。

hive排错
1、找application id

msck  元数据修复

--map-column-java.id=string

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
深入理解JVM
JAVA字节码是在JRE中运行,(JRE:JAVA运行时环境)。JVM则是JRE中的核心组成部分,分析和执行JAVA字节码。
JRE由JAVA API和JVM组成,JVM通过类加载器加载JAVA应用,并通过JAVA API进行执行。
虚拟机是通过软件模拟物理机器执行程序的执行器。
JVM的基本特性:
    1、基于栈的虚拟机:不同于Intel X86和ARM等比较流行的计算机处理器都是基于寄存器架构,JVM是基于栈执行的。
    2、符号引用:除基本类型外的所有JAVA类型(类和接口)都是通过符号引用取得关联的,而非显示的基于内存地址的引用。
    3、垃圾回收机制:类的实例通过用户代码进行显式创建,通过垃圾回收机制自动销毁。
    5、网络字节型:class文件的二进制表示使用的是基于网络的字节序。jvm使用了网络传输协议中使用的网络字节型,也就是基于大端的字节序。
JVM代码执行过程:
    1、层次结构:Java的类加载器是父子关系的层次结构组织的。BootStrap类加载器处于层次结构的顶层,是所有类加载器的父类。    2、代理模型:基于类加载器的层次组织结构,类加载器之间是可以进行代理的。当一个类需要被加载,会先去请求父加载器判断该类是否已经被加载。如果父类加载器已经加载了该类,那它就可以直接使用而无需再次加载。如果尚未加载,才需要当前类加载器来加载此类。
    3、可见性限制:子类加载器可以从父类加载器中获取类,反正则不行。
    4、不能卸载:类加载器可以载入类却不能卸载它。 但是可以通过删除类加载器的方式卸载类。
    
注意:每个类加载器都有自己的空间,用于存储其加载的信息。当类加载器需要加载一个类的时候,它通过FQCN(全限定类名)的方式在自己的存储空间中监测此类是否存在。在JVM中,即时具有相同FQCN的类,但是出现在了不同的类加载空间,也会被认为是不同的。存在于不同的空间也就意味着是由不同的类加载器加载的。

类加载器的代理模型:
当JVM请示类加载器需要加载一个类的时候,加载器总是按照从类加载器缓存,父类加载器以及自己加载器的顺序查找和加载类。逐层判断,直到BootStrap类加载器都不存在该类,那么当前加载器就会从文件系统中找到类文件进行加载。
    1、BootStrap加载器:BootStrap加载器在运行JVM的时候创建,用于加载Java APIs,包括Object类。BootStrap类加载器是由native代码实现的,其他类加载器是由Java代码实现。
    2、扩展加载器:扩展加载器用于加载除基本Java Apis以外的扩展类,也用于加载各种安全扩展功能。
    3、系统加载器:系统加载器会加载用户指定的classpath里的类,BootStrap加载器、扩展加载器用于加载JVM运行的组件。
    4、用户自定义加载器:这个是由用户自定义的类加载器。
注意:开发者可以使用自定义的类加载器将web应用和企业级应用隔离开,使其在各自的类加载空间运行。使用的就是加载的层次结构原理。
 
类加载步骤:
    1、加载:从文件中获取类文件并加入到JVM内存空间。
    2、验证:验证载入的类是否符合Java语言规范和JVM规范。(最耗时)
    3、准备:根据内存需求准备相应的数据结构,并分别描述出类中定义的字段、方法以及实现的接口信息。
    4、解析:把类常量池中所有的符号引用转换为直接引用。
    5、初始化:为类的变量初始化合适的值。执行静态初始化域,并为静态字段初始化相应的值。
    
运行时数据区结构:
    运行时数据区是JVM程序运行时在操作系统上分配的内存区域。运行时数据区又可细分为6个部分。即:为每个线程分别创建的PC寄存器、JVM栈、本地方法栈和被所有线程共用的数据堆、方法区和运行时。
    1、PC寄存器:每个线程都有一个PC寄存器,并跟随线程的启动而创建。PC寄存器中有即将执行的JVM指定的地址。
    2、JVM栈:每个线程都有一个JVM栈。并跟随线程的启动而创建。存储的数据元素为栈桢。
    3、本地方法栈:不是JAVA编写的本地代程定义的栈空间。
    4、方法区:被所有线程共用的内存空间。存储了运行时常量池、字段和方法信息、静态变量以及被JVM载入的所有类和接口的方法的字节码。
    5、运行时常量池:存储了类文件格式中的常量池表的内存空间。
    6、数据堆:堆中存储着所有的类实例或对象,并且也是垃圾回收的目标场所。当涉及到JVM性能优化时,通常也会提及到数据堆空间的大小设置。
    
Java编译器和即时编译器:
    JVM规范中没有强行约束执行引擎如何运行,所以不同的JVM在实现各种的执行引擎时通过各种方式引入各种即时编译器来提升性能。