基于Hadoop数据仓库Hive1.2部署及使用
接下来安装Hadoop数据仓库Hive,上节了解HBase简单使用,听起来HBase与Hive有些类似,概念也有点模糊,那我们先了解下他们之间有什么区别: HBase是一种分布式、面向列的NoSQL数据库,基于HDFS存储,以表的形式存储数据,表由行和列组成,列划分到列族中。HBase不提供类SQL查询语言,要想像SQL这样查询数据,可以使用Phonix,让SQL查询转换成hbase的扫描和对应的操作,也可以使用现在说讲Hive仓库工具,让HBase作为Hive存储。 Hive是运行在Hadoop之上的数据仓库,将结构化的数据文件映射为一张数据库表,提供简单类SQL查询语言,称为HQL,并将SQL语句转换成MapReduce任务运算。有利于利用SQL语言查询、分析数据,适于处理不频繁变动的数据。Hive底层可以是HBase或者HDFS存储的文件。 两者都是基于Hadoop上不同的技术,相互结合使用,可处理企业中不同类型的业务,利用Hive处理非结构化离线分析统计,利用HBase处理在线查询。 Hive三种元数据存储方式: 1>.本地derby存储,只允许一个用户连接Hive,适用于测试环境 2>.本地/远程MySQL存储,支持多用户连接Hive,适用于生产环境 三、Hive安装与配置(以下将元数据存储到远程MySQL配置) 1.在MySQL创建Hive元数据存放库和连接用户 1 2 3 mysql>createdatabasehive; mysql>grantallon*.*to 'hive' @ '%' identifiedby 'hive' ; mysql>flushprivileges; 2.安装与配置Hive(在HMaster0安装) 1 2 #tarzxvfapache-hive-1.2.0-bin.tar.gz #mvapache-hive-1.2.0-bin/opt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #vihive-site.xml <configuration> <!--以下是MySQL连接信息--> <property> <name>javax.jdo.option.ConnectionURL< /name > <value>jdbc:mysql: //192 .168.18.210:3306 /hive ?createDatabaseIfNotExist= true < /value > < /property > <property> <name>javax.jdo.option.ConnectionDriverName< /name > <value>com.mysql.jdbc.Driver< /value > < /property > <property> <name>javax.jdo.option.ConnectionUserName< /name > <value>hive_user< /value > < /property > <property> <name>javax.jdo.option.ConnectionPassword< /name > <value>hive_pass< /value > < /property > < /configuration > 3.配置系统变量 1 2 3 4 5 #vi/etc/profile HIVE_HOME= /opt/apache-hive-1 .2.0-bin PATH=$PATH:$HIVE_HOME /bin export HIVE_HOMEPATH #source/etc/profile 4.启动Hive 1 #hive--servicemetastore&#启动远程模式,否则你只能在本地登录 5.检查是否正常启动 查看进程是否启动: 1 2 3 4 5 6 7 [root@HMaster0~] #jps 2615DFSZKFailoverController 30027ResourceManager 29656NameNode 25451Jps 10270HMaster 14975RunJar #会启动一个RunJar进程 执行hive命令会进入命令界面: 1 2 3 4 5 6 [root@HMaster0~] #hive Logginginitializedusingconfiguration in file : /opt/apache-hive-1 .2.0-bin /conf/hive-log4j .properties hive>showdatabases; OK default Timetaken:0.986seconds,Fetched:1row(s) 查看数据库,默认有一个default库,现在就可以用你熟悉的SQL语言了。 6.客户端连接Hive(必须有Hadoop环境) 1 2 #tarzxvfapache-hive-1.2.0-bin.tar.gz #mvapache-hive-1.2.0-bin/opt 1 2 3 4 5 6 7 8 #vihive-site.xml <configuration> <!--通过thrift方式连接hive--> <property> <name>hive.metastore.uris< /name > <value>thrift: //192 .168.18.215:9083< /value > < /property > < /configuration > 配置好连接信息,连接命令行: 1 #/opt/apache-hive-1.2.0-bin/bin/hive 7.Hive常用SQL命令 7.1 先创建一个测试库 1 hive>createdatabase test ; 7.2 创建tb1表,并指定字段分隔符为tab键(否则会插入NULL) 1 hive>createtabletb1( id int,namestring)row format delimitedfieldsterminatedby '\t' 如果想再创建一个表,而且表结构和tb1一样,可以这样: 1 hive>createtabletb3liketb1; 查看下表结构: 1 2 3 4 5 hive>describetb3; OK id int namestring Timetaken:0.091seconds,Fetched:2row(s) 7.3 从本地文件中导入数据到Hive表 先创建数据文件,键值要以tab键空格: 1 2 3 4 #catkv.txt 1zhangsan 2lisi 3wangwu 再导入数据: 1 hive>loaddata local inpath '/root/kv.txt' overwriteintotabletb1; 7.4 从HDFS中导入数据到Hive表 1 2 3 4 5 #hadoopfs-cat/kv.txt#查看hdfs中要导入的数据 1zhangsan 2lisi 3wangwu hive>loaddatainpath '/kv.txt' overwriteintotabletb1; 7.5查询是否导入成功 1 2 3 4 5 6 hive> select *fromtb1; OK 1zhangsan 2lisi 3wangwu Timetaken:0.209seconds,Fetched:3row(s) 博客地址:http://lizhenliang.blog.51cto.com 上面是基本表的简单操作,为了提高处理性能,Hive引入了分区机制,那我们就了解分区表概念: 1>.分区表是在创建表时指定的分区空间 2>.一个表可以有一个或多个分区,意思把数据划分成块 3>.分区以字段的形式在表结构中,不存放实际数据内容 分区表优点:将表中数据根据条件分配到不同的分区中,缩小查询范围,提高检索速度和处理性能。 单分区表: 7.6创建单分区表tb2(HDFS表目录下只有一级目录): 1 hive>createtabletb2(idint,namestring)partitionedby(dtstring)row format delimitedfieldsterminatedby '\t' ; 注:dt可以理解为分区名称。 7.7从文件中把数据导入到Hive分区表,并定义分区信息 1 2 hive>loaddata local inpath '/root/kv.txt' intotabletb2partition(dt= '2015-06-26' ); hive>loaddata local inpath '/root/kv.txt' intotabletb2partition(dt= '2015-06-27' ); 7.8查看表数据 1 2 3 4 5 6 7 8 9 hive> select *fromtb2; OK 1zhangsan2015-06-26 2lisi2015-06-26 3wangwu2015-06-26 1zhangsan2015-06-27 2lisi2015-06-27 3wangwu2015-06-27 Timetaken:0.223seconds,Fetched:6row(s) 7.9查看HDFS仓库中表目录变化 1 2 3 4 5 #hadoopfs-ls-R/user/hive/warehouse/test.db/tb2 drwxr-xr-x-rootsupergroup02015-06-2604:12 /user/hive/warehouse/test .db /tb2/dt =2015-06-26 -rwxr-xr-x3rootsupergroup272015-06-2604:12 /user/hive/warehouse/test .db /tb2/dt =2015-06-26 /kv .txt drwxr-xr-x-rootsupergroup02015-06-2604:15 /user/hive/warehouse/test .db /tb2/dt =2015-06-27 -rwxr-xr-x3rootsupergroup272015-06-2604:15 /user/hive/warehouse/test .db /tb2/dt =2015-06-27 /kv .txt 可以看到tb2表导入的数据根据日期将数据划分到不同目录下。 多分区表: 7.10 创建多分区表tb3(HDFS表目录下有一级目录,一级目录下再有子级目录) 1 hive>createtabletb3(idint,namestring)partitionedby(dtstring,locationstring)rowformatdelimitedfieldsterminatedby '\t' ; 7.11从文件中把数据导入到Hive分区表,并定义分区信息 1 2 hive>loaddata local inpath '/root/kv.txt' intotabletb3partition(dt= '2015-06-26' ,location= 'beijing' ); hive>loaddata local inpath '/root/kv.txt' intotabletb3partition(dt= '2015-06-27' ,location= 'shanghai' ); 7.12 查看表数据 1 2 3 4 5 6 7 8 9 hive> select *fromtb3; OK 1zhangsan2015-06-26beijing 2lisi2015-06-26beijing 3wangwu2015-06-26beijing 1zhangsan2015-06-26shanghai 2lisi2015-06-26shanghai 3wangwu2015-06-26shanghai Timetaken:0.208seconds,Fetched:6row(s) 7.13查看HDFS仓库中表目录变化 1 <span style= "color:rgb(0,0,0);" > #hadoopfs-ls-R/user/hive/warehouse/test.db/tb3<br>drwxr-xr-x-rootsupergroup02015-06-2604:35/user/hive/warehouse/test.db/tb3/dt=2015-06-26<br>drwxr-xr-x-rootsupergroup02015-06-2604:35/user/hive/warehouse/test.db/tb3/dt=2015-06-26/location=beijing<br>-rwxr-xr-x3rootsupergroup272015-06-2604:35/user/hive/warehouse/test.db/tb3/dt=2015-06-26/location=beijing/kv.txt<br>drwxr-xr-x-rootsupergroup02015-06-2604:45/user/hive/warehouse/test.db/tb3/dt=2015-06-27<br>drwxr-xr-x-rootsupergroup02015-06-2604:45/user/hive/warehouse/test.db/tb3/dt=2015-06-27/location=shanghai<br>-rwxr-xr-x3rootsupergroup272015-06-2604:45/user/hive/warehouse/test.db/tb3/dt=2015-06-27/location=shanghai/kv.txt<br></span> 可以看到表中一级dt分区目录下又分成了location分区。 7.14查看表分区信息 1 hive>showpartitionstb2; 7.15 根据分区查询数据 1 hive> select namefromtb3wheredt= '2015-06-27' ; 7.16 重命名分区 1 hive>altertabletb3partition(dt= '2015-06-27' ,location= 'shanghai' )renametopartition(dt= '20150627' ,location= 'shanghai' ); 7.17 删除分区 1 hive>altertabletb3droppartition(dt= '2015-06-26' ,location= 'shanghai' ); 7.18模糊搜索表 1 hive>showtables 'tb*' ; 7.19给表新添加一列 1 hive>altertabletb1addcolumns(commnetstring); 7.20重命名表 1 hive>altertabletb1renametonew_tb1; 7.21删除表 1 hive>droptablenew_tb1; 8.启动过程中遇到错误 报错1: [ERROR]Terminal initialization failed; falling back to unsupported java.lang.IncompatibleClassChangeError:Found class jline.Terminal, but interface was expected 解决方法,将hive/lib下jline包拷贝到hadoop/yarn/lib下: 1 2 #cp/opt/apache-hive-1.2.0-bin/lib/jline-2.12.jar/opt/hadoop-2.6.0/share/hadoop/yarn/lib/ #rm/opt/hadoop-2.6.0/share/hadoop/yarn/lib/jline-0.9.94.jar 报错2: javax.jdo.JDOFatalInternalException:Error creating transactional connection factory 解决方法,在百度下载java连接MySQL包放到hive/lib下: 1 #cpmysql-connector-java-5.1.10-bin.jar/opt/apache-hive-1.2.0-bin/lib