1. 程式人生 > 實用技巧 >hive的配置和HQL的查詢優化

hive的配置和HQL的查詢優化

hive屬於一種類SQL資料庫

配置資訊

 pwd =>/opt/bigdata/hadoop/hive110/conf

 hive110/conf/hive-site.xml配置

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/opt/bigdata/hadoop/hive110/warehouse</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionURL</name>mysql
    <value>jdbc:mysql://20.0.0.100:3306/hive110?createDatabaseIfNotExist=true</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
  </property>
  <!--本地連線,code為mysql密碼-->
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>code</value>
  </property>
  <property>
    <name>hive.server2.thrift.client.user</name>
    <value>root</value>
  </property>
  <property>
    <name>hive.server2.thrift.client.password</name>
    <value>root</value>
  </property>
</configuration>

 將mysql-java驅動拷貝到 hive110/lib中

  cp /opt/install/hadoop/mysql-connector-java-5.1.38.jar ./

 # hive環境變數

  export HIVE_HOME=/opt/bigdata/hive110
  export PATH=$PATH:$HIVE_HOME/bin:$PATH

 # 初始化hive
  ./schematool -dbType mysql -initSchema

 # 啟動hive訪問hiveserver(hive110/bin)

  ./hive
  nohup hiveserver2 >/dev/null 2>&1 & #啟動server2服務


  beeline -u jdbc:hive2://200.0.0.100:10000

取消繁瑣的日誌資訊

  臨時beeline  set hive.server2.logging.operation.level=NONE;

  永久配置 

<property>
	<name>hive.server2.logging.operation.enabled</name>
	<value>true</value>
</property>
<property>
	<name>hive.server2.logging.operation.level</name>
	<value>NONE</value>
</property>
<property>
	<name>hive.server2.logging.operation.log.location</name>
	<value>/opt/bigdata/hadoop/hive110/oprlog</value>
</property>

查詢優化(原理:減少mapreduce)

資料傾斜(key 不均,業務資料本身特性,建表設計,SQL命令)

1、小表join大表——mapjoin map端完成join
  select /*+MAPJOIN(smalltalbe)*/ key,...from smalltable join bigtable on ...
     --hive0.11版本之後預設開啟
     hive.auto.convert.join=true 預設
     hive.mapjoin.smalltable.filesize=2500000(25Mb) 預設(可以改變小表的上限值 最多為一個檔案片(128Mb)大小)

2、大表join大表單key值0或null居多(改null/0鍵值)
  解決方案:--將key值為0或者NULL的key修改為自定義的key或者通過系統自動生成的時間戳或隨機數
    select if(field is NULL,'null',field)
    select if(field is NULL,unix_timestamp(),field)
    select if(field)is NULL,rand(),field)

3、group by 維度過小 ,某分組資料過多
  hive.map.aggr=true map端完成conbiner
  hive.groupby.skewindata=true  會再開一個mapreduce 第一個mapreduce做conbiner 然後作為第二個mapreduce的入口

4、count distinct(sum(1) group by... 來替換) null值單獨處理後union
  sum(1) group by... 來替換