本节书摘来自华章社区《Hadoop大数据分析与挖掘实战》一书中的第3章,第3.1节概述,作者张良均 樊哲 赵云龙 李成华 ,更多章节内容可以访问云栖社区“华章社区”公众号查看
3.1 概述3.1.1 Hive简介Hive最初是应Facebook每天产生的海量新兴社会网络数据进行管理和机器学习的需求而产生和发展的,是建立在Hadoop上的数据仓库基础构架。作为Hadoop的一个数据仓库工具,Hive可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能。Hive作为构建在Hadoop之上的数据仓库,它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。Hive定义了简单的类SQL查询语言,称为HQL,它允许熟悉SQL的用户查询数据。同时,该语言也允许熟悉MapReduce的开发者开发自定义的Mapper和Reducer来处理内建的Mapper和Reducer无法完成的复杂的分析工作。Hive没有专门的数据格式。Hive可以很好地工作在Thrift之上,控制分隔符,也允许用户指定数据格式。Hive具有以下特点:支持索引,加快数据查询。不同的存储类型,如纯文本文件、HBase中的文件。将元数据保存在关系数据库中,大大减少了在查询过程中执行语义检查的时间。可以直接使用存储在Hadoop文件系统中的数据。内置大量用户函数UDF来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF函数来完成内置函数无法实现的操作。类SQL的查询方式,将SQL查询转换为MapReduce的Job在Hadoop集群上执行。Hive构建在基于静态批处理的Hadoop之上,Hadoop通常都有较高的延迟并且在作业提交和调度时需要大量的开销。因此,Hive并不能够在大规模数据集上实现低延迟快速的查询。例如,Hive在几百MB的数据集上执行查询一般有分钟级的时间延迟。因此,Hive并不适合那些需要低延迟的应用,如联机事务处理(OLTP)。Hive查询操作过程严格遵守Hadoop MapReduce的作业执行模型,Hive将用户的HiveQL语句通过解释器转换为MapReduce作业提交到Hadoop集群上,Hadoop监控作业执行过程,然后返回作业执行结果给用户。Hive并非为联机事务处理而设计,Hive并不提供实时的查询和基于行级的数据更新操作。Hive的最佳使用场合是大数据集的批处理作业,如网络日志分析。3.1.2 Hive安装与配置使用表3-1中的软件版本进行配置。
<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>admin</value> </property> <property> <name>hive.exec.local.scratchdir</name> <value>/data/hive/scratchdir</value> </property> <property> <name>hive.downloaded.resources.dir</name> <value>/data/hive/resourcesdir</value> </property> <property> <name>hive.querylog.location</name> <value>/data/hive/querylog</value> </property> <property> <name>hive.server2.logging.operation.log.location</name> <value>/data/hive/operation</value> </property> </configuration>这里默认MySQL已经装好并配置完成(这里需要先在MySQL数据库中建立hive数据库)。 3)修改/etc/profile文件,添加必要变量。内容如下:export HADOOP_HOME=/opt/hadoop-2.6.0 export HIVE_HOME=/opt/apache-hive-1.2.1-bin export PATH=$PATH:$HIVE_HOME/bin4)复制相关jar包。 ①把MySQL驱动包拷贝到Hive的lib目录。cp /opt/mysql-connector-java-5.1.25-bin.jar $HIVE_HOME/lib/②将Hive jline包拷贝到Hadoop的Yarn lib目录,并删除Hadoop Yarn lib目录对应的jline包。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.jar3.启动Hive命令行 Hive配置完成后,使用如下命令在$HIVE_HOME/bin目录启动Hive。\[root@slave2 bin\]# ./hive启动后,终端会输出类似下面的信息:\[root@slave2 bin\]# ./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>同时,查看MySQL表中的Hive数据库,可以看到Hive建立的meta表,如图3-1所示。
如果出现下面的错误,即说明配置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}/${system:user.name} 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) 相关资源:敏捷开发V1.0.pptx