Hive配置與操作實踐
Hive配置與操作實踐
@(Hadoop)
安裝hive
hive的安裝十分簡單,只需要在一臺伺服器上部署即可。
上傳hive安裝包,解壓縮,將其配入環境變數。
mysql的設定
在要作為後設資料庫的mysql伺服器上建立hive資料庫:
#建立資料庫
create database if not exists hive;
#設定遠端登入的許可權
GRANT ALL PRIVILEGES ON *.* TO `root`@`%` IDENTIFIED BY `root` WITH GRANT OPTION;
#重新整理配置
FLUSH PRIVILEGES;
或者建立專門訪問hive的使用者:
CREATE USER `hive`@`localhost` IDENTIFIED BY `hive`;
create database hive;
grant all on hive.* to hive@`%` identified by `hive`;
grant all on hive.* to hive@`localhost` identified by `hive`;
flush privileges;
並將mysql jdbc驅動放入hive/lib目錄下。
配置檔案修改
進入conf目錄,修改配置檔案:
cp hive-env.sh.template hive-env.sh
cp hive-default.xml.template hive-default.xml
cp hive-log4j.properties.template hive-log4j.properties
cp hive-exec-log4j.properties.template hive-exec-log4j.properties
在hive-env.sh檔案中配置hadoop的home目錄。
新建hive-site.xml檔案
hive-site.xml:
<configuration>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/usr/local/hive/iotmp</value>
</property>
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
</property>
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/usr/local/hive/iotmp</value>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/usr/local/hive/iotmp</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/usr/local/hive/iotmp</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!--mysql後設資料庫配置-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?characterEncoding=UTF-8</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
<!--遠端mysql後設資料庫-->
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://localhost:9083</value>
</property>
</configuration>
根據續期就進行修改。
注意:低版本的hive**檔案BUG:搜尋auth,改為auth**
之後需要建立/usr/local/hive/iotmp資料夾
hive-log4j.properties:
#修改預設的日誌存在路徑
hive.log.dir=
hive-exec-log4j.properties:
#修改預設的日誌存在路徑
hive.log.dir=
錯誤與異常記錄
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient
一般是沒執行hive –service metastore,重新執行即可。
常用命令
建表(預設是內部表)
create table trade_detail(id bigint, account string, income double, expenses double,
time string) row format delimited fields terminated by ` `;
建表時要指定欄位之間的分隔符。
建分割槽表
create table td_part(id bigint, account string, income double, expenses double, time
string) partitioned by (logdate string) row format delimited fields terminated by ` `;
除了執行欄位分隔符 之外還要指定分割槽欄位。
建外部表
create external table td_ext(id bigint, account string, income double, expenses
double, time string) row format delimited fields terminated by ` ` location `/td_ext`;
通過external關鍵字來建立外部表,location來指定要關聯的hdfs檔案系統的位置。
分割槽表載入資料
load data local inpath `./book.txt` overwrite into table book partition
(pubdate=`2010-08-22`);
使用sqoop將mysql的資料匯入到hive表中
sqoop先將資料匯入到hdfs中,在呼叫hive的命令load到hive表中,所以要配置hive的環境變數。
在hive當中建立兩張表
create table trade_detail (id bigint, account string, income double,
expenses double, time string) row format delimited fields terminated by ` `;
create table user_info (id bigint, account string, name string, age int) row format delimited fields terminated by ` `;
將mysq當中的資料直接匯入到hive當中
sqoop import --connect jdbc:mysql://192.168.61.130:3306/cloud --username
root --password JChubby123 --table trade_detail --hive-import --hive-overwrite --hive-table trade_detail --fields-terminated-by ` `
sqoop import --connect jdbc:mysql://192.168.61.130:3306/cloud --username
root --password JChubby123 --table user_info --hive-import --hive-overwrite --hive-table user_info -- fields-terminated-by ` `
建立一個result表儲存前一個sql執行的結果
create table result row format delimited fields terminated by ` ` as select t2.account, t2.name, t1.income, t1.expenses, t1.surplus from user_info t2 join (select account, sum(income) as income, sum(expenses) as expenses, sum(income-expenses) as surplus from trade_detail group by account) t1 on (t1.account = t2.account);
使用自定義的UDF函式
像傳統資料庫中的儲存過程一樣,自定義的UDF函式有輸入和輸出。當hive的函式不能滿足業務需求的時候就需要自定義UDF函式來進行任務執行。
- 引入hive和hadoop common的jar包
- 自定義類,並繼承自UDF類
- 定義UDF函式,統一命名為evaluate,如:public Text evaluate(Text in)輸入和輸出要使用hadoop io的基本型別,因為其也要走mr任務和網路傳輸
- 將其打包成jar並上傳到裝有hive的機器中
- 在hive shell中執行命令將jar包中的函式新增進去
自定義函式呼叫過程:
- 新增jar包(在hive命令列裡面執行)
hive> add jar /root/NUDF.jar; - 建立臨時函式
hive> create temporary function getNation as ‘NationUDF’;
函式要寫成包括包名的全名稱 - 呼叫
hive> select id, name, getNation(nation) from beauty; - 將查詢結果儲存到HDFS中
create table result row format delimited fields terminated by ‘ ’ as select id, getNation
(nation) from beauties;
基本資料型別
基本的資料型別參考:
http://blog.csdn.net/chenxingzhen001/article/details/20901045
1.27更新
配置hive1.2.1版本的時候出現一個問題,如下:
Exception in thread "main"java.lang.RuntimeException: java.lang.IllegalArgumentException:java.net.URISyntaxException: Relative path in absolute URI:${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
atorg.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:444)
atorg.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:672)
atorg.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:616)
atsun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
atjava.lang.reflect.Method.invoke(Method.java:606)
atorg.apache.hadoop.util.RunJar.main(RunJar.java:160)
Caused by: java.lang.IllegalArgumentException:java.net.URISyntaxException: Relative path in absolute URI:${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
atorg.apache.hadoop.fs.Path.initialize(Path.java:148)
atorg.apache.hadoop.fs.Path.<init>(Path.java:126)
atorg.apache.hadoop.hive.ql.session.SessionState.createSessionDirs(SessionState.java:487)
atorg.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:430)
... 7more
Caused by: java.net.URISyntaxException:Relative path in absolute URI:${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
atjava.net.URI.checkPath(URI.java:1804)
atjava.net.URI.<init>(URI.java:752)
atorg.apache.hadoop.fs.Path.initialize(Path.java:145)
... 10more
解決方式:
在HIVE_HOME目錄下新建一個iotmp資料夾,
在hive-site.xml檔案中,搜尋所有包含system:java.io.tmpdir的配置項,將其value屬性改為iotmp的路徑儲存即可。
hive無法讀取配置檔案的問題
hive部署之後,hive-site.xml中配置的是連線到遠端的mysql資料庫。
HIVE_HOME已配置到.bash_profile檔案中,但是直接執行hive命令的時候發現,同一個人在不同路徑下執行竟然看到的表資料是不一樣的!
於是開始排查異常,切換各個不同的目錄執行hive命令,但是看到的資料都不一樣,而且發現每個目錄下都會生成derby後設資料庫的檔案資訊,於是猜想hive連線的是本地的derby資料庫,但是配置檔案裡面明明設定的是連線遠端mysql資料庫。
進入conf目錄再次執行hive命令,一切正常,將hive-site.xml檔案複製到任意目錄,再次執行hive,一切正常。
說明當不在conf目錄下執行hive命令的時候,hive指令碼找不到hive-site.xml檔案。
再次仔細檢查各種環境變數,一切正常,HADOOP_HOME、HIVE_HOME、HIVE_CONF_DIR等已經都在hive-env.sh中配置好了。
檢視hive指令碼的程式碼,發現裡面會先跑一個hive-config.sh,於是又開啟該檔案檢視,沒發現什麼異常,直接export HIVE_CONF_DIR寫死在裡面,儲存退出,執行hive,仍然不行。
作者:@小黑
相關文章
- spark2.2.0 配置spark sql 操作hiveSparkSQLHive
- Hive的安裝與配置Hive
- Hadoop實戰:Hive操作使用HadoopHive
- Atlas 2.1.0 實踐(3)—— Atlas整合HIveHive
- hive編寫udf實踐記錄Hive
- Hive效能調優實踐 - VidhyaHive
- Hive 常用操作Hive
- Hive基本操作Hive
- hive學習之三:專案中的hive優化實踐Hive優化
- Docker CheatSheet | Docker 配置與實踐清單Docker
- hive on spark配置HiveSpark
- 【Hive一】Hive安裝及配置Hive
- Hive 內建操作符與函式開發——深入淺出學HiveHive函式
- Chrome Extension 開發中的 Tab 操作與實踐Chrome
- Hive高階操作-查詢操作Hive
- 騰訊雲操作實踐
- Hive安裝配置Hive
- Hive表的基本操作Hive
- hive02_SQL操作HiveSQL
- Spring Boot自動配置原理與實踐(一)Spring Boot
- Spring Boot自動配置原理與實踐(二)Spring Boot
- Arctic 基於 Hive 的流批一體實踐Hive
- Hive常用效能優化方法實踐全面總結Hive優化
- Hive中配置與編寫自定義UDF函式Hive函式
- 整合Lotus Quickr 8.5 for Domino 與 IBM ECM:配置與最佳實踐UIIBM
- json-server的實踐與自定義配置化JSONServer
- 【PY】Jupyter Notebook 安裝與配置 實踐教程
- logback1.3.x配置詳解與實踐
- 網路硬體搭建與配置實踐(第2版)
- Nuxt 3 路由系統詳解:配置與實踐指南UX路由
- Nestjs最佳實踐教程(七): 批次操作與軟刪除JS
- HIVE的安裝配置Hive
- Hive中新增自定義函式(UDF)方法及實踐Hive函式
- Hive學習之基本操作Hive
- Spark操作Hive分割槽表SparkHive
- hive03_高階操作Hive
- hive04_DQL操作Hive
- Zend OPcache 最佳實踐配置opcache