hive测试 - wbwangk/wbwangk.github.io GitHub Wiki

hortonworks hive教程

用ambari安装hive

1.为hive准备存储元数据的数据库

参考postgres入门文档
通过Ambari部署hive。在向导页面上,选择使用现有的postgreSQL数据库存放Hive的元数据。Ambari安装时自动安装了一个postgreSQL数据库。需要为hive创建额外的数据库hive和用户hive。

在Ambari-server所在的节点(u1401)上执行:

$ sudo -u postgres psql
postgres=# CREATE USER hive WITH PASSWORD 'vagrant';              (新建一个数据库用户hive,密码是vagrant)
CREATE ROLE
postgres=# CREATE DATABASE hive OWNER hive;                       (创建用户数据库hive,并指定所有者为hive)
CREATE DATABASE
postgre=# \q                                                      (退出)

postgresql数据库默认是不允许从远程客户端访问它的。为了让hive可以远程访问postgres,还要修改postgresql的配置文件:,在文件的最后添加配置项。如果是在ubuntu下:

$ echo "host all all 0.0.0.0 0.0.0.0 md5" >> /etc/postgresql/9.3/main/pg_hba.conf
$ /etc/init.d/postgresql restart            (重启postgresql)

centos7下的操作:

$ echo "host all all 0.0.0.0 0.0.0.0 md5" >> /var/lib/pgsql/data/pg_hba.conf
$ service postgresql restart

2.ambari安装hive的向导

在Hive Matestore参数页中选择“Existing PostgreSQL Database”。
然后输入其他参数:

Database Name : hive
Database Username : hive
Database Password : vagrant   vagrant
JDBC Driver Class : org.postgresql.Driver
Database URL : jdbc:postgresql://u1401.ambari.apache.org:5432/hive

点击Test connection按钮测试数据库连接。如果测试不通过,可以尝试下一节的配置ambari JDBC驱动。
之后出现输入ambari admin主体和密码。在主体输入:root/[email protected]

3.(可选)配置ambari server JDBC驱动

安装hive的向导页面可能出现提示配置ambari serverjdbc驱动,则需要在u1401(ambari server安装节点)上执行:

$ wget -P /usr/share/java https://jdbc.postgresql.org/download/postgresql-42.1.1.jar
$ ambari-server setup --jdbc-db=postgres --jdbc-driver=/usr/share/java/postgresql-42.1.1.jar
$ ambari-server restart
$ service postgresql restart

hive视图

Ambari提供了HDFS、Hive等视图功能,提供了用户与HDFS、Hive的交互界面。
刚进入Hive视图,检查报错,提示userhome不存在。如,用admin登录Ambari,userhome是/user/admin。需要手工创建这个HDFS中的目录。估计以后的Ambari版本会解决这个缺陷。

$ kinit -kt /etc/security/keytabs/hdfs.headless.keytab hdfs-hdp1
$ hdfs dfs -mkdir /user/admin
$ hdfs dfs -chown admin /user/admin

hdp1是集群id。
创建了上述userhome后,ambari hive view就可以运行正常了。

碰到的问题

测试环境是启用kerberos的HDP 2.5.3。
执行hive试图进入交互环境:

$ hive
Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
(略)
Caused by: MetaException(message:Could not connect to meta store using any of the URIs provided. Most recent failure: org.apache.thrift.transport.TTransportException: GSS initiate failed

推测是因为没有登录kerberos。于是用root/admin(kerberos管理员)账号登录后执行hive:

$ kinit root/admin
$ hive
Exception in thread "main" java.lang.RuntimeException: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="/user/root":hdfs:hdfs:drwxr-xr-x

提示hdfs中没有"/user/root"目录。
下面用hdfs的特权用户登录kerberos,创建"/user/root"目录,并修改拥有者为root:

$ kinit -kt /etc/security/keytabs/hdfs.headless.keytab hdfs-hdp1
$ hdfs dfs -mkdir /user/root
$ hdfs dfs -chown root /user/root
$ hive 
Exception in thread "main" java.lang.RuntimeException: org.apache.tez.dag.api.SessionNotRunning: TezSession has already shutdown. Application application_1498799080862_0006 failed 2 times due to AM Container for appattempt_1498799080862_0006_000002 exited with  exitCode: -1000
main : run as user is hdfs
main : requested yarn user is hdfs
Requested user hdfs is banned

把上述的hdfs用户换成yarn、root、hive、webb等都试过,要么被ban,要么就是用户不存在。

用beeline测试hive

环境:centos7.3 kerberized HDP 2.6.1.0
beeline是hive2新加的命令行工具,原命令行工具hive已经不建议使用。实际上我的环境中hive不能正常执行,只能用beeline。(下文中的beeline>只是提高可读性的标示)

$ kinit -kt  /etc/security/keytabs/hive.service.keytab hive/[email protected]
$ beeline -u "jdbc:hive2://c7302.ambari.apache.org:10000/default;principal=hive/[email protected]"
beeline> show tables;
+-----------+--+
| tab_name  |
+-----------+--+
+-----------+--+
No rows selected (0.11 seconds)
beeline> CREATE TABLE pokes (foo INT, bar STRING);
beeline> SHOW TABLES;
+-----------+--+
| tab_name  |
+-----------+--+
| pokes     |
+-----------+--+

hive的home目录由hive-default.xml配置文件中hive.metastore.warehouse.dir参数控制,默认是/apps/hive/warehouse
创建完表后可以去看一下HDFS中的/apps/hive/warehouse目录:

$ hdfs dfs -ls /apps/hive/warehouse
Found 1 items
drwxrwxrwx   - hive hdfs          0 2017-07-04 02:58 /apps/hive/warehouse/pokes

多的两个文件就是新创建的hive表。
加载文件到hive表:

beeline> LOAD DATA LOCAL INPATH '/opt/data-files-ini1.txt' OVERWRITE INTO TABLE pokes;

hive导入文件的分隔符比较奇怪,在vi中显示为^A(ASCCI码的1):

1^A35
48^Afour
100^A100

在beeline命令行中查看表的内容:

beeline> SELECT a.foo,a.bar FROM pokes a;
+--------+--------+--+
| a.foo  | a.bar  |
+--------+--------+--+
| 1      | 35     |
| 48     | four   |
| 100    | 100    |
+--------+--------+--+

通过beeline命令行中创建一个能接收csv格式导入的表:

beeline> create table student_csv
beeline> (sid int, sname string, gender string, language int, math int, english int)
beeline> row format delimited fields terminated by ',' stored as textfile;

编辑一个t.csv文件,内容是:

4,Rose,M,78,77,76
5,Mike,F,99,98,98

通过beeline命令行导入该文件:

beeline> LOAD DATA LOCAL INPATH '/opt/t.csv' INTO TABLE student_csv;
beeline> select * from student_csv;
+----------------+------------------+-------------------+---------------------+-----------------+--------------------+--+
|student_csv.sid |student_csv.sname |student_csv.gender |student_csv.language |student_csv.math |student_csv.english |
+----------------+------------------+-------------------+---------------------+-----------------+--------------------+--+
| 4              | Rose             | M                 | 78                  | 77              | 76                 |
| 5              | Mike             | F                 | 99                  | 98              | 98                 |
+----------------+------------------+-------------------+---------------------+-----------------+--------------------+--+

从hive中导出数据到HDFS的/tmp/hdfs_out:

beeline> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM pokes a;

从hive中导出数据到操作系统的/tmp/hdfs_out:

beeline> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM pokes a;

【碰到的问题】:如果用hdfs用户登录kerberos,执行上述beeline导出命令,报错:

main : run as user is hdfs
main : requested yarn user is hdfs
Requested user hdfs is banned

定义被ban用户清单的配置问题是/etc/hadoop/config/container-executor.cfg:

banned.users=hdfs,yarn,mapred,bin

选择用hive用户登录后问题解决。

导出的文件以^A为分隔符。导出的文件名是000000_0。两次导出输出到了同一个文件。