Hive基礎(2)---(啟動HiveServer2)Hive嚴格模式


 

啟動方式

1, hive  命令行模式,直接輸入/hive/bin/hive的執行程序,或者輸入 hive –service cli

       用於linux平台命令行查詢,查詢語句基本跟mysql查詢語句類似

2, hive  web界面的啟動方式,hive –service hwi  

      用於通過瀏覽器來訪問hive,【沒多大用途】

3, hive  遠程服務 (端口號10000) 啟動方式,nohup hive –service hiveserver  & 

      用java等程序實現通過jdbc等驅動的訪問hive就用這種起動方式了,這個是程序員最需要的方式了

 

  也可以自己指定端口 hive --service hiveserver -p 50000 &  (&表示后台運行)

  輸入完這些指令后終端就在運行hiveserver了,會卡住不動。其實已經在運行了,不用擔心

 

hive嚴格模式 

啟動命令 :nohup hive --service hiveserver2 --hiveconf hive.mapred.mode=strict & 

         hive提供了一個嚴格模式,可以防止用戶執行那些可能產生意想不到的不好的效果的查詢。即某些查詢在嚴格
模式下無法執行。通過設置hive.mapred.mode的值為strict,可以禁止3中類型的查詢。


1)帶有分區的表的查詢
        如果在一個分區表執行hive,除非where語句中包含分區字段過濾條件來顯示數據范圍,否則不允許執行。換句話說,
就是用戶不允許掃描所有的分區。進行這個限制的原因是,通常分區表都擁有非常大的數據集,而且數據增加迅速。
       如果沒有進行分區限制的查詢可能會消耗令人不可接受的巨大資源來處理這個表:
       hive> SELECT DISTINCT(planner_id) FROM fracture_ins WHERE planner_id=5;
       FAILED: Error in semantic analysis: No Partition Predicate Found for Alias "fracture_ins" Table "fracture_ins


       如下這個語句在where語句中增加了一個分區過濾條件(也就是限制了表分區):
       hive> SELECT DISTINCT(planner_id) FROM fracture_ins
       > WHERE planner_id=5 AND hit_date=20120101;
       ... normal results ...


 2)帶有orderby的查詢
         對於使用了orderby的查詢,要求必須有limit語句。因為orderby為了執行排序過程會講所有的結果分發到同一個reducer中
  進行處理,強烈要求用戶增加這個limit語句可以防止reducer額外執行很長一段時間:
hive> SELECT * FROM fracture_ins WHERE hit_date>2012 ORDER BY planner_id;
FAILED: Error in semantic analysis: line 1:56 In strict mode,
limit must be specified if ORDER BY is present planner_id


        只需要增加limit語句就可以解決這個問題:
hive> SELECT * FROM fracture_ins WHERE hit_date>2012 ORDER BY planner_id
        > LIMIT 100000;
        ... normal results ...


  3)限制笛卡爾積的查詢
         對關系型數據庫非常了解的用戶可能期望在執行join查詢的時候不使用on語句而是使用where語句,這樣關系數據庫的執行
  優化器就可以高效的將where語句轉換成那個on語句。不幸的是,hive不會執行這種優化,因此,如果表足夠大,那么這個查詢就會
  出現不可控的情況:
  hive> SELECT * FROM fracture_act JOIN fracture_ads
> WHERE fracture_act.planner_id = fracture_ads.planner_id;
FAILED: Error in semantic analysis: In strict mode, cartesian product
is not allowed. If you really want to perform the operation,
+set hive.mapred.mode=nonstrict+


        下面這個才是正確的使用join和on語句的查詢:
hive> SELECT * FROM fracture_act JOIN fracture_ads
        > ON (fracture_act.planner_id = fracture_ads.planner_id);
        ... normal results ...

 

 

 

 

 

 

調試啟動

 

 hive -hiveconf hive.root.logger=DEBUG,console


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM