1、滴滴大数据面试题课程目标l 掌握僵尸进程和孤儿进程l 掌握jvm内存布局l 掌握双亲委派l 掌握用堆取最大K个数l 掌握hdfs小文件优化方法l 掌握hive如何进行权限控制l 掌握flink的集群角色目录Java与数据结构3有一百个用户同时买一件商品,如何保证请求的顺序性3讲一下僵尸进程与孤儿进程4讲一下fork函数的底层实现过程5JVM内存布局6什么情况发生栈溢出8讲一下双亲委派模型,以及其优点9算法11手写算法堆相关,取最大的K个数11如何解决过拟合问题?14L1和L2正则的区别,如何选择L1和L2正则?14Hadoop15Yarn中的appmaster down掉怎么办?15mapre
2、duce 跑的慢的原因?18HDFS小文件优化方法19HDFS的数据压缩算法?及每种算法的应用场景?20Hive22请说明hive中 Sort By,Order By,Cluster By,Distrbute By各代表什么意思?22Hive底层与数据库交互原理?23Hive如何进行权限控制?25HiveSQL笔试题27Spark28设置Application的并行度28Spark提交作业参数30对于 Spark 中的数据倾斜问题你有什么好的方案?30Flink33Flink的组件栈有哪些33你们的Flink集群规模多大?35Flink的基础编程模型了解吗35Flink集群有哪些角色?各自有什
3、么作用37其他大数据组件38设计一个大型网站架构,尽可能的全面详细。38简述HBase中compact用途是什么,什么时候触发,分为哪两种,有什么区别,有哪些相关配置参数?40给定 a、b 两个文件,各存放 50 亿个 url,每个 url 各占 64 字节,内存限制是 4G,让你找出 a、b 文件共同的 url?43每天百亿数据存入HBase,如何保证数据的存储正确和在规定的时间里全部录入完毕,不残留数据?44请列举几个HBase优化方法?45kafka数据丢失问题,及如何保证46Java与数据结构有一百个用户同时买一件商品,如何保证请求的顺序性问题分析类似一个秒杀的场景分析题,考查并发量高
4、的时候保证操作不会覆盖,其实也就是保证原子性。可以往有原子性功能的一些工具思考,例如:solr,es,Redis等等。核心讲解使用Redis的原子性来解决这种需求,因为如果使用常见的java处理会覆盖操作。总结: 用java读取Redis数据再做set方法修改数据无法保证有序性。而使用redis的incr可以保证高并发的情况下,例如100个用户秒杀一件产品,原子性操作让高并发成为串行,从而保证请求的有序性。问题扩展Redis的原子性如何保证?Redis 提供了 INCR/DECR/SETNX 命令,把R(读)、M(自增)、W(写)三个操作转变为一个原子操作 Redis 是使用单线程串行处理客户
5、端的请求来操作命令,所以当 Redis 执行某个命令操作时,其他命令是无法执行的,这相当于命令操作是互斥执行的。结合项目使用在反爬虫项目中就用到Redis做爬虫ip的缓存数据库,对爬虫ip个数的统计就可以用到Redis的incr操作。讲一下僵尸进程与孤儿进程问题分析考查对僵尸进程的了解程度核心讲解正常情况下,子进程是通过父进程创建的,子进程再创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。孤儿进程:一个父进程退出,而它的一个或
6、多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程控制块(PCB)仍然保存在系统中。这种进程称之为僵死进程僵尸进程会造成资源的浪费,所以我们需要避免僵尸进程的产生,所以需要在父进程调用wait()或者waitpid()函数来释放掉子进程的退出信息。僵尸进程的处理方法就是干掉父进程,这样僵尸进程就会变成孤儿进程。问题扩展僵尸进程的解决方法(1)通过信号机制子进程退出时向父进程
7、发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵尸进程。测试程序如下所示:(2)fork两次fork两次并杀死一级子进程,令二级子进程成为孤儿进程而被init所“收养”、清理.讲一下fork函数的底层实现过程问题分析考查对fork函数的理解核心讲解fork函数在底层到底做了什么呢?Linux平台通过clone()系统调用实现fork()。 fork(),vfork()和_clone()库函数都根据各自需要的参数标志去调用clone(),然后由clone()去调用do_fork(), 再然后do_fork()完成了创建中的大部分工作,该函数调用co
8、py_process().做最后的那部分工作。fork()系统调用通过复制一个现有进程来创建一个全新的进程。进程被存放在一个叫做任务队列的双向循环链表当中,链表当中的每一项都是类型为task_struct称为进程描述符的结构.问题扩展fork和vfork的区别(1)fork:子进程拷贝父进程的代码段和数据段vfork:子进程和父进程共享代码段和数据段(2)fork中父子进程的先后运行次序不定vfork:保证子进程先运行,子进程exit后父进程才开始被调度运行(3) vfork ()保证子进程先运行,在她调用exec 或exit 之后父进程才可能被调度运行。如果在 调用这两个函数之前子进程依赖于
9、父进程的进一步动作,则会导致死锁。(4)就算fork实现了写时拷贝,但其效率仍然没有vfork高,但是vfork在一般平台上都存在问题,所以一般不推荐使用JVM内存布局问题分析考查对jvm结构的了解情况核心讲解1)JVM内存区域分为方法去、虚拟机栈、本地方法栈、堆、程序计数器方法区:也称永久代” 、“非堆”, 它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域虚拟机栈:描述的是Java 方法执行的内存模型:每个方法被执行的时候 都会创建一个“栈帧”用于存储局部变量表(包括参数)、操作栈、方法出口等信息本地方法栈:与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的java方法
10、服务,而本地方法栈则是为Native方法服务堆:也叫做java 堆、GC堆是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,在JVM启动时创建。程序计数器:是最小的一块内存区域,它的作用是当前线程所执行的字节码的行号指示器。2)堆: JVM中共享数据空间可以分成三个大区,新生代(Young Generation)、老年代(Old Generation)、永久代(Permanent Generation),其中JVM堆分为新生代和老年代; 新生代可以划分为三个区,Eden区(存放新生对象),两个幸存区(From Survivor和To Survivor)(存放每次垃
11、圾回收后存活的对象); 永久代管理class文件、静态对象、属性等(JVM uses a separate region of memory, called the Permanent Generation (orPermGen for short), to hold internal representations of java classes. PermGen is also used to store more information );d.JVM垃圾回收机制采用“分代收集”:新生代采用复制算法,老年代采用标记清理算法。栈溢出什么情况发生栈溢出问题分析考查对栈溢出的掌握程度核心讲解最
12、常见的就是递归。每次递归就相当于调用一个函数,函数每次被调用时都会将局部数据(在函数内部定义的变量、参数、数组、对象等)放入栈中。递归1000次,就会将1000份这样的数据放入栈中。这些数据占用的内存直到整个递归结束才会被释放,在递归过程中只会累加,不会释放。如果递归次数过多,并且局部数据也多,那么会使用大量的栈内存,很容易就导致栈溢出了。在函数内部定义超大数组也会导致栈溢出,例如定义一个 1024 * 1024 的 int 类型的二维数组,就需要 4M 的内存,这在 VS/VC 下就会发生栈溢出。总结栈容易溢出是因为栈内存有限,一般就几兆。问题扩展怎么避免栈溢出?如果写了不能迅速收敛的递归,
13、则很有可能引发栈溢出的错误,如下所示:package com.lovo; public class StackOverflowErrorTest public static void main(String args) main(null); 因此,用递归编写程序时一定要牢记两点:1. 递归公式;2. 收敛条件(什么时候就不再递归而是回溯了)。讲一下双亲委派模型,以及其优点问题分析考查对双亲委派模型的理解程度核心讲解l 基本概念双亲委派模型是Java加载类的机制.采用双亲委派模型的好处是Java类随着它的类加载器一起具备了一种带有优先级的层级关系,通过这种层级关系可以避免类的重复加载.l 原理
14、如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载。l 优势1 采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。 2 其次是考虑到安全因素,java核心api中定义类型不会被随意替换,假设通过网络传递一个名
15、为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改。算法手写算法堆相关,取最大的K个数问题分析考查用堆算法取TopN,转换思路就是排序取前N个值核心讲解堆积排序(Heapsort)是指利用堆积树(堆)这种资料结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。堆排序是不稳定的排序方法,辅助空间为O(1), 最坏时间复杂度为O(nlo
16、g2n) ,堆排序的堆序的平均性能较接近于最坏性能。 堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。1)用大根堆排序的基本思想 先将初始文件R1.n建成一个大根堆,此堆为初始的无序区 再将关键字最大的记录R1(即堆顶)和无序区的最后一个记录Rn交换,由此得到新的无序区R1.n-1和有序区Rn,且满足R1.n-1.keysRn.key由于交换后新的根R1可能违反堆性质,故应将当前无序区R1.n-1调整为堆。然后再次将R1.n-1中关键字最大的记录R1和该区间的最后一个记录Rn-1交换,由此得到新的无序区R1.n-2
17、和有序区Rn-1.n,且仍满足关系R1.n-2.keysRn-1.n.keys,同样要将R1.n-2调整为堆。直到无序区只有一个元素为止。2)大根堆排序算法的基本操作: 初始化操作:将R1.n构造为初始堆; 每一趟排序的基本操作:将当前无序区的堆顶记录R1和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)。注意: 只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序。用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。堆排序和直接选择排序相反:在任何时刻堆排序中无序区总是在有序区之前,且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止。代码实现:pub
18、lic class HeapSortTest public static void main(String args) int data5 = new int 5, 3, 6, 2, 1, 9, 4, 8, 7 ; print(data5); heapSort(data5); System.out.println(排序后的数组:); print(data5); public static void swap(int data, int i, int j) if (i = j) return; datai = datai + dataj; dataj = datai - dataj; datai
19、 = datai - dataj; public static void heapSort(int data) for (int i = 0; i = 0; i-) / 保存当前正在判断的节点 int k = i; / 若当前节点的子节点存在 while (2 * k + 1 = lastIndex) / biggerIndex总是记录较大节点的值,先赋值为当前判断节点的左子节点 int biggerIndex = 2 * k + 1; if (biggerIndex lastIndex) / 若右子节点存在,否则此时biggerIndex应该等于 lastIndex if (databigg
20、erIndex databiggerIndex + 1) / 若右子节点值比左子节点值大,则biggerIndex记录的是右子节点的值 biggerIndex+; if (datak databiggerIndex) / 若当前节点值比子节点最大值小,则交换2者得值,交换后将biggerIndex值赋值给k swap(data, k, biggerIndex); k = biggerIndex; else break; public static void print(int data) for (int i = 0; i data.length; i+) System.out.print(d
21、atai + t); System.out.println(); 运行结果:java view plain copy5 3 6 2 1 9 4 8 7 3 8 6 7 1 5 4 2 9 2 7 6 3 1 5 4 8 9 4 3 6 2 1 5 7 8 9 4 3 5 2 1 6 7 8 9 1 3 4 2 5 6 7 8 9 2 3 1 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 排序后的数组: 1 2 3 4 5 6 7 8 9 如何解决过拟合问题?问题分析解释过拟合:模型在训练集表现好,在真实数据表
22、现不好,即模型的泛化能力不够。从另外一个方面来讲,模型在达到经验损失最小的时候,模型复杂度较高,结构风险没有达到最优。核心讲解学习方法上:限制机器的学习,使机器学习特征时学得不那么彻底,因此这样就可以降低机器学到局部特征和错误特征的几率,使得识别正确率得到优化.数据上:要防止过拟合,做好特征的选取。训练数据的选取也是很关键的,良好的训练数据本身的局部特征应尽可能少,噪声也尽可能小.L1和L2正则的区别,如何选择L1和L2正则?问题分析考查机器学习中L1和L2的理解核心讲解L0正则化的值是模型参数中非零参数的个数。也就是如果我们使用L0范数,即希望w的大部分元素都是0. (w是稀疏的)所以可以用
23、于ML中做稀疏编码,特征选择。通过最小化L0范数,来寻找最少最优的稀疏特征项。但不幸的是,L0范数的最优化问题是一个NP hard问题,而且理论上有证明,L1范数是L0范数的最优凸近似,因此通常使用L1范数来代替。L1正则化表示各个参数绝对值之和。L1范数的解通常是稀疏性的,倾向于选择数目较少的一些非常大的值或者数目较多的insignificant的小值。L2正则化标识各个参数的平方的和的开方值。L2范数越小,可以使得w的每个元素都很小,接近于0,但L1范数不同的是他不会让它等于0而是接近于0.HadoopYarn中的appmaster down掉怎么办?问题分析考查yarn的资源调度,当在一
24、个nodemanager启动的APPmaster挂掉了,意味着任务停止了,任务停止了yarn会怎么办核心讲解Yarn的重要性MPAppMaster向resourcemanager发送周期性的心跳,当resourcemanager发现MPAppMaster故障时,会在一个新的容器(由节点管理器管理)开启一个新的MPAppMaster实例,新的MPAppMaster实例可以恢复故障任务的状态,使其不必重复进行,默认是不可以恢复,可设置。问题扩展Yarn运行流程l client向RM提交应用程序,其中包括启动该应用的ApplicationMaster的必须信息,例如ApplicationMaster
25、程序、启动ApplicationMaster的命令、用户程序等。l ResourceManager启动一个container用于运行ApplicationMaster。l 启动中的ApplicationMaster向ResourceManager注册自己,启动成功后与RM保持心跳。l ApplicationMaster向ResourceManager发送请求,申请相应数目的container。l ResourceManager返回ApplicationMaster的申请的containers信息。申请成功的container,由ApplicationMaster进行初始化。container的
26、启动信息初始化后,AM与对应的NodeManager通信,要求NM启动container。AM与NM保持心跳,从而对NM上运行的任务进行监控和管理。l container运行期间,ApplicationMaster对container进行监控。container通过RPC协议向对应的AM汇报自己的进度和状态等信息。l 应用运行期间,client直接与AM通信获取应用的状态、进度更新等信息。l 应用运行结束后,ApplicationMaster向ResourceManager注销自己,并允许属于它的container被收回。结合项目使用在车联网项目中,flink就用到了yarn。任务提交到集群上
27、通过yarn来进行调度运行,保证任务的可靠性。mapreduce 跑的慢的原因?问题分析考查对MapReduce的理解,为什么MapReduce程序比较慢核心讲解Mapreduce 程序效率的瓶颈在于两点:1)计算机性能CPU、内存、磁盘健康、网络2)I/O 操作优化(1)数据倾斜(2)map和reduce数设置不合理(3)reduce等待过久(4)小文件过多(5)大量的不可分块的超大文件(6)spill次数过多(7)merge次数过多等。HDFS小文件优化方法问题分析考查对hdfs的理解程度,当出现很多hdfs小文件的时候,首先namenode会承受压力,其次map端会生成很多的小文件,那么
28、怎么解决hdfs小文件问题非常的重要核心讲解1)HDFS小文件弊端HDFS上每个文件都要在namenode上建立一个索引,这个索引的大小约为150byte,这样当小文件比较多的时候,就会产生很多的索引文件,一方面会大量占用namenode的内存空间,另一方面就是索引文件过大是的索引速度变慢。2)解决方案1)Hadoop Archive:是一个高效地将小文件放入HDFS块中的文件存档工具,它能够将多个小文件打包成一个HAR文件,这样在减少namenode内存使用的同时。2)Sequence file:sequence file由一系列的二进制key/value组成,如果key为文件名,value
29、为文件内容,则可以将大批小文件合并成一个大文件。3)CombineFileInputFormat:CombineFileInputFormat是一种新的inputformat,用于将多个文件合并成一个单独的split,另外,它会考虑数据的存储位置。4)开启JVM重用对于大量小文件Job,可以开启JVM重用会减少45%运行时间。JVM重用理解:一个map运行一个jvm,重用的话,在一个map在jvm上运行完毕后,jvm继续运行其他jvm具体设置:mapreduce.job.jvm.numtasks值在10-20之间。HDFS的数据压缩算法?及每种算法的应用场景?问题分析当你跟面试官说自己搞过优化
30、,就很有可能问你hdfs的存储格式和压缩算法,因为这是优化的基础核心讲解1)gzip压缩优点:压缩率比较高,而且压缩/解压速度也比较快;hadoop本身支持,在应用中处理gzip格式的文件就和直接处理文本一样;大部分linux系统都自带gzip命令,使用方便。缺点:不支持split。应用场景:当每个文件压缩之后在130M以内的(1个块大小内),都可以考虑用gzip压缩格式。例如说一天或者一个小时的日志压缩成一个gzip文件,运行mapreduce程序的时候通过多个gzip文件达到并发。hive程序,streaming程序,和java写的mapreduce程序完全和文本处理一样,压缩之后原来的程
31、序不需要做任何修改。2)Bzip2压缩优点:支持split;具有很高的压缩率,比gzip压缩率都高;hadoop本身支持,但不支持native;在linux系统下自带bzip2命令,使用方便。缺点:压缩/解压速度慢;不支持native。应用场景:适合对速度要求不高,但需要较高的压缩率的时候,可以作为mapreduce作业的输出格式;或者输出之后的数据比较大,处理之后的数据需要压缩存档减少磁盘空间并且以后数据用得比较少的情况;或者对单个很大的文本文件想压缩减少存储空间,同时又需要支持split,而且兼容之前的应用程序(即应用程序不需要修改)的情况。3)Lzo压缩优点:压缩/解压速度也比较快,合理
32、的压缩率;支持split,是hadoop中最流行的压缩格式;可以在linux系统下安装lzop命令,使用方便。缺点:压缩率比gzip要低一些;hadoop本身不支持,需要安装;在应用中对lzo格式的文件需要做一些特殊处理(为了支持split需要建索引,还需要指定inputformat为lzo格式)。应用场景:一个很大的文本文件,压缩之后还大于200M以上的可以考虑,而且单个文件越大,lzo优点越越明显。4)Snappy压缩优点:高速压缩速度和合理的压缩率。缺点:不支持split;压缩率比gzip要低;hadoop本身不支持,需要安装; 应用场景:当Mapreduce作业的Map输出的数据比较大
33、的时候,作为Map到Reduce的中间数据的压缩格式;或者作为一个Mapreduce作业的输出和另外一个Mapreduce作业的输入。压缩算法压缩后占比压缩解压缩GZIP13.4%21 MB/s118 MB/sLZO20.5%135 MB/s410 MB/sZippy/Snappy22.2%172 MB/s409 MB/s问题扩展hdfs 文件存储格式有哪些?行存储,将一整行存储在一起,是一种连续的存储方式,例如SequenceFile,MapFile,缺点是如果只需要行中的某一列也必须把整行都读入内存当中列存储 列存储会把文件切割成若干列,每一列存储在一起,是需要那一列读取那一列,不需要的不
34、用读取,例如parquet ORCfile,RCfile,列存储不适合流式写入,写入失败当前文件无法恢复。存储格式有:1. SequenceFile:Hadoop提供的一个行存储结构,Hadoop适合处理大文件而不适合处理小文件,所以sequencefile是为小文件提供的一种容器,将小文件包装起来形成一个SequenceFile类, 它用一种的形式序列化数据导文件中2. MapFile:MapFile可以看做有序的SequenceFile,是排过序的SequenceFile,它有索引可以按照索引查找,索引作为一个单独的文件存储,一般128个记录存储一个索引,索引可以载入内存,方便快速查找3.
35、 RCFile:hive的RCfile 是将数据按照行分组 ,组内在按照列划分储存4. ORCfile:是RCfile的升级版,将数据划分为默认大小为250MB的stripe(条带),每个stripe包含索引,数据和footer,ORCfile包换索引比RCfile更加高效5. Parquet:parquet基于Google的dremel,擅长处理深度嵌套的数据(有点类似于嵌套多层的json格式),parquet会将嵌套结构整合为平面列存储,Hive请说明hive中 Sort By,Order By,Cluster By,Distrbute By各代表什么意思?问题分析考查hive里面几种排序
36、方法的区别核心讲解order by:会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)。只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。sort by:不是全局排序,其在数据进入reducer前完成排序。distribute by:按照指定的字段对数据进行划分输出到不同的reduce中。cluster by:除了具有 distribute by 的功能外还兼具 sort by 的功能。问题扩展在hive里面谨慎只用排序,因为hive里面一张表数据量太大排序会很慢。一般用的比较多的是在窗口函数里面。Hive底层与数据库交互原理?问题分析考查对
37、hive底层的理解核心讲解由于Hive的元数据可能要面临不断地更新、修改和读取操作,所以它显然不适合使用Hadoop文件系统进行存储。目前Hive将元数据存储在RDBMS中,比如存储在MySQL、Derby中。元数据信息包括:存在的表、表的列、权限和更多的其他信息。Hive如何进行权限控制?问题分析偏运维的问题,考查用户与表之间的权限关系核心讲解目前hive支持简单的权限管理,默认情况下是不开启,这样所有的用户都具有相同的权限,同时也是超级管理员,也就对hive中的所有表都有查看和改动的权利,这样是不符合一般数据仓库的安全原则的。Hive可以是基于元数据的权限管理,也可以基于文件存储级别的权限
38、管理。为了使用Hive的授权机制,有两个参数必须在hive-site.xml中设置: hive.security.authorization.enabled true enable or disable the hive client authorization hive.security.authorization.createtable.owner.grants ALL the privileges automatically granted to the owner whenever a table gets created. An example like select,drop wi
39、ll grant select and drop privilege to the owner of the tableHive支持以下权限:Hive授权的核心就是用户(user)、组(group)、角色(role)。Hive中的角色和平常我们认知的角色是有区别的,Hive中的角色可以理解为一部分有一些相同“属性”的用户或组或角色的集合。这里有个递归的概念,就是一个角色可以是一些角色的集合。下面举例进行说明:用户 组张三 G_db1李四 G_db2王五 G_bothdb如上有三个用户分别属于G_db1、G_db2、G_alldb。G_db1、G_db2、G_ bothdb分别表示该组用户可以访
40、问数据库1、数据库2和可以访问1、2两个数据库。现在可以创建role_db1和role_db2,分别并授予访问数据库1和数据库2的权限。这样只要将role_eb1赋给G_db1(或者该组的所有用户),将role_eb2赋给G_db2,就可以是实现指定用户访问指定数据库。最后创建role_bothdb指向role_db1、role_db2(role_bothdb不需要指定访问那个数据库),然后role_bothdb授予G_bothdb,则G_bothdb中的用户可以访问两个数据库。问题扩展角色管理:Hive的用户和组使用的是Linux机器上的用户和组,而角色必须自己创建。-创建和删除角色 cre
41、ate role role_name; drop role role_name; -展示所有roles show roles -赋予角色权限 grant select on database db_name to role role_name; grant select on table t_name to role role_name; -查看角色权限 show grant role role_name on database db_name; show grant role role_name on table t_name; -角色赋予用户 grant role role_name to user user_name -回收角色权限 revoke select on database db_name from role role_name; revoke select on table t_name from role role_name; -查看某个用户所有角色 show role grant user user_