招聘频道
当前位置:首页 > 名企招聘 > 面试题 > 关于hive的问题你都知道么

关于hive的问题你都知道么

时间:2018-08-17 13:22:37作者:

hive的外部表怎么创建?如何使用hive来操作hbase里边的数据?
创建外部表的好处是数据可以随时从hdfs中挂载进表中
使用分区的好处是可以缩短查询范围
例:CREATE EXTERNAL TABLE my_daily_report( 
    last_update string, 
    col_a string, 
    col_b string, 
    col_c string, 
    col_d string, 
    col_e string, 
    col_f string, 
    col_g string, 
    col_h string, 
    col_i string, 
     col_j string) 
    PARTITIONED BY ( 
    par_dt string) location '/user/chenshu/data/daily'; 


   使用Hive操作HBase中的表,只是提供了便捷性,对于性能上,较MapReduce并不会提升太多,http://www.cnblogs.com/1130136248wlxk/articles/5517726.html


每天接收30gb票据数据,如何快速处理该数据 将清洗后的数据保存在redis集群里边?
hadoop用mr清洗 5分钟左右
spark清洗  1分钟左右
http://www.cnblogs.com/ivictor/p/5446503.html
 新建一个文本文件,包含redis命令
 例: SET KEY0 VALUE0
   SET KEY1 VALUE1
   …
 将这些命令转化成Redis Protocol
利用管道插入 cat data.txt | redis-cli --pipe

 

hbase里边的rowkey该如何设计能够尽可能优化hbase系统?
使用复合rowkey的时候,用在查看用户的电影记录的时候,选择userid+playTime 作为复合rowkey, 原先rowkey存储是按从小到大排序,进行倒置之后,就可以查询用户的观看电影的记录从新到旧的排序了
(用二进制比用String更节省空间,但是二进制不方便排错与查看,使用String能更好的数据均匀,所有最好使用String作为rowkey)
Rowkey是按照由低到高排序存储在Hbase里面的。
Rowkey决定查询Hbase的性能,而且rowkey相当于KeyValue的Key值
Rowkey是按照从大到小的排序的
Rowkey尽量使用散列的Rowkey设计
保持rowkey散列,就可以保证rowkey的所有数据都不是在一个region上,从而避免rowkey读写都在的负载都在一个region上面
散列rowkey,把rowkey进行散列(Hash)存储
userid 进MD5 加密,取前6位作为rowkey的前缀

rowkey的长度尽量短
时间尽量使用Long来表示
尽量使用编码压缩

 

hadoop的作业提交机制?hadoop的shuffle机制?
 hadoop
1.Client中,客户端提交一个mr的jar包给JobClient(提交方式:hadoop jar ...)

2.JobClient持有ResourceManager的一个代理对象,它向ResourceManager发送一个RPC请求,告诉ResourceManager作业开始,
然后ResourceManager返回一个JobID和一个存放jar包的路径给Client

3.Client将得到的jar包的路径作为前缀,JobID作为后缀(path = hdfs上的地址 + jobId) 拼接成一个新的hdfs的路径,然后Client通过FileSystem向hdfs中存放jar包,默认存放10份
(NameNode和DateNode等操作)

4.开始提交任务,Client将作业的描述信息(JobID和拼接后的存放jar包的路径等)RPC返回给ResourceManager

5.ResourceManager进行初始化任务,然后放到一个调度器中

6.ResourceManager读取HDFS上的要处理的文件,开始计算输入分片,每一个分片对应一个MapperTask,根据数据量确定起多少个mapper,多少个reducer

7.NodeManager 通过心跳机制向ResourceManager领取任务(任务的描述信息)

8.领取到任务的NodeManager去Hdfs上下载jar包,配置文件等

9.NodeManager启动相应的子进程yarnchild,运行mapreduce,运行maptask或者reducetask

10.map从hdfs中读取数据,然后传给reduce,reduce将输出的数据给回hdfs
 shuffle
shuffle过程包含在Map和Reduce两端中。在Map端的shuffle过程是对Map的结果进行分区(partition),排序(sort)和溢写(spill),然后将属于同一个划分的输出合并在一起(merge)并写在磁盘上,同时按照不同的划分将结果发送给对应的Reduce。Reduce端又会将各个Map送来的属于同一划分的输出进行边合并(merge)边排序(sort),最后将具有相同key值的value聚合到同一组内,交由Reduce函数处理。
Map端
Map端的shuffle过程包含在collect函数对Map结果输出结果的处理过程中。Map函数的输出内存缓冲区是一个环状结构。
当输出内存缓冲区内容达到设定的阈值时,就需要把缓冲区内容溢写(spill)到磁盘中。但是在溢写的时候Map并不会阻止继续向缓冲区写入结果,如果Map结果生成速度比溢写速度快,那么缓冲区会写满,这时Map任务必须等待,直到溢写过程结束。
在collect函数中将缓冲区中的内容写出时会调用sortAndSpill函数。sortAndSpill函数每被调用调用一次就会创建一个spill文件,然后按照key值对需要写出的数据进行排序,最后按照划分的顺序将所有需要写出的结果写入这个spill文件中。如果用户作业配置了combiner类,那么在写出过程中会先调用combineAndSpill再写出,对结果进行进一步合并是为了让Map的输出数据更加紧凑。
最后在每个Map任务结束之后在Map的TaskTrack上还会执行合并操作,将Map生成的众多spill文件中的数据按照划分重新组织,以便于Reduce处理。主要是针对指定的分区,从众多个spill文件中拿出属于同一个分区的所有数据,然后将它们合并在一起,并写入一个已分区且已排序的Map输出文件中。
待唯一的已分区且已排序的Map输出文件写入最后一条记录后,Map端的shuffle阶段就结束了。下面就进入Reduce端的shuffle阶段。
________________________________________
Reduce端
在reduce端,shuffle阶段可以分成三个阶段:复制Map输出、排序合并和Reduce处理。
Map任务完成后,会通知父TaskTracker状态已更新,TaskTracker进而通知JobTracker。所以,对于指定作业来说,JobTracker能够记录Map输出和TaskTracker的映射关系。Reduce会定期向JobTracker获取Map的输出位置。一旦拿到输出位置,Reduce任务就会从这个输出对应的TaskTracker上复制输出到本地,而不会等到所有的Map任务结束。这就是Reduce任务的复制阶段。
在Reduce复制Map的输出结果的同时,Reduce任务就进入了合并阶段。这一阶段的主要任务是将从各个复制的Map输出文件进行整合,并维持数据的有序性。
当所有Map输出文件都已合并且保存有序后,就可以对合并的文件进行reduce处理了,具体是对key值进行比较,把具有相同key值的value聚合到同一组内,然后对组内的元素进行特定的reduce操作。
 


学习大数据敬请关注魔据教育微信二维码。
魔据教育微信二维码

【版权与免责声明】如发现内容存在版权问题,烦请提供相关信息发邮件至kefu@mojuedu.com,我们将及时沟通与处理。本站内容除非来源注明魔据教育,否则均为网友转载,涉及言论、版权与本站无关。

全国咨询热线:400-690-5006,值班手机:18501996998(7*24小时)

在线咨询:李老师QQ(226594285),陈老师QQ(428683440)

企业合作服务专线:010-82340234-821, 院校合作洽谈专线:010-82340234

Copyright 2001-2017 魔据教育 - 北京华育兴业科技有限公司 版权所有,京ICP备17018991号-2

免费在线咨询立即咨询

免费索取技术资料立即索取

大数据技术交流QQ:226594285

电话咨询010-82340234