sql-优化 数据倾斜
10.4 数据倾斜 1.数据倾斜现象: 绝大多数任务都很快完成,只有一个或者少数几个任务执行的很慢甚至最终执行失败。 2.数据过量现象: 数据过量的表现为所有任务都执行的很慢,这个时候只有提高执行资源才可以优化HQL的执行效率。 3. 数据倾斜的原因: 导致倾斜的原因在于按照key分组后,少量的任务负载着绝大部分数据的计算,也就是说,产生数据倾斜的HQL中一定存在着分组的操作。所以从HQL的角度,我们可以将数据倾斜分为单表携带了Group by字段的查询和两表(多表)join的查询 10.4.1 单表数据倾斜优化 1. 使用参数优化 当任务中存在group by操作同时聚合函数为count或者sum可以设置参数来处理数据倾斜的问题,就是上文10.3节中的Group by处理方式。 ① 是否在Map端进行聚合,默认为True hive(default)> set hive.map.aggr = true ② 在Map端进行聚合操作的条目数目 hive(default)> set hive.groupby.mapaggr.checkinterval = 100000 ③ 有数据倾斜的时候进行负载均衡(默认是false) hive(default)> set hive.groupby.skewindata = true 2. 增加Reduce数量 当数据中的多个key同时导致数据倾斜,可以通过增加reduce的数量解决数据倾斜问题 官网信息 1)调整Reduce个数方法1: ① 每个Reduce处理的数据量默认是256MB hive(default)> set hive.exec.reducers.bytes.per.reducer=256000000 ② 每个任务最大的reduce数,默认为1009 hive(default)> set hive.exec.reducers.max=1009 ③ 计算reducer数的公式 N=min(参数2,总输入数据量/参数1) 2)调整Reduce个数方法2: 通过参数配置的方式(三种)直接指定reduce的个数,参数mapreduce.job.reduces。 hive(default)> set mapreduce.job.reduces = 15; 10.4.2 join数据倾斜优化 1.使用参数 在编写 Join 查询语句时,如果确定是由于 join 出现的数据倾斜,那么请做如下设置: # join的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置 set hive.skewjoin.key=100000; # 如果是join过程出现倾斜应该设置为true set hive.optimize.skewjoin=false; 如果开启了,在Join过程中Hive会将计数超过阈值hive.skewjoin.key(默认100000)的倾斜key对应的行临时写进文件中,然后再启动另一个job做map join生成结果。通过 hive.skewjoin.mapjoin.map.tasks参数还可以控制第二个job的mapper数量,默认10000。 set hive.skewjoin.mapjoin.map.tasks=10000; 2. 大小表join 可以使用MapJoin,没有Reduce阶段就不会出现数据倾斜。详情见3.5节 3. 大表大表join 使用打散加扩容方式解决数据倾斜问题 选择其中较大的表做打散处理: select *,concat(id,'-','0 or 1 or 2') from A;t1 选择其中较小的表做扩容处理: select *,concat(id,'-','0') from B union all select *,concat(id,'-','1') from B union all select *,concat(id,'-','2') from B;t2 10.5 Hive job 优化 10.5.1 Hive Map阶段优化 1.复杂文件增加Map数量 1)使用场景:当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。 2)增加map数量的方法: computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M公式 调整maxSize最大值。让maxSize最大值低于blocksize就可以增加map的个数。 3)案例实操: ① 执行查询 hive (default)> select count(*) from emp; Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1 ② 设置最大切片值为100个字节 hive (default)> set mapreduce.input.fileinputformat.split.maxsize=100; hive (default)> select count(*) from emp; Hadoop job information for Stage-1: number of mappers: 6; number of reducers: 1 2. 小文件进行合并 1)在map执行前合并小文件,减少map数: CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。 HiveInputFormat没有对小文件合并功能。 hive(default)> set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; 2)在Map-Reduce的任务结束时合并小文件的设置: 在map-only任务结束时合并小文件,默认true hive(default)> SET hive.merge.mapfiles = true; 在map-reduce任务结束时合并小文件,默认false hive(default)> SET hive.merge.mapredfiles = true; 合并文件的大小,默认256M hive(default)> SET hive.merge.size.per.task = 268435456; 当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge hive(default)> SET hive.merge.smallfiles.avgsize = 16777216; 3. Map端聚合 set hive.map.aggr=true;//相当于map端执行combiner 10.5.2 Hive Reduce优化 1.合理设置Reduce数 1)调整reduce个数方法一 (1)每个Reduce处理的数据量默认是256MB hive(default)> set hive.exec.reducers.bytes.per.reducer=256000000 (2)每个任务最大的reduce数,默认为1009 hive(default)> set hive.exec.reducers.max=1009 (3)计算reducer数的公式 N=min(参数2,总输入数据量/参数1) 2)调整reduce个数方法二 通过参数配置的方式(三种)直接指定reduce的个数,参数mapreduce.job.reduces。 hive(default)> set mapreduce.job.reduces = 15; 3)reduce个数并不是越多 ① 过多的启动和初始化reduce也会消耗时间和资源; ② 另外,有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题; ③ 在设置reduce个数的时候也需要考虑这两个原则:处理大数据量利用合适的reduce数;使单个reduce任务处理数据量大小要合适; 10.5.3 Hive 任务整体优化 1. Fetch抓取 Fetch抓取是指,Hive中对某些情况的查询可以不必使用MapReduce计算。例如:SELECT * FROM emp;在这种情况下,Hive可以简单地读取emp对应的存储目录下的文件,然后输出查询结果到控制台。 在hive-default.xml.template文件中hive.fetch.task.conversion默认是more,老版本hive默认是minimal,该属性修改为more以后,在全局查找、字段查找、limit查找等都不走mapreduce。 <property> <name>hive.fetch.task.conversion</name> <value>more</value> <description> Expects one of [none, minimal, more]. Some select queries can be converted to single FETCH task minimizing latency. Currently the query should be single sourced not having any subquery and should not have any aggregations or distincts (which incurs RS), lateral views and joins. 0. none : disable hive.fetch.task.conversion 1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only 2. more : SELECT, FILTER, LIMIT only (support TABLESAMPLE and virtual columns) </description> </property> 1)案例实操: (1)把hive.fetch.task.conversion设置成none,然后执行查询语句,都会执行mapreduce程序。 hive (default)> set hive.fetch.task.conversion=none; hive (default)> select * from emp; hive (default)> select ename from emp; hive (default)> select ename from emp limit 3; (2)把hive.fetch.task.conversion设置成more,然后执行查询语句,如下查询方式都不会执行mapreduce程序。 hive (default)> set hive.fetch.task.conversion=more; hive (default)> select * from emp; hive (default)> select ename from emp; hive (default)> select ename from emp limit 3; 2. 本地模式 1)本地模式介绍 ① 大多数的Hadoop Job是需要Hadoop提供的完整的可扩展性来处理大数据集的。 ② 不过,有时Hive的输入数据量是非常小的。在这种情况下,为查询触发执行任务消耗的时间可能会比实际job的执行时间要多的多。 ③ 对于大多数这种情况,Hive可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。 ④ 用户可以通过设置hive.exec.mode.local.auto= true,来让Hive在适当的时候自动启动这个优化。 hive(default)> set hive.exec.mode.local.auto=true; //开启本地mr // 设置local mr的最大输入数据量,当输入数据量小于这个值时采用local mr的方式,默认为134217728,即128M set hive.exec.mode.local.auto.inputbytes.max=50000000; // 设置local mr的最大输入文件个数,当输入文件个数小于这个值时采用local mr的方式,默认为4 set hive.exec.mode.local.auto.input.files.max=10; 2)案例实操: ① 开启本地模式,并执行查询语句 hive (default)> set hive.exec.mode.local.auto=true; hive (default)> select * from emp cluster by deptno; …… Ended Job = job_local177532144_0001 …… Time taken: 1.328 seconds, Fetched: 14 row(s) ② 关闭本地模式,并执行查询语句 hive (default)> set hive.exec.mode.local.auto=false; hive (default)> select * from emp cluster by deptno; …… Starting Job = job_1634825444943_0018, Tracking URL = http://hadoop103:8088/proxy/application_1634825444943_0018/ …… Time taken: 20.09 seconds, Fetched: 14 row(s) 3. 并行执行 Hive会将一个查询转化成一个或者多个阶段。这样的阶段可以是MapReduce阶段、抽样阶段、合并阶段、limit阶段。或者Hive执行过程中可能需要的其他阶段。默认情况下,Hive一次只会执行一个阶段。不过,某个特定的job可能包含众多的阶段,而这些阶段可能并非完全互相依赖的,也就是说有些阶段是可以并行执行的,这样可能使得整个job的执行时间缩短。不过,如果有更多的阶段可以并行执行,那么job可能就越快完成。 通过设置参数hive.exec.parallel=true,就可以开启并发执行。不过,在共享集群中,需要注意下,如果job中并行阶段增多,那么集群利用率就会增加。 hive(default)> set hive.exec.parallel=true; //打开任务并行执行 hive(default)> set hive.exec.parallel.thread.number=16; //同一个sql允许最大并行度,默认为8。 当然,得是在系统资源比较空闲的时候才有优势,否则,没资源,并行也起不来。 4. 严格模式 1)介绍:Hive可以通过设置防止一些危险操作: 2)分区表不使用分区过滤 将hive.strict.checks.no.partition.filter=true时,对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行。换句话说,就是用户不允许扫描所有分区。进行这个限制的原因是,通常分区表都拥有非常大的数据集,而且数据增加迅速。没有进行分区限制的查询可能会消耗令人不可接受的巨大资源来处理这个表。 hive (default)> set hive.strict.checks.no.partition.filter=true; hive (default)> select * from dept_partition; FAILED: SemanticException [Error 10056]: Queries against partitioned tables without a partition filter are disabled for safety reasons. If you know what you are doing, please set hive.strict.checks.no.partition.filter to false and make sure that hive.mapred.mode is not set to 'strict' to proceed. Note that you may get errors or incorrect results if you make a mistake while using some of the unsafe features. No partition predicate for Alias "dept_partition" Table "dept_partition" 3)使用order by没有limit过滤 将hive.strict.checks.orderby.no.limit=true时,对于使用了order by语句的查询,要求必须使用limit语句。因为order by为了执行排序过程会将所有的结果数据分发到同一个Reducer中进行处理,强制要求用户增加这个LIMIT语句可以防止Reducer额外执行很长一段时间。 hive (default)> set hive.strict.checks.orderby.no.limit=true; hive (default)> select * from emp order by sal; FAILED: SemanticException 1:27 Order by-s without limit are disabled for safety reasons. If you know what you are doing, please set hive.strict.checks.orderby.no.limit to false and make sure that hive.mapred.mode is not set to 'strict' to proceed. Note that you may get errors or incorrect results if you make a mistake while using some of the unsafe features.. Error encountered near token 'sal' 4)笛卡尔积 将hive.strict.checks.cartesian.product=true时,会限制笛卡尔积的查询。对关系型数据库非常了解的用户可能期望在 执行JOIN查询的时候不使用ON语句而是使用where语句,这样关系数据库的执行优化器就可以高效地将WHERE语句转化成那个ON语句。不幸的是,Hive并不会执行这种优化,因此,如果表足够大,那么这个查询就会出现不可控的情况。 hive (default)> set hive.strict.checks.cartesian.product=true; hive (default)> select ename,deptno,dname from emp,dept; FAILED: SemanticException Cartesian products are disabled for safety reasons. If you know what you are doing, please set hive.strict.checks.cartesian.product to false and make sure that hive.mapred.mode is not set to 'strict' to proceed. Note that you may get errors or incorrect results if you make a mistake while using some of the unsafe features. 5.JVM重用 详见hadoop优化文档中jvm重用,小文件过多时使用。
10.4 数据倾斜
1.数据倾斜现象:
绝大多数任务都很快完成,只有一个或者少数几个任务执行的很慢甚至最终执行失败。
2.数据过量现象:
数据过量的表现为所有任务都执行的很慢,这个时候只有提高执行资源才可以优化HQL的执行效率。
3. 数据倾斜的原因:
导致倾斜的原因在于按照key分组后,少量的任务负载着绝大部分数据的计算,也就是说,产生数据倾斜的HQL中一定存在着分组的操作。所以从HQL的角度,我们可以将数据倾斜分为单表携带了Group by字段的查询和两表(多表)join的查询
10.4.1 单表数据倾斜优化
1. 使用参数优化
当任务中存在group by操作同时聚合函数为count或者sum可以设置参数来处理数据倾斜的问题,就是上文10.3节中的Group by处理方式。
① 是否在Map端进行聚合,默认为True
hive(default)> set hive.map.aggr = true
② 在Map端进行聚合操作的条目数目
hive(default)> set hive.groupby.mapaggr.checkinterval = 100000
③ 有数据倾斜的时候进行负载均衡(默认是false)
hive(default)> set hive.groupby.skewindata = true
2. 增加Reduce数量
当数据中的多个key同时导致数据倾斜,可以通过增加reduce的数量解决数据倾斜问题 官网信息
1)调整Reduce个数方法1:
① 每个Reduce处理的数据量默认是256MB
hive(default)> set hive.exec.reducers.bytes.per.reducer=256000000
② 每个任务最大的reduce数,默认为1009
hive(default)> set hive.exec.reducers.max=1009
③ 计算reducer数的公式
N=min(参数2,总输入数据量/参数1)
2)调整Reduce个数方法2:
通过参数配置的方式(三种)直接指定reduce的个数,参数mapreduce.job.reduces。
hive(default)> set mapreduce.job.reduces = 15;
10.4.2 join数据倾斜优化
1.使用参数
在编写 Join 查询语句时,如果确定是由于 join 出现的数据倾斜,那么请做如下设置:
# join的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
set hive.skewjoin.key=100000;
# 如果是join过程出现倾斜应该设置为true
set hive.optimize.skewjoin=false;
如果开启了,在Join过程中Hive会将计数超过阈值hive.skewjoin.key(默认100000)的倾斜key对应的行临时写进文件中,然后再启动另一个job做map join生成结果。通过 hive.skewjoin.mapjoin.map.tasks参数还可以控制第二个job的mapper数量,默认10000。
set hive.skewjoin.mapjoin.map.tasks=10000;
2. 大小表join
可以使用MapJoin,没有Reduce阶段就不会出现数据倾斜。详情见3.5节
3. 大表大表join
使用打散加扩容方式解决数据倾斜问题
选择其中较大的表做打散处理:
select *,concat(id,'-','0 or 1 or 2') from A;t1
选择其中较小的表做扩容处理:
select *,concat(id,'-','0') from B
union all
select *,concat(id,'-','1') from B
union all
select *,concat(id,'-','2') from B;t2
10.5 Hive job 优化
10.5.1 Hive Map阶段优化
1.复杂文件增加Map数量
1)使用场景:当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。
2)增加map数量的方法:
computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M公式
调整maxSize最大值。让maxSize最大值低于blocksize就可以增加map的个数。
3)案例实操:
① 执行查询
hive (default)> select count(*) from emp;
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
② 设置最大切片值为100个字节
hive (default)> set mapreduce.input.fileinputformat.split.maxsize=100;
hive (default)> select count(*) from emp;
Hadoop job information for Stage-1: number of mappers: 6; number of reducers: 1
2. 小文件进行合并
1)在map执行前合并小文件,减少map数:
CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。
HiveInputFormat没有对小文件合并功能。
hive(default)> set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
2)在Map-Reduce的任务结束时合并小文件的设置:
在map-only任务结束时合并小文件,默认true
hive(default)> SET hive.merge.mapfiles = true;
在map-reduce任务结束时合并小文件,默认false
hive(default)> SET hive.merge.mapredfiles = true;
合并文件的大小,默认256M
hive(default)> SET hive.merge.size.per.task = 268435456;
当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge
hive(default)> SET hive.merge.smallfiles.avgsize = 16777216;
3. Map端聚合
set hive.map.aggr=true;//相当于map端执行combiner
10.5.2 Hive Reduce优化
1.合理设置Reduce数
1)调整reduce个数方法一
(1)每个Reduce处理的数据量默认是256MB
hive(default)> set hive.exec.reducers.bytes.per.reducer=256000000
(2)每个任务最大的reduce数,默认为1009
hive(default)> set hive.exec.reducers.max=1009
(3)计算reducer数的公式
N=min(参数2,总输入数据量/参数1)
2)调整reduce个数方法二
通过参数配置的方式(三种)直接指定reduce的个数,参数mapreduce.job.reduces。
hive(default)> set mapreduce.job.reduces = 15;
3)reduce个数并不是越多
① 过多的启动和初始化reduce也会消耗时间和资源;
② 另外,有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;
③ 在设置reduce个数的时候也需要考虑这两个原则:处理大数据量利用合适的reduce数;使单个reduce任务处理数据量大小要合适;
10.5.3 Hive 任务整体优化
1. Fetch抓取
Fetch抓取是指,Hive中对某些情况的查询可以不必使用MapReduce计算。例如:SELECT * FROM emp;在这种情况下,Hive可以简单地读取emp对应的存储目录下的文件,然后输出查询结果到控制台。
在hive-default.xml.template文件中hive.fetch.task.conversion默认是more,老版本hive默认是minimal,该属性修改为more以后,在全局查找、字段查找、limit查找等都不走mapreduce。
<property>
<name>hive.fetch.task.conversion</name>
<value>more</value>
<description>
Expects one of [none, minimal, more].
Some select queries can be converted to single FETCH task minimizing latency.
Currently the query should be single sourced not having any subquery and should not have any aggregations or distincts (which incurs RS), lateral views and joins.
0. none : disable hive.fetch.task.conversion
1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only
2. more : SELECT, FILTER, LIMIT only (support TABLESAMPLE and virtual columns)
</description>
</property>
1)案例实操:
(1)把hive.fetch.task.conversion设置成none,然后执行查询语句,都会执行mapreduce程序。
hive (default)> set hive.fetch.task.conversion=none;
hive (default)> select * from emp;
hive (default)> select ename from emp;
hive (default)> select ename from emp limit 3;
(2)把hive.fetch.task.conversion设置成more,然后执行查询语句,如下查询方式都不会执行mapreduce程序。
hive (default)> set hive.fetch.task.conversion=more;
hive (default)> select * from emp;
hive (default)> select ename from emp;
hive (default)> select ename from emp limit 3;
2. 本地模式
1)本地模式介绍
① 大多数的Hadoop Job是需要Hadoop提供的完整的可扩展性来处理大数据集的。
② 不过,有时Hive的输入数据量是非常小的。在这种情况下,为查询触发执行任务消耗的时间可能会比实际job的执行时间要多的多。
③ 对于大多数这种情况,Hive可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。
④ 用户可以通过设置hive.exec.mode.local.auto= true,来让Hive在适当的时候自动启动这个优化。
hive(default)> set hive.exec.mode.local.auto=true; //开启本地mr
// 设置local mr的最大输入数据量,当输入数据量小于这个值时采用local mr的方式,默认为134217728,即128M
set hive.exec.mode.local.auto.inputbytes.max=50000000;
// 设置local mr的最大输入文件个数,当输入文件个数小于这个值时采用local mr的方式,默认为4
set hive.exec.mode.local.auto.input.files.max=10;
2)案例实操:
① 开启本地模式,并执行查询语句
hive (default)> set hive.exec.mode.local.auto=true;
hive (default)> select * from emp cluster by deptno;
……
Ended Job = job_local177532144_0001
……
Time taken: 1.328 seconds, Fetched: 14 row(s)
② 关闭本地模式,并执行查询语句
hive (default)> set hive.exec.mode.local.auto=false;
hive (default)> select * from emp cluster by deptno;
……
Starting Job = job_1634825444943_0018, Tracking URL = http://hadoop103:8088/proxy/application_1634825444943_0018/
……
Time taken: 20.09 seconds, Fetched: 14 row(s)
3. 并行执行
Hive会将一个查询转化成一个或者多个阶段。这样的阶段可以是MapReduce阶段、抽样阶段、合并阶段、limit阶段。或者Hive执行过程中可能需要的其他阶段。默认情况下,Hive一次只会执行一个阶段。不过,某个特定的job可能包含众多的阶段,而这些阶段可能并非完全互相依赖的,也就是说有些阶段是可以并行执行的,这样可能使得整个job的执行时间缩短。不过,如果有更多的阶段可以并行执行,那么job可能就越快完成。
通过设置参数hive.exec.parallel=true,就可以开启并发执行。不过,在共享集群中,需要注意下,如果job中并行阶段增多,那么集群利用率就会增加。
hive(default)> set hive.exec.parallel=true; //打开任务并行执行
hive(default)> set hive.exec.parallel.thread.number=16; //同一个sql允许最大并行度,默认为8。
当然,得是在系统资源比较空闲的时候才有优势,否则,没资源,并行也起不来。
4. 严格模式
1)介绍:Hive可以通过设置防止一些危险操作:
2)分区表不使用分区过滤
将hive.strict.checks.no.partition.filter=true时,对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行。换句话说,就是用户不允许扫描所有分区。进行这个限制的原因是,通常分区表都拥有非常大的数据集,而且数据增加迅速。没有进行分区限制的查询可能会消耗令人不可接受的巨大资源来处理这个表。
hive (default)> set hive.strict.checks.no.partition.filter=true;
hive (default)> select * from dept_partition;
FAILED: SemanticException [Error 10056]: Queries against partitioned tables without a partition filter are disabled for safety reasons. If you know what you are doing, please set hive.strict.checks.no.partition.filter to false and make sure that hive.mapred.mode is not set to 'strict' to proceed. Note that you may get errors or incorrect results if you make a mistake while using some of the unsafe features. No partition predicate for Alias "dept_partition" Table "dept_partition"
3)使用order by没有limit过滤
将hive.strict.checks.orderby.no.limit=true时,对于使用了order by语句的查询,要求必须使用limit语句。因为order by为了执行排序过程会将所有的结果数据分发到同一个Reducer中进行处理,强制要求用户增加这个LIMIT语句可以防止Reducer额外执行很长一段时间。
hive (default)> set hive.strict.checks.orderby.no.limit=true;
hive (default)> select * from emp order by sal;
FAILED: SemanticException 1:27 Order by-s without limit are disabled for safety reasons. If you know what you are doing, please set hive.strict.checks.orderby.no.limit to false and make sure that hive.mapred.mode is not set to 'strict' to proceed. Note that you may get errors or incorrect results if you make a mistake while using some of the unsafe features.. Error encountered near token 'sal'
4)笛卡尔积
将hive.strict.checks.cartesian.product=true时,会限制笛卡尔积的查询。对关系型数据库非常了解的用户可能期望在 执行JOIN查询的时候不使用ON语句而是使用where语句,这样关系数据库的执行优化器就可以高效地将WHERE语句转化成那个ON语句。不幸的是,Hive并不会执行这种优化,因此,如果表足够大,那么这个查询就会出现不可控的情况。
hive (default)> set hive.strict.checks.cartesian.product=true;
hive (default)> select ename,deptno,dname from emp,dept;
FAILED: SemanticException Cartesian products are disabled for safety reasons. If you know what you are doing, please set hive.strict.checks.cartesian.product to false and make sure that hive.mapred.mode is not set to 'strict' to proceed. Note that you may get errors or incorrect results if you make a mistake while using some of the unsafe features.
5.JVM重用
详见hadoop优化文档中jvm重用,小文件过多时使用。