hive调优:

可以使用没有特殊设置的Hive,但如果想要了解Hive的属性,那么可以通过简单的设置来提升作业的性能。
●分区:HiveQL通过Where子句设置条件来提取所需数据。
由于Hive要访问文件,因此如果到特定日期的表中提取数据,那么会引用相关表对应文件夹中的所有文件。
通常在这种情况下要使用分区,分区会根据经常使用的某些条件(日期、时间、国家编码)进行细分,
在表下形成物理文件夹心通过使用创建表(Create Table)语句中的Partitioned By语句创建分区,
文件夹就会以<partition>=<value>的形式创建,并且多层次的分区也是可行的。
如果实现Select查询时将分区条件包含在Where子句中,那么Hive在读取属于表的整个文件夹时,
仅会访问满足给定条件的文件夹。大多数数据可以通过时间和编码标准信息划分,用户感兴趣的可能只是是特定条件下的数据,
因此精心设计的分区策略非常有助于减少作业执行时间。

●并行执行: 复杂的HiveQL通常会转化为多个MapReduce作业。它按默认顺序运行,但是有时会导致资源浪费。
hive. exec . parallel属性可以并行地执行独立作业。可以将其添加到hive-site.xml 文件,
或着使用set hive. exec.parallel=true命令来应用此选项。

●使用ORC文件:虽然执行HiveQL时只选择了一列,但是文件是基于行保存的,它会访问整行并读取不必要的数据,
所以性能会下降。列输入格式(例如ORC)用于改善这种情况。如果使用ORC,那么你会拥有很多优势,
例如摄写性能、轻松地享用存储空间压缩所节省的空间。
在创建(CREATE TABLE)的语法中指定STORED AS ORC,或修改表(ALTER TABLE)语句中添加SET FILEFORMAT ORC,
它还支持诸如SNAPPY或ZLIB等压缩方式。

●小文件问题: Hadoop专门为高容量系统设计,但是在处理大量分片小文件(而非大文件)时有两个问题。
这两个问题是NameNode内存问题和性能问题,它们都会影响MapReduce,在默认输入格式中,
如TextInputFormat,每个文件应该有至少一个分片。所以当启动大量mapper时,可能会导致JVM启动过载。
为了解决这个问题,需要把hive.hadoop.supports.splittable.combineinputformat配置设为true。
启用这个属性会提升性能,因为这样mapper可以处理多个文件。