1.Hive数据倾斜问题。数据倾斜:数据倾斜主要表现在,map/reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,这是因为某一个key的条数比其他key多很多(有时是百倍或者千倍之多),这条Key所在的reduce节点所处理的数据量比其他节点就大很多,从而导致某几个节点迟迟运行不完。
产生原因:1)key分布不均匀 2)业务数据本身的特性 3)SQL语句造成数据倾斜
表现:任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。因为其处理的数据量和其他reduce差异过大,单一reduce的记录数与平均记录数差异过大,通常可能达到3倍甚至更多, 最长时长大于平均时长。
产生数据倾斜的业务场景及解决办法:1)空值产生的数据倾斜 在日志中,常会有信息丢失的问题,比如日志中的 user_id,如果取其中的 user_id 和用户表中的 user_id 相关联,就会碰到数据倾斜的问题。解决方案 1:user_id 为空的不参与关联
select * from log a join user b on a.user_id is not null and a.user_id = b.user_id
- 1
解决方案 2: 赋予空值新的 key 值
select * from log a left outer join user b on
case when a.user_id is null then concat('hive',rand()) else a.user_id end = b.user_id
- 1
- 2
把空值的 key 变成一个字符串加上一个随机数,就能把造成数据倾斜的数据分到不同的 reduce 上解决数据倾斜的问题。
2)不同数据类型关联产生数据倾斜 用户表中 user_id 字段为 int,log 表中 user_id 为既有 string 也有 int 的类型, 当按照两个表的 user_id 进行 join 操作的时候,默认的 hash 操作会按照 int 类型的 id 进行分配,这样就会导致所有的 string 类型的 id 就被分到同一个 reducer 当中。解决方案:转换为相同数据类型
select * from user a left outer join log b on b.user_id = cast(a.user_id as string)
- 1
3)大小表关联查询产生数据倾斜 使用map join让小的维度表(1000条以下的记录条数)先进内存。在map端完成进行join操作。 ---看到 map join 概念:将其中做连接的小表(全量数据)分发到所有 MapTask 端进行 Join,从而避免了 reduceTask,前提要求是内存足以装下该全量数据 map join使用限制:必须是join中从表(子查询)数据比较小。所谓从表,即左外连接的右表,或者右外连接的左表。 map join的适用场景:如关联操作中有一张表非常小,不等值的连接操作。通过上面分析你会发现,并不是所有的场景都适合用MapJoin,它通常会用在如下的一些情景:在两个要连接的表中,有一个很大,有一个很小,这个小表可以存放在内存中而不影响性能。这样我们就把小表文件复制到每一个Map任务的本地,再让Map把文件读到内存中待用。 在 hive 中,直接提供了能够在 HQL 语句指定该次查询使用 map join. 首先设置map join:
set hive.auto.convert.join= true;//设置mapjoin
- 1
在 hive0.11 版本以后会自动开启 map join 优化,由两个参数控制:
set hive.auto.convert.join=true; //设置 MapJoin 优化自动开启 set hive.mapjoin.smalltable.filesize=25000000 //设置小表不超过多大时开启 mapjoin 优化
- 1
- 2
map join 的用法是在查询/子查询的SELECT关键字后面添加/ * + MAPJOIN(tablelist) * /提示优化器转化为map join。 详细举例如下:join操作一般都是在reduce阶段完成的,写sql的时候要注意把小表放在join的左边,原因是在 Join 操作的 Reduce 阶段,位于 Join 操作符左边的表的内容会被加载进内存,将条目少的表放在左边,可以有效减少发生 out of memory 错误的几率。 一个大表和一个配置表的reduce join经常会引起计算不均衡的情况。比如配置表gender_config(gender string,gender_id int)。把“男”“女”字符串映射成一个id。配置表和上面的user表join的sql如下: select user.id , gender_config.gender_id from gender_config join user on gender_config.gender=user.gender。gender 只有男女两个值,hive处理join的时候把join_key作为reduce_key,因此会出现和group by类似的reduce计算不均衡现象,只有两个reduce参与计算,每个reduce计算100亿条记录。
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/6d205939c90547adc4cef9c3e36f7940.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/d866dbf08fac3f83bd04425385ceeec9.png)
4)小文件过多:当出现小文件过多,需要合并小文件。解决方法:set hive.merge.mapfiles=true1>hive.map.aggr=true:map端部分聚合。
set hive.map.aggr=true //map端部分聚合,相当于Combiner,可以减小压力(默认开启)
- 1
例: 先看看下面这条SQL:select user.gender,count(1) from user group by user.gende。由于用户的性别只有男和女两个值 (未知)。如果没有map端的部分聚合优化,map直接把groupby_key 当作reduce_key发送给reduce做聚合,就会导致计算不均衡的现象。虽然map有100万个,但是reduce只有两个在做聚合,每个reduce处理100亿条记录。
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/a0e1f26181e55e3320ceb2821c65e8f7.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/7b784409dfb02fba77e9e6c5942964d3.png)
set hive.groupby.skewindata=true//默认关闭
- 1
hive.groupby.skewindata=true:有数据倾斜的时候进行负载均衡,当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。
详细举例:hive.groupby.skewindata=true:通常这种情况都是在有distinct出现的时候,比如下面的sql: select user.gender,count(distinct user.id) from user group by user.gender ,由于map需要保存所有的user.id , map聚合开关会自动关掉,导致出现计算不均衡的现象,只有2个redcue做聚合,每个reduce处理100亿条记录。
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/e4b87d47ef881fa6b8f2cbd28b097a76.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/fdbc32fca474f0232e337ee32db36925.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/856308ca59c45b87e7d2e8073cc84e5e.png)
5)当HiveQL中包含count(distinct)采用 sum() group by 的方式来替换 count(distinct)完成计算。
2.Hive中的排序关键字有哪些?sort by ,order by ,distribute by,cluster bysort by :不是全局排序,对每个reduce内部数据进行排序,对于全局数据结果来说不是排序的。order by :会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)。只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。distribute by :指定分区(这里的分区指的是map reduce过程中的分区),按照指定的字段对数据进行划分输出到不同的reduce中,通常结合sort by使用(注:distribute by必须在sort by之前)。cluster by :属于distribute by和sort by的组合。当distribute by 和sort by的字段相同时,等同于cluster by,使用cluster by进行替代。
3.hive有哪些方式保存元数据,各有哪些特点?1)内嵌模式:将元数据保存在本地内嵌的derby数据库中,内嵌的derby数据库每次只能访问一个数据文件,也就意味着它不支持多会话连接。2)本地模式:将元数据保存在本地独立的数据库中(一般是mysql),这可以支持多会话连接。3)远程模式:把元数据保存在远程独立的mysql数据库中,避免每个客户端都去安装mysql数据库。Metastore作用: metadata即元数据,元数据包含用Hive创建的database、tabel等的元信息。元数据存储在关系型数据库中。如Derby、MySQL等。 Metastore的作用是:客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。三种配置方式区别: 内嵌模式使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastore服务。这个是默认的,配置简单,但是一次只能一个客户端连接,适用于用来实验,不适用于生产环境。 本地元存储和远程元存储都采用外部数据库来存储元数据,目前支持的数据库有:MySQL、Postgres、Oracle、MS SQL Server。 本地元存储和远程元存储的区别是:本地元存储不需要单独起metastore服务,用的是跟hive在同一个进程里的metastore服务。远程元存储需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。远程元存储的metastore服务和hive运行在不同的进程。
4.海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。方案1:1)在每台电脑上求出TOP10,可以采用包含10个元素的堆完成(TOP10小,用最大堆,TOP10大,用最小堆)。2)比如求TOP10大,我们首先取前10个元素调整成最小堆,如果发现,然后扫描后面的数据,并与堆顶元素比较,如果比堆顶元素大,那么用该元素替换堆顶,然后再调整为最小堆。3)最后堆中的元素就是TOP10大。方案2:1)求出每台电脑上的TOP10后,然后把这100台电脑上的TOP10组合起来,共1000个数据2)再利用上面类似的方法求出TOP10就可以了。
4.Hive中追加导入数据的4种方式是什么?请写出简要语法从本地导入:load data local inpath ‘/home/1.txt’ (overwrite)into table student;从Hdfs导入:load data inpath ‘/user/hive/warehouse/1.txt’ (overwrite)into table student;查询导入:create table student1 as select * from student;(也可以具体查询某项数据)查询结果导入:insert(overwrite)into table staff select * from track_log;
5.Hive导出数据有几种方式?如何导出数据?1.用insert overwrite导出方式 1)导出到本地: insert overwrite local directory ‘/home/test/1’ row format delimited fields terminated by ‘\t’ select * from staff;(递归创建目录) 2)导出到HDFS insert overwrite directory ‘/user/hive/1/2’ row format delimited fields terminated by ‘\t’ select * from staff;2.Bash shell覆盖追加导出例如:$ bin/hive -e ‘select * from staff;’ > /home/export/backup.log3.Sqoop把hive数据导出到外部
6.hive 内部表和外部表区别?1)内部表:默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表Hive会或多或少地控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置 hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定义的目录的子目录下。 当我们删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据。2)外部表:因为表是外部表,所以Hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。下面以一个具体的例子说明内部表与外部表的区别。首先,创建一个外部表:
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/08c35fed1cf9377c031e8f9fe17688eb.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/322c52701e86d33d1789cec03d76f448.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/0ce4491eca332dd87a51706b34e2e505.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/b19e2d7f850b5ce5fe8cedd83438680d.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/036bdb72909a45b6a9e0e9273ecff2cf.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/ff4158766ed60c61ffcf0aa733d7f83a.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/bb2a42cf9103c261552c6d18d5026e56.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/6c266bb3cda5bc508df068008cb654b5.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/5ae9d76ea172ace6f732bb17617719f5.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/1bf205aa363f70c091c10d09b2621a95.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/4654488d9f568d5bce8d4e68714d70d9.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/b1ca23005dc3a95dd4c6b3544b67479b.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/7b84c3fcdcd99c11158ab74740ce54d8.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/256dec9def7452955dd976cd3fa2e1d6.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/dc5026445d0d60969aa900d24bd52d82.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/dd33d91c2274639be67764f6d86ff82f.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/9d149c892ddc2d7b5e506bec7b65e012.png)
7 分区和分桶的区别?分区:指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的内容巨大,在查询时进行全表扫描耗费的资源非常多。那其实这个情况下,我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,在查询时只要指定分区字段的值就可以直接从该分区查找。
分桶:分桶是相对分区进行更细粒度的划分。分桶将整个数据内容按照某列属性值得hash值进行区分,如要按照name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶:取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。
8.Hive优化1)限制调整:LIMIT语句是大家经常使用到的,经常使用CLI的用户都会使用到。不过,在很多情况下LIMIT语句还是需要执行整个查询语句,然后再返回部分结果的。因为这种情况通常是浪费的,所以应该尽可能地避免出现这种情况。Hive有-一个配置属性可以开启,当使用LIMTI语句时,其可以对源数据进行抽样:
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/65f9dce387a6f09750d3f72d2a657e20.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/b793ebfa23137ba7d450ace87c827339.png)
2)Join优化:1>每个ON子句使用同一个连接键。当对3个或者更多个表进行JOIN连接时,如果每个ON子句都使用相同的连接键的话,那么只会产生一个MapReduce job。2>Hive同时假定查询中最后一个表是最大的那个表。在对每行记录进行连接操作时,它会尝试将其他表缓存起来,然后扫描最后那个表进行计算。因此,用户需要保证连续查询中的表的大小从左到右是依次增加的。或者使用Hive提供的“标记”机制来显式地告之查询优化器哪张表是大表,使用方式如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/403cf8c63a30575407c6501de22d9440.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/7f5292b08874099bb0dcc5238349269c.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/56d6db8de6a3feb1bafbf75929979102.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/ef7141736e6337bff53c6397fff10625.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/72f40acc6baaab179b755eedc4dfabd9.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/ac022ed6da755ab68bf4a2473937865f.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/0e614bbf5c195c4bf7e22f2054a8528c.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/1c1724dff215e94be36a9c0085bfd26e.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/7e645f2b629bd8ae6755d687090b7a1a.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/b409d16d173b353b279eb0e55bcefb3d.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/cc935ea3ab74672cb04d52389843dba2.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/5ebcc7a1b7d7962d7617b134ac65a292.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/41b8c4c29ba7069daea6dfd411618dd5.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/c0c548bafbaba03ff2425a9d5ea04839.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/dad92ef2e4f8eb2f1a5b01d06446d536.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/fb5c50fc2a35c204f84a6259d1868648.png)
7)JVM重用JVM重用是Hadoop调优参数的内容,其对Hive的性能具有非常大的影响,特别是对于很难避免小文件的场景或task特别多的场景,这类场景大多数执行时间都很短。Hadoop的默认配置通常是使用派生JVM来执行map和reduce任务的。这时JVM的启动过程可能会造成相当大的开销,尤其是执行的job包含有成百上千个task任务的情况。JVM重用可以使得JVM实例在同一一个job中重新使用N次。N的值可以在Hadoop的mapred-site.xml文件(位于 $ HADOOP_ HOME/conf 目录下)中进行设置:
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/48d7700334b1fe5f3213b1df1cbcf989.png)
8)索引索引可以用来加快含有GROUP BY语句的查询的计算速度。Hive从v0.8.0版本后增加了一个bitmap索引实现。Bitmap索引一般在指定的列排重后的值比较小时进行使用。例:
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/947f6631a50568f4e4d34987323f0c4d.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/674ec122254594220ef948a91e493ab3.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/69f3cb47cebb33ba8e2d0df9c970d11a.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/cb314b512d9f71c6ecf324b27c57f4fc.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/6d5c6de002141da513746528094cbca6.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/1fd991fddca5fb18e517843d9e6734cf.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/406ec599802068c6fa9f2961cd6d6cf5.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/bc5128b4ede616f8101a1a3255d67153.png)
11)单个MapReduce中多个GROUP BY另一个特别的优化试图将查询中的多个GROUPBY操作组装到单个MapReduce任务中。如果想启动这个优化,那么需要一-组常用的GROUP BY键:
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/f3fc10d0ab68027fb302ee35fd11b46e.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/b8762f16356b8edbfbc64f6553406a73.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/522cb13fb1285554cc94827250bc01c8.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/175853d9cfdc2f6e93a9b6938836eda8.png)
参考:https://blog.csdn.net/wxfghy/article/details/81361400
Hive优化:
1.通用设置
hive.optimize.cp=true:列裁剪
hive.optimize.prunner:分区裁剪
hive.limit.optimize.enable=true:优化LIMIT n语句
hive.limit.row.max.size=1000000:
hive.limit.optimize.limit.file=10:最大文件数
2.本地模式(小任务)
1)job的输入数据大小必须小于参数:hive.exec.mode.local.auto.inputbytes.max(默认128MB)
2)job的map数必须小于参数:hive.exec.mode.local.auto.tasks.max(默认4)
3)job的reduce数必须为0或者1
hive.exec.mode.local.auto.inputbytes.max=134217728
hive.exec.mode.local.auto.tasks.max=4
hive.exec.mode.local.auto=true
hive.mapred.local.mem:本地模式启动的JVM内存大小
3.并发执行
hive.exec.parallel=true ,默认为false
hive.exec.parallel.thread.number=8
4.Strict Mode:
hive.mapred.mode=true,严格模式不允许执行以下查询:
分区表上没有指定了分区
没有limit限制的order by语句
笛卡尔积:JOIN时没有ON语句
5.动态分区
hive.exec.dynamic.partition.mode=strict:该模式下必须指定一个静态分区
hive.exec.max.dynamic.partitions=1000
hive.exec.max.dynamic.partitions.pernode=100:在每一个mapper/reducer节点允许创建的最大分区数
DATANODE:dfs.datanode.max.xceivers=8192:允许DATANODE打开多少个文件
6.推测执行
mapred.map.tasks.speculative.execution=true
mapred.reduce.tasks.speculative.execution=true
hive.mapred.reduce.tasks.speculative.execution=true;
7.多个group by合并
hive.multigroupby.singlemar=true:当多个GROUP BY语句有相同的分组列,则会优化为一个MR任务
8.虚拟列
hive.exec.rowoffset:是否提供虚拟列
9.分组
1)两个聚集函数不能有不同的DISTINCT列,以下表达式是错误的:
INSERT OVERWRITE TABLE pv_gender_agg SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(DISTINCT pv_users.ip) FROM pv_users GROUP BY pv_users.gender;
2)SELECT语句中只能有GROUP BY的列或者聚集函数。
10.Combiner聚合
hive.map.aggr=true;在map中会做部分聚集操作,效率更高但需要更多的内存。
hive.groupby.mapaggr.checkinterval:在Map端进行聚合操作的条目数目
11.数据倾斜
1)hive.groupby.skewindata=true:数据倾斜时负载均衡,当选项设定为true,生成的查询计划会有两个MRJob。
2)第一个MRJob 中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的GroupBy Key
有可能被分发到不同的Reduce中,从而达到负载均衡的目的;
3)第二个MRJob再根据预处理的数据结果按照GroupBy Key分布到Reduce中(这个过程可以保证相同的GroupBy Key被分布到同一个Reduce中),最后完成最终的聚合操作。
12.排序
ORDER BY colName ASC/DESC
hive.mapred.mode=strict时需要跟limit子句
hive.mapred.mode=nonstrict时使用单个reduce完成排序
SORT BY colName ASC/DESC :每个reduce内排序
DISTRIBUTE BY(子查询情况下使用 ):控制特定行应该到哪个reducer,并不保证reduce内数据的顺序
CLUSTER BY :当SORT BY 、DISTRIBUTE BY使用相同的列时。
13.合并小文件
hive.merg.mapfiles=true:合并map输出
hive.merge.mapredfiles=false:合并reduce输出
hive.merge.size.per.task=256*1000*1000:合并文件的大小
hive.mergejob.maponly=true:如果支持CombineHiveInputFormat则生成只有Map的任务执行merge
hive.merge.smallfiles.avgsize=16000000:文件的平均大小小于该值时,会启动一个MR任务执行merge。
14.自定义map/reduce数目
1)减少map数目:
set mapred.max.split.size
set mapred.min.split.size
set mapred.min.split.size.per.node
set mapred.min.split.size.per.rack
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
2)增加map数目:
1>当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。
2>假设有这样一个任务:
select data_desc, count(1), count(distinct id),sum(case when …),sum(case when ...),sum(…) from a group by data_desc
3>如果表a只有一个文件,大小为120M,但包含几千万的记录,如果用1个map去完成这个任务,肯定是比较耗时的,这种情况下,我们要考虑将这一个文件合理的拆分成多个,这样就可以用多个map任务去完成。
set mapred.reduce.tasks=10;
create table a_1 as select * from a distribute by rand(123);
4>这样会将a表的记录,随机的分散到包含10个文件的a_1表中,再用a_1代替上面sql中的a表,则会用10个map任务去完成。每个map任务处理大于12M(几百万记录)的数据,效率肯定会好很多。
3)reduce数目设置:
1>参数1:hive.exec.reducers.bytes.per.reducer=1G:每个reduce任务处理的数据量
2>参数2:hive.exec.reducers.max=999(0.95*TaskTracker数):每个任务最大的reduce数目
3>reducer数=min(参数2,总输入数据量/参数1)
4>set mapred.reduce.tasks:每个任务默认的reduce数目。典型为0.99*reduce槽数,hive将其设置为-1,自动确定reduce数目。
15.使用索引:
hive.optimize.index.filter:自动使用索引
hive.optimize.index.groupby:使用聚合索引优化GROUP BY操作
- 1
9.简要描述数据库中的 null,说出null在hive底层如何存储,并解释 select a. * from t1 a left outer join t2 b on a.id=b.id where b.id is null; 语句的含义。1)null与任何值运算的结果都是null, 可以使用is null、is not null函数指定在其值为null情况下的取值。2)null在hive底层默认是用’\N’来存储的,可以通过alter table test SET SERDEPROPERTIES(‘serialization.null.format’ = ‘a’);来修改。3)查询出t1表中与t2表中id相等的所有信息。
10.写出hive中split、coalesce及collect_list函数的用法(可举例)。split将字符串转化为数组。split(‘a,b,c,d’ , ‘,’) ==> [“a”,“b”,“c”,“d”]COALESCE(T v1, T v2, …) 返回参数中的第一个非空值;如果所有值都为 NULL,那么返回NULL。collect_list列出该字段所有的值,不去重 select collect_list(id) from table;
11.写出将 text.txt 文件放入 hive 中 test 表‘2016-10-10’ 分区的语句,test 的分区字段是 l_date。
LOAD DATA LOCAL INPATH '/your/path/test.txt' OVERWRITE INTO TABLE test PARTITION (l_date='2016-10-10')
- 1
12.Multi-group by 是hive的一个非常好的特性,请举例说明?multi group by 可以将查询中的多个group by操作组装到一个MapReduce任务中,起到优化作用。
例子:
select Provice,city,county,count(rainfall) from area where data="2018-09-02" group by provice,city,count select Provice,count(rainfall) from area where data="2018-09-02" group by provice
- 1
- 2
- 3
使用multi group by:
from area
insert overwrite table temp1
select Provice,city,county,count(rainfall) from area where data="2018-09-02" group by provice,city,count insert overwrite table temp2 select Provice,count(rainfall) from area where data="2018-09-02" group by provice
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
使用multi group by 之前必须配置参数:
<property>
<name>hive.multigroupby.singlemr</name>
<value>true</value>
</property>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
13.请谈一下hive的特点是什么?hive和RDBMS有什么异同?hive由Facebook开源用于解决海量结构化日志的数据统计,是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/6b6c8c0ae087441e050c0bf20f81db52.png)
2)hive的计算引擎是hadoop的mapreduce,存储是hadoop的hdfs文件系统。rdbms的引擎由数据库自己设计实现例如mysql的innoDB,存储用的是数据库服务器本地的文件系统。
3)hive由于基于hadoop所以存储和计算的扩展能力都很好,rdbms在这方面比较弱,比如orcale的分表和扩容就很头疼。
4)hive表格没有主键、没有索引、不支持对具体某一行的操作,适合对批量数据的操作,不支持对数据的update操作,更新的话一般是先删除表然后重新落数据rdbms事务性强,有主键、索引,支持对具体某一行的增删改查等操作。
5)hive的SQL为HQL,与标准的RDBMS的SQL存在有不少的区别,相对来说功能有限rdbms的SQL为标准SQL,功能较为强大。
6)Hive在加载数据时候和rdbms关系数据库不同,hive在加载数据时候不会对数据进行检查,也不会更改被加载的数据文件,而检查数据格式的操作是在查询操作时候执行,这种模式叫“读时模式”。在实际应用中,写时模式在加载数据时候会对列进行索引,对数据进行压缩,因此加载数据的速度很慢,但是当数据加载好了,我们去查询数据的时候,速度很快。但是当我们的数据是非结构化,存储模式也是未知时候,关系数据操作这种场景就麻烦多了,这时候hive就会发挥它的优势。
rdbms里,表的加载模式是在数据加载时候强制确定的(表的加载模式是指数据库存储数据的文件格式),如果加载数据时候发现加载的数据不符合模式,关系数据库则会拒绝加载数据,这个就叫“写时模式”,写时模式会在数据加载时候对数据模式进行检查校验的操作。
总结:Hive并非为联机事务处理而设计,Hive并不提供实时的查询和基于行级的数据更新操作。Hive是建立在Hadoop之上的数据仓库软件工具,它提供了一系列的工具,帮助用户对大规模的数据进行提取、转换和加载,即通常所称的ETL(Extraction,Transformation,and Loading)操作。Hive可以直接访问存储在HDFS或者其他存储系统(如Hbase)中的数据,然后将这些数据组织成表的形式,在其上执行ETL操作。 HIVE是数据仓库适合存储历史的海量的数据,适合做批量和海量复杂运算,事务性差,运算时间长。RDBMS是数据库,存储数据量偏小一些,事务性强,适合做OLTP和OLAP业务,运算时间短。Hive的最佳使用场合是大数据集的批处理作业,例如,网络日志分析。
● 1)查询语言。
由于SQL被广泛的应用在数据仓库中,因此,专门针对Hive的特性设计了类SQL的查询语言HQL。熟悉SQL开发的开发者可以很方便的使用Hive进行开发。
● 2)数据存储位置。
Hive是建立在Hadoop之上的,所有Hive的数据都是存储在HDFS中的。而数据库则可以将数据保存在块设备或者本地文件系统中。
● 3)数据更新。
由于Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive中不建议对数据的改写,所有的数据都是在加载的时候确定好的。而数据库中的数据通常是需要经常进行修改的,因此可以使用INSERT NT0.... VALUES添加数据,使用UPDATE...SET修改数据。
● 4)索引。
Hive在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些Key建立索引。Hive 要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于MapReduce的引入,Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive 仍然可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了Hive 不适合在线数据查询。
● 5)执行。
Hive中大多数查询的执行是通过Hadoop提供的MapReduce来实现的。而数据库通常有自己的执行引擎。
● 6)执行延迟。
Hive在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致Hive执行延迟高的因素是MapReduce框架。由于MapReduce 本身具有较高的延迟,因此在利用MapReduce执行Hive查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive 的并行计算显然能体现出优势。
● 7)可扩展性。
由于Hive是建立在Hadoop之上的,因此Hive的可扩展性是和Hadoop的可扩展性是一致的(世界上最大的Hadoop集群在Yahoo!, 2009 年的规模在4000台节点左右)。而数据库由于ACID语义的严格限制,扩展行非常有限。目前最先进的并行数据库Oracle在理论上的扩展能力也只有100台左右。
● 8)数据规模。
由于Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
14.hive架构
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/1f9b9e2838a74f5ad80a4e747f6ce17f.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/ef23d06a030d540ad4c7f276fbd6a37d.png)
参考:https://blog.csdn.net/qq_35036995/article/details/80298403 https://blog.csdn.net/u011317245/article/details/53977771