大数据技术--实验04-Hive的安装与使用【实测可行】
Hive的安装与使用(实测可行)

1. 配置Vmware虚拟机
参考第2章的配置,配置好虚拟机。
这里在机器slave2上安装MySQL,在master上安装Hive服务端,在slave1上安装Hive客户端。此外,由于此前Hadoop是以Hadoop用户安装的,为了保持一致,避免用户交叉出现不必要的用户权限问题,Hive服务端和Hive客户端以Hadoop用户安装,MySQL属于被外来访问的,可以用root用户安装。
2. 安装MySQL
先安装MySQL:
a. 检查是否已安装,grep的-i选项表示匹配时忽略大小写
[root@slave2 ~]# rpm -qa|grep -i mysql
mysql-libs-5.1.66-2.el6_3.x86_64
*可见已经安装了库文件,应该先卸载,不然会出现覆盖错误。注意卸:载时使用了--nodeps选项,忽略了依赖关系:
[root@slave2 ~]# rpm -e mysql-libs-5.1.66-2.el6_3.x86_64 –nodeps
b. 添加mysql组和mysql用户,用于设置mysql安装目录文件所有者和所属组。
[root@slave2 ~]# groupadd mysql
[root@slave2 ~]# useradd -r -g mysql mysql
*useradd -r参数表示mysql用户是系统用户,不可用于登录系统。
c. 将二进制文件解压到指定的安装目录,我们这里指定为/usr/local
[root@slave2 ~]# cd /usr/local
[root@master MySQL]# scp -r mysql-5.5.55-linux2.6-x86_64.tar.gz root@slave2:/usr/local
[root@slave2 local]# tar -zxvf mysql-5.5.55-linux2.6-x86_64.tar.gz –C ./
*加压后在/usr/local/生成了解压后的文件夹mysql-5.5.29-linux2.6-x86_64,这名字太长,我们为它建立一个符号链接mysql,方便输入。
[root@slave2 local]# ln -s mysql-5.5.55-linux2.6-x86_64 mysql
d. /usr/local/mysql/下的目录结构
|
Directory |
Contents of Directory |
|
bin |
Client programs and the mysqld server |
|
data |
Log files, databases |
|
docs |
Manual in Info format |
|
man |
Unix manual pages |
|
include |
Include (header) files |
|
lib |
Libraries |
|
scripts |
mysql_install_db |
|
share |
Miscellaneous support files, including error messages, sample configuration files, SQL for database installation |
|
sql-bench |
Benchmarks |
e. 进入mysql文件夹,也就是mysql所在的目录,并更改所属的组和用户。
[root@slave2 local]# cd mysql
[root@slave2 local]# chown -R mysql:mysql ./
f. 执行mysql_install_db脚本,对mysql中的data目录进行初始化并创建一些系统表格。注意mysql服务进程mysqld运行时会访问data目录,所以必须由启动mysqld进程的用户(就是我们之前设置的mysql用户)执行这个脚本,或者用root执行,但是加上参数--user=mysql。
[root@slave2 mysql]# ./scripts/mysql_install_db --user=mysql
*将mysql/目录下除了data/目录的所有文件,改回root用户所有,mysql用户只需作为mysql/data/目录下所有文件的所有者。
[root@slave2 mysql]# chown -R root:root ./
[root@slave2 mysql]# chown -R mysql:mysql data
g. 复制配置文件
[root@slave2 mysql]# cp support-files/my-medium.cnf /etc/my.cnf
h. 将mysqld服务加入开机自启动项。
*首先需要将scripts/mysql.server服务脚本复制到/etc/init.d/,并重命名为mysqld。
[root@slave2 mysql]# cp support-files/mysql.server /etc/init.d/mysqld
*通过chkconfig命令将mysqld服务加入到自启动服务项中。
[root@slave2 mysql]# chkconfig --add mysqld
*注意服务名称mysqld就是我们将mysql.server复制到/etc/init.d/时重命名的名称。
*查看是否添加成功
[root@slave2 mysql]# chkconfig --list mysqld
mysql 0:off 1:off 2:on 3:on 4:on 5:on 6:off
i. 重启系统,mysqld就会自动启动了。
*检查是否启动
[root@slave2 mysql]# netstat -anp|grep mysqld
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 3407/mysqld
unix 2 [ ACC ] STREAM LISTENING 31928 3407/mysqld /tmp/mysql.soc
*如果不想重新启动,那可以直接手动启动。
[root@slave2 mysql]# service mysqld start
Starting MySQL.Logging to '/usr/local/mysql/data/slave2.err'.
......... SUCCESS!
j. 运行客户端程序mysql,在mysql/bin目录中,测试能否连接到mysqld。
[root@slave2 mysql]# bin/mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.55-log MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> quit
Bye
*此时会出现mysql>命令提示符,可以输入sql语句,输入quit或exit退出。为了避免每次都输入mysql的全路径/usr/local/mysql/bin/mysql,可将其加入环境变量中,在/etc/profile最后加入两行命令:
export MYSQL_HOME=/usr/local/mysql
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$MYSQL_HOME/bin:$PATH
这样就可以在shell中直接输入mysql命令来启动客户端程序了
[root@slave2 mysql]#mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.55-log MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> quit
*创建hive表和查看
mysql> create database hive;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hive |
| mysql |
| performance_schema |
| test |
+--------------------+
mysql> use hive
Database changed
mysql> show tables;
Empty set (0.00 sec)
7. 修改mysql的root用户密码,root初始密码为空的:
[root@slave2 mysql]# ./bin/mysqladmin -u root password '123456'
此时我们就可以通过 mysql -u root -p 命令来登录我们的mysql数据库了
8. 授权远程连接
如果你想root使用123456从任何主机连接到mysql服务器的话。
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
3. 下载并配置Hive
1)在Hive的官网http://mirrors.cnnic.cn/apache/hive/ 下载Hive,其文件为:apache-hive-1.2.1-bin.tar.gz。下载后解压到slave2机器。
[hadoop@master Hive]$ tar -zxvf apache-hive-1.2.1-bin.tar.gz -C /home/hadoop/local/opt/
注:本书上是装在root用户下,但是此前hadoop是安装在Hadoop用户下的,为了避免权限交叉出现异常,我们装在hadoop用户下。不管怎么安装,但一定要保持用户的一致性。
2)在master机器进行配置即可。配置文件在$HIVE_HOME/conf文件夹里面。拷贝hive-default.xml.template文件到hive-site.xml文件,修改内容如下:
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://slave2:3306/hive?characterEncoding=UTF-8</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>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/home/hadoop/local/var/hive/scratchdir</value>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/home/hadoop/local/var/hive/resourcesdir</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/home/hadoop/local/var/hive/querylog</value>
</property>
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/home/hadoop/local/var/hive/operation</value>
</property>
</configuration>
这里还要在slave1上安装Hive客户端,所以首先复制Hive目录至slave1:
[hadoop@master ~]$ scp -r /home/hadoop/local/opt/apache-hive-1.2.1-bin hadoop@slave1: /home/hadoop/local/opt/
修改hive-site.xml文件,修改内容如下:
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://master:9083</value>
</property>
</configuration>
3)修改/etc/profile文件,添加必要变量。
export HADOOP_HOME=/home/hadoop/local/opt/hadoop-2.6.0
export HIVE_HOME=/home/hadoop/local/opt/apache-hive-1.2.1-bin
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$HIVE_HOME/bin:$PATH
注:为了配合Hive客户端,slave1也要做如此修改。
4)拷贝相关jar包:
①把MySQL驱动包拷贝到Hive的lib目录。
[root@master MySQL]# tar -zxvf mysql-connector-java-5.1.41.tar.gz -C /home/hadoop/local/opt/
[root@master mysql-connector-java-5.1.41]# cp mysql-connector-java-5.1.41-bin.jar $HIVE_HOME/lib/
②把MySQL驱动包拷贝到Hive的lib目录。
cp $HIVE_HOME/lib/jline-2.12.jar $HADOOP_HOME/share/hadoop/yarn/lib/
rm -rf $HADOOP_HOME/share/hadoop/yarn/lib/jline-0.9.94.jar
注:为了配合Hive客户端,slave1也要做如此修改。
4. 启动Hive命令行
Hive配置完成后,在Hive服务端(即master)上的$HIVE_HOME/bin目录启动Hive,使用命令:
[hadoop@master apache-hive-1.2.1-bin]$ ./hive
启动后,终端会输出类似下面的信息:
[hadoop@master apache-hive-1.2.1-bin]$./hive
Logging initialized using configuration in jar:file:/home/hadoop/local/opt/apache-hive-1.2.1-bin/lib/hive-common-1.2.1.jar!/hive-log4j.properties
hive>
同时,查看MySQL表中的Hive数据库,可以看到Hive的建立的meta表,如右图。
Use hive;

注意:如果出现下面的错误,即说明配置Hive出错,参考上面的配置即可:
[ERROR] Terminal initialization failed; falling back to unsupported
java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected
at jline.TerminalFactory.create(TerminalFactory.java:101)
at jline.TerminalFactory.get(TerminalFactory.java:158)
at jline.console.ConsoleReader.<init>(ConsoleReader.java:229)
at jline.console.ConsoleReader.<init>(ConsoleReader.java:221)
at jline.console.ConsoleReader.<init>(ConsoleReader.java:209)
at org.apache.hadoop.hive.cli.CliDriver.setupConsoleReader(CliDriver.java:787)
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
at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:444)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:672)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:616)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.apache.hadoop.util.RunJar.main(RunJar.java:212)
如果要在Hive客户端(即master)上的$HIVE_HOME/bin目录启动Hive,则首先在Hive服务端启动metastore服务:
[hadoop@master apache-hive-1.2.1-bin]$ hive --service metastore &
启动后多一个RunJar进程:
[hadoop@master apache-hive-1.2.1-bin]$ jps
7363 SecondaryNameNode
7182 NameNode
12282 Jps
7509 ResourceManager
10541 RunJar
然后在Hive客户端启动Hive:
[hadoop@slave1 apache-hive-1.2.1-bin]$ ./hive
效果与Hive服务端启动Hive是一样的。
注:以下在Hive服务器和Hive客户端实测都没有异常,注意Hadoop用户和数据目录的修改。此外,启动Hive前,一定要先启动Hadoop,因为Hive是基于Hadoop之上的。
5. Hive表实践
实践一 Hive 内部表
1)下载“02-上机实验/visits_data.txt”文件,并查看数据。
[root@slave2 opt]# head -n 5 visits_data.txt
BUCKLEY SUMMER 10/12/2010 14:48 10/12/2010 14:45 WH
CLOONEY GEORGE 10/12/2010 14:47 10/12/2010 14:45 WH
PRENDERGAST JOHN 10/12/2010 14:48 10/12/2010 14:45 WH
LANIER JAZMIN 10/13/2010 13:00 WH BILL SIGNING/
MAYNARD ELIZABETH 10/13/2010 12:34 10/13/2010 13:00 WH BILL SIGNING/
visits_data.txt数据一共包含6列,分别对应名字,姓,访问时间,计划访问时间,地点,备注,使用“\t”进行分隔。
2)下载“02-上机实验/visits.hive”,并查看。
[root@ slave2 opt]# cat visits.hive
--cat visits.hive
create table people_visits (
last_name string,
first_name string,
arrival_time string,
scheduled_time string,
meeting_location string,
info_comment string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t' ;
上述代码是Hive中新建表的代码,使用上述代码即可建立Hive中的表。
3)使用Hive命令,建立Hive的people_visits表。
root@ slave2 bin]# ./hive -f /opt/visits.hive
Logging initialized using configuration in jar:file:/opt/apache-hive-1.2.1-bin/lib/hive-common-1.2.1.jar!/hive-log4j.properties
OK
Time taken: 2.391 seconds
4)使用hive shell命令行,查看生产的表。
[root@ slave2 ~]# hive
Logging initialized using configuration in jar:file:/opt/apache-hive-1.2.1-bin/lib/hive-common-1.2.1.jar!/hive-log4j.properties
hive> show tables;
OK
people_visits
Time taken: 1.344 seconds, Fetched: 1 row(s)
hive> describe people_visits ;
OK
last_name string
first_name string
arrival_time string
scheduled_time string
meeting_location string
info_comment string
Time taken: 0.338 seconds, Fetched: 6 row(s)
这里可以看到刚才建立的表,以及表的描述。
5)插入数据。
①使用查询命令来查看表中的数据:
hive> select * from people_visits limit 10;
OK
Time taken: 0.863 seconds
可以看到表中是没有数据的。
②使用hadoop fs命令,拷贝visits_data.txt到HDFS的/user/hive/warehouse/people_visits目录中。
[root@ slave2 opt]# hadoop fs -put visits_data.txt /user/hive/warehouse/people_visits
[root@ slave2 opt]# hadoop fs -ls /user/hive/warehouse/people_visits
-rw-r--r-- 3 root supergroup 989239 2015-08-17 10:30 /user/hive/warehouse/people_visits/visits_data.txt
③再次查看数据:
hive> select * from people_visits limit 5;
OK
BUCKLEY SUMMER 10/12/2010 14:48 10/12/2010 14:45 WH
CLOONEY GEORGE 10/12/2010 14:47 10/12/2010 14:45 WH
PRENDERGAST JOHN 10/12/2010 14:48 10/12/2010 14:45 WH
LANIER JAZMIN 10/13/2010 13:00 WH BILL SIGNING/
MAYNARD ELIZABETH 10/13/2010 12:34 10/13/2010 13:00 WH BILL SIGNING/
Time taken: 0.155 seconds, Fetched: 5 row(s)
可以看到已经查看到数据了。
6)使用MR进行查询。
hive> select count(*) from people_visits;
Query ID = root_20150817103724_d20ca51d-06ca-4efb-be59-6f66aec97489
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
set mapreduce.job.reduces=<number>
Starting Job = job_1439775378077_0003, Tracking URL = http://node101:8088/proxy/application_1439775378077_0003/
Kill Command = /opt/hadoop-2.6.0/bin/hadoop job -kill job_1439775378077_0003
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2015-08-17 10:37:33,759 Stage-1 map = 0%, reduce = 0%
2015-08-17 10:37:41,432 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 2.11 sec
2015-08-17 10:37:48,932 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 4.57 sec
MapReduce Total cumulative CPU time: 4 seconds 570 msec
Ended Job = job_1439775378077_0003
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 4.57 sec HDFS Read: 996387 HDFS Write: 6 SUCCESS
Total MapReduce CPU Time Spent: 4 seconds 570 msec
OK
17977
Time taken: 25.92 seconds, Fetched: 1 row(s)
这里看到查询所有行数,这里使用了MR查询。
7)删除people_visits表。
hive> drop table people_visits;
OK
Time taken: 1.355 seconds
hive> dfs -ls /user/hive/warehouse/people_visits;
ls: `/user/hive/warehouse/people_visits': No such file or directory
Command failed with exit code = 1
Query returned non-zero code: 1, cause: null
这里看到删除表之后,HDFS上面的数据也被删掉了。
实践二 Hive 外部表
1)拷贝“02-上机实验/names.txt”到客户端机器/opt目录下,并上传至HDFS。
[root@ slave2 ~]# hadoop fs -put /opt/names.txt /user/root/names.txt
[root@ slave2 ~]# hadoop fs -ls /user/root/names.txt
-rw-r--r-- 3 root supergroup 78 2015-08-17 11:11 /user/root/names.txt
[root@ slave2 ~]#
2)在HDFS上新建/user/root/hivedemo文件夹。
[root@ slave2 ~]# hadoop fs -mkdir /user/root/hivedemo
3)新建Hive外部表,并指定数据存储位置为/user/root/hivedemo。
hive> create external table names(id int,name string)
> ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
> LOCATION '/user/root/hivedemo';
OK
Time taken: 0.206 seconds
4)把数据导入到Hive的外部表names表中。
hive> load data inpath '/user/root/names.txt' into table names;
Loading data to table default.names
Table default.names stats: [numFiles=0, numRows=0, totalSize=0, rawDataSize=0]
OK
Time taken: 0.451 seconds
5)查看表中的数据。
hive> select * from names;
OK
0 Rich
1 Barry
2 George
3 Ulf
4 Danielle
5 Tom
6 manish
7 Brian
8 Mark
Time taken: 0.102 seconds, Fetched: 9 row(s)
hive> dfs -ls hivedemo;
Found 1 items
-rwxr-xr-x 3 root supergroup 78 2015-08-17 11:11 hivedemo/names.txt
hive> dfs -ls /user/hive/warehouse;
这里可以看到表中是有数据的,同时数据存储在指定的/user/root/hivedemo中,并没有存储在默认的/user/hive/warehouse中;
6)删除表。
hive> drop table names;
OK
Time taken: 0.136 seconds
hive> show tables;
OK
Time taken: 0.049 seconds
hive> dfs -ls hivedemo;
Found 1 items
-rwxr-xr-x 3 root supergroup 78 2015-08-17 11:11 hivedemo/names.txt
这里可以看到虽然表已经被删除了,但是HDFS上面的数据并没有被删除。
更多推荐
所有评论(0)