hive优化

在学习hive的时候,就要像说下hive和hadoop集群之间的关系了,
Hive利用HDFS存储数据,利用MapReduce查询数据
hive最适合于数据仓库程序,对于数据仓库程序不需要实时响应查询,不需要记录级别的插入、更新和删除。因此hive不适用于联机事务处理,可以用于联机分析处理。
hive优化

hive优化

上图都是来解释hive的一个运行情况,

  • 用户可以使用JDBC、ODBC、CLI等连接hive
  • 需要开启Thrift Server 服务,这样会将hive当做一个服务器,用户作为客户端连接该服务器处理,
  • 通过Driver(驱动模块)对输入进行解析编译
  • hive通过JobTracker通信来初始化MapReduce任务(job)

hive的优化

可以从以下几点入手:

  • 设置map、reduce、及java堆内存的大小
    //每个节点生成动态分区的最大个数,默认是100
    set hive.exec.max.dynamic.partitions.pernode=10000;
    //一个DML操作可以创建的最大动态分区数,默认是1000
    set hive.exec.max.dynamic.partitions=100000;
    有时候内存溢出会报错,可以减小set mapred.max.split.size的值(增加map的数量),增加map内存
    set mapred.max.split.size=25600000;(切片大小的值不要随意更改)
    set mapreduce.map.memory.mb=8192;
    set mapreduce.reduce.memory.mb=8192;
    set mapred.child.java.opts=-Xmx6144m;

  • 并行执行
    set hive.exec.parallel=true;

  • 设置中间结果压缩

set mapred.map.output.compression.codec=org.apache.Hadoop.io.compress.SnappyCodec;
如果发生数据倾斜,可以尝试设置此参数
hive.groupby.skewindata=true

  • 配置如下参数,可以开启Hive的本地模式(使用本地模式执行可以使hive执行的更快些):
    set hive.exec.mode.local.auto=true;(默认为false)

    当一个job满足如下条件才能真正使用本地模式:
    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.merge.mapfiles; //设置map读取数据是合并小文件
    hive.exec.parallel; //任务并行执行
    hive.exec.reducers.bytes.per.reducer //多少个字节的数据产生一个reduce
    hive.exec.reducers.max //reduce的最大个数
    hive.exec.default.partition.name //hive默认分区名字,碰到值为空或者null,数据就到默认分区
    hive.exec.mode.local.au0to //决定Hive是否应该自动地根据输入文件大小,在本地运行
    hive.auto.convert.join //开关map join模式
    hive.groupby.skewindata //数据倾斜

  • 还有就是自己电脑的硬件问题了~