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 '\t';

建表時要指定字段之間的分隔符。

建分區表

create table td_part(id bigint, account string, income double, expenses double, time string) partitioned by (logdate string) row format delimited fields terminated by '\t';

除了執行字段分隔符 之外還要指定分區字段。

建外部表

create external table td_ext(id bigint, account string, income double, expenses double, time string) row format delimited fields terminated by '\t' 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 '\t';

create table user_info (id bigint, account string, name string, age int) row format delimited fields terminated by '\t';

將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 '\t'

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 '\t'

創建一個result表保存前一個sql執行的結果

create table result row format delimited fields terminated by '\t' 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函數來進行任務執行。

  1. 引入hive和hadoop common的jar包
  2. 自定義類,並繼承自UDF類
  3. 定義UDF函數,統一命名為evaluate,如:public Text evaluate(Text in)輸入和輸出要使用hadoop io的基本類型,因為其也要走mr任務和網絡傳輸
  4. 將其打包成jar並上傳到裝有hive的機器中
  5. 在hive shell中執行命令將jar包中的函數添加進去

自定義函數調用過程:

  1. 添加jar包(在hive命令行里面執行)
    hive> add jar /root/NUDF.jar;
  2. 創建臨時函數
    hive> create temporary function getNation as ‘NationUDF’;
    函數要寫成包括包名的全名稱
  3. 調用
    hive> select id, name, getNation(nation) from beauty;
  4. 將查詢結果保存到HDFS中
    create table result row format delimited fields terminated by ‘\t’ 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,仍然不行。

作者:@小黑


免責聲明!

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



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