详解Hive的架构、工作原理及安装步骤

来源:互联网 发布:下列属于网络系统安全 编辑:程序博客网 时间:2024/05/22 01:47

转:http://blog.csdn.net/u010330043/article/details/51225021


一、Hive是什么?

   Hive 是基于 Hadoop 构建的一套数据仓库分析系统,它提供了丰富的 SQL 查询方式来分析存储在 Hadoop 分布式文件系统中的数据, 可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能,可以将 SQL 语句转换为 MapReduce 任务进行运行,通过自己的 SQL 去 查询分析需要的内容,这套 SQL 简称 Hive SQL。
  

二、理解Hive 架构

  Hive 架构可以分为四部分。 
  
  这里写图片描述 

  • 用户接口

      Hive 对外提供了三种服务模式,即 Hive 命令行模式(CLI),Hive 的 Web 模式(WUI),Hive 的远程服务(Client)。下面介绍这些服务的用法。
    1、 Hive 命令行模式
      Hive 命令行模式启动有两种方式。执行这条命令的前提是要配置 Hive 的环境变量。
       1) 进入 /home/hadoop/app/hive 目录,执行如下命令。

    ./hive

       2) 直接执行命令。

     hive - -service cli

      Hive 命令行模式用于 Linux 平台命令行查询,查询语句基本跟 MySQL 查询语句类似,运行结果如下所示。

<code class="hljs perl has-numbering">[hadoop<span class="hljs-variable">@ywendeng</span> hive]$ hivehive> show tables;OKstockstock_partitiontstTime taken: <span class="hljs-number">1.088</span> seconds, Fetched: <span class="hljs-number">3</span> row(<span class="hljs-keyword">s</span>)hive> <span class="hljs-keyword">select</span> * from tst;OKTime taken: <span class="hljs-number">0</span>.<span class="hljs-number">934</span> secondshive> <span class="hljs-keyword">exit</span>;[hadoop<span class="hljs-variable">@djt11</span> hive]$</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

2、Hive Web 模式

Hive Web 界面的启动命令如下。

hive - -service hwi

通过浏览器访问 Hive,默认端口为 9999。

<code class="hljs applescript has-numbering">异常:<span class="hljs-number">16</span>/<span class="hljs-number">05</span>/<span class="hljs-number">31</span> <span class="hljs-number">20</span>:<span class="hljs-number">24</span>:<span class="hljs-number">52</span> FATAL hwi.HWIServer: HWI WAR <span class="hljs-type">file</span> <span class="hljs-keyword">not</span> found <span class="hljs-keyword">at</span> /home/hadoop/app/hive/home/hadoop/app/hive/lib/hive-hwi-<span class="hljs-number">0.12</span><span class="hljs-number">.0</span>.war解决办法:将hive-default.xml 文件中关于hwi的配置文件拷贝到hive-site.xml文件中示例:    <<span class="hljs-keyword">property</span>>        <<span class="hljs-property">name</span>>hive.hwi.war.<span class="hljs-type">file</span></<span class="hljs-property">name</span>>        <value>lib/hive-hwi-<span class="hljs-number">0.12</span><span class="hljs-number">.0</span>-SNAPSHOT.war</value>        <description>This sets <span class="hljs-keyword">the</span> <span class="hljs-command">path to</span> <span class="hljs-keyword">the</span> HWI war <span class="hljs-type">file</span>, relative <span class="hljs-keyword">to</span> ${HIVE_HOME}. </description>   </<span class="hljs-keyword">property</span>>      <<span class="hljs-keyword">property</span>>        <<span class="hljs-property">name</span>>hive.hwi.listen.host</<span class="hljs-property">name</span>>        <value><span class="hljs-number">0.0</span><span class="hljs-number">.0</span><span class="hljs-number">.0</span></value>        <description>This <span class="hljs-keyword">is</span> <span class="hljs-keyword">the</span> host address <span class="hljs-keyword">the</span> Hive Web Interface will listen <span class="hljs-function_start"><span class="hljs-keyword">on</span></span></description>      </<span class="hljs-keyword">property</span>>      <<span class="hljs-keyword">property</span>>        <<span class="hljs-property">name</span>>hive.hwi.listen.port</<span class="hljs-property">name</span>>        <value><span class="hljs-number">9999</span></value>        <description>This <span class="hljs-keyword">is</span> <span class="hljs-keyword">the</span> port <span class="hljs-keyword">the</span> Hive Web Interface will listen <span class="hljs-function_start"><span class="hljs-keyword">on</span></span></description>      </<span class="hljs-keyword">property</span>>  </code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

3、 Hive 的远程服务

远程服务(默认端口号 10000)启动方式命令如下,“nohup…&” 是 Linux 命令,表示命令在后台运行。

<code class="hljs lasso has-numbering">nohup hive <span class="hljs-subst">-</span> <span class="hljs-attribute">-service</span> hiveserver2 <span class="hljs-subst">&</span> <span class="hljs-comment">//在Hive 0.11.0版本之后,提供了HiveServer2服务</span></code><ul class="pre-numbering"><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

Hive 远程服务通过 JDBC 等访问来连接 Hive ,这是程序员最需要的方式。

<code class="hljs brainfuck has-numbering"><span class="hljs-comment">hive</span>  <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-comment">service</span> <span class="hljs-comment">hiveserver2</span> <span class="hljs-comment">&</span>   <span class="hljs-comment">//默认端口10000</span><span class="hljs-comment">hive</span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-comment">service</span> <span class="hljs-comment">hiveserver2</span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-comment">hiveconf</span> <span class="hljs-comment">hive</span><span class="hljs-string">.</span><span class="hljs-comment">server2</span><span class="hljs-string">.</span><span class="hljs-comment">thrift</span><span class="hljs-string">.</span><span class="hljs-comment">port</span> <span class="hljs-comment">10002</span> <span class="hljs-comment">&</span>  <span class="hljs-comment">//可以通过命令行直接将端口号改为10002</span></code><ul class="pre-numbering"><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

hive的远程服务端口号也可以在hive-default.xml文件中配置,修改hive.server2.thrift.port对应的值即可。

<code class="hljs vhdl has-numbering">< <span class="hljs-keyword">property</span>>    < name>hive.server2.thrift.<span class="hljs-keyword">port</span>< /name>    < value><span class="hljs-number">10000</span>< /value>    < description><span class="hljs-keyword">Port</span> number <span class="hljs-keyword">of</span> HiveServer2 Thrift interface <span class="hljs-keyword">when</span> hive.server2.<span class="hljs-keyword">transport</span>.mode <span class="hljs-keyword">is</span> <span class="hljs-attribute">'binary</span>'.< /description>< /<span class="hljs-keyword">property</span>></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

Hive 的 JDBC 连接和 MySQL 类似,如下所示。

<code class="hljs java has-numbering"><span class="hljs-keyword">import</span> java.sql.Connection;<span class="hljs-keyword">import</span> java.sql.DriverManager;<span class="hljs-keyword">import</span> java.sql.SQLException;<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HiveJdbcClient</span> {</span>    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> String driverName = <span class="hljs-string">"org.apache.hive.jdbc.HiveDriver"</span>;<span class="hljs-comment">//hive驱动名称  hive0.11.0之后的版本</span>    <span class="hljs-comment">//private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";//hive驱动名称  hive0.11.0之前的版本</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span>  <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) <span class="hljs-keyword">throws</span> SQLException {        <span class="hljs-keyword">try</span>{            Class.forName(driverName);        }<span class="hljs-keyword">catch</span>(ClassNotFoundException e){            e.printStackTrace();            System.exit(<span class="hljs-number">1</span>);        }        <span class="hljs-comment">//第一个参数:jdbc:hive://djt11:10000/default  连接hive2服务的连接地址</span>        <span class="hljs-comment">//第二个参数:hadoop  对HDFS有操作权限的用户</span>        <span class="hljs-comment">//第三个参数:hive  用户密码  在非安全模式下,指定一个用户运行查询,忽略密码</span>        Connection con = DriverManager.getConnection(<span class="hljs-string">"jdbc:hive://djt11:10000/default"</span>, <span class="hljs-string">"hadoop"</span>, <span class="hljs-string">""</span>);        System.out.print(con.getClientInfo());    }}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>
  • 元数据存储

      Hive 将元数据存储在 RDBMS 中,一般常用 MySQL 和 Derby。默认情况下,Hive 元数据保存在内嵌的 Derby 数据库中,只能允许一个会话连接,只适合简单的测试。实际生产环境中不适用, 为了支持多用户会话,则需要一个独立的元数据库,使用 MySQL 作为元数据库,Hive 内部对 MySQL 提供了很好的支持,配置一个独立的元数据库需要增加以下步骤。

1) 安装 mysql 数据库。
  准备工作 ,需要根据你的linux 系统版本下载对应的MySQL rpm 包。

<code class="hljs lasso has-numbering">    rpm <span class="hljs-attribute">-qa</span> <span class="hljs-subst">|</span> grep mysql<span class="hljs-comment">//查看当前系统是否已经安装了mysql </span>    rpm <span class="hljs-attribute">-e</span> mysql<span class="hljs-attribute">-libs</span><span class="hljs-subst">-</span><span class="hljs-number">5.1</span><span class="hljs-number">.66</span><span class="hljs-subst">-</span><span class="hljs-number">2.</span>el6_3<span class="hljs-built_in">.</span>i686 <span class="hljs-subst">--</span>nodeps<span class="hljs-comment">//如果已经安装则删除,否则滤过此步骤</span>    rpm <span class="hljs-attribute">-ivh</span> MySQL<span class="hljs-attribute">-server</span><span class="hljs-subst">-</span><span class="hljs-number">5.1</span><span class="hljs-number">.73</span><span class="hljs-subst">-</span><span class="hljs-number">1.</span>glibc23<span class="hljs-built_in">.</span>i386<span class="hljs-built_in">.</span>rpm     rpm <span class="hljs-attribute">-ivh</span> MySQL<span class="hljs-attribute">-client</span><span class="hljs-subst">-</span><span class="hljs-number">5.1</span><span class="hljs-number">.73</span><span class="hljs-subst">-</span><span class="hljs-number">1.</span>glibc23<span class="hljs-built_in">.</span>i386<span class="hljs-built_in">.</span>rpm </code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

2) 启动 mysql 服务。

<code class="hljs sql has-numbering">[root@ywendeng app]# service mysqld <span class="hljs-operator"><span class="hljs-keyword">start</span>Initializing MySQL <span class="hljs-keyword">database</span>:  Installing MySQL system tables...OKFilling help tables...OK<span class="hljs-keyword">To</span> <span class="hljs-keyword">start</span> mysqld <span class="hljs-keyword">at</span> boot <span class="hljs-keyword">time</span> you have <span class="hljs-keyword">to</span> copysupport-files/mysql.server <span class="hljs-keyword">to</span> the <span class="hljs-keyword">right</span> place <span class="hljs-keyword">for</span> your system</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

3) 设置 mysql 的 root 密码。

MySQL在刚刚被安装的时候,它的 root 用户是没有被设置密码的。首先来设置 MySQL 的 root 密码。

<code class="hljs oxygene has-numbering">[root@ywendeng  app]# mysql -u root -pEnter password:           <span class="hljs-comment">//默认密码为空,输入后回车即可</span>Welcome <span class="hljs-keyword">to</span> the MySQL monitor.  Commands <span class="hljs-keyword">end</span> <span class="hljs-keyword">with</span> ; <span class="hljs-keyword">or</span> \g.Your MySQL connection id <span class="hljs-keyword">is</span> <span class="hljs-number">3</span>Server version: <span class="hljs-number">5.1</span>.<span class="hljs-number">73</span> Source distributionCopyright (c) <span class="hljs-number">2000</span>, <span class="hljs-number">2013</span>, Oracle <span class="hljs-keyword">and</span>/<span class="hljs-keyword">or</span> its affiliates. All rights reserved.mysql><span class="hljs-keyword">set</span> password <span class="hljs-keyword">for</span> root@localhost=password(<span class="hljs-string">'root'</span>); 密码设置为root</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

4) 为 Hive 建立相应的 Mysql 账户,并赋予足够的权限。

<code class="hljs coffeescript has-numbering">[root<span class="hljs-property">@ywendeng</span>  app]<span class="hljs-comment"># mysql -u root -p root</span>mysql>create user <span class="hljs-string">'hive'</span> identified <span class="hljs-keyword">by</span> <span class="hljs-string">'hive'</span>;   <span class="hljs-regexp">//</span>创建一个账号:用户名为hive,密码为hivemysql> grant all <span class="hljs-literal">on</span> *.* to <span class="hljs-string">'hive'</span>@<span class="hljs-string">'localhost'</span> identified <span class="hljs-keyword">by</span> <span class="hljs-string">'hive'</span>;  <span class="hljs-regexp">//</span>将权限授予host为localhost的hive用户<span class="hljs-regexp">//</span>说明:(执行下面的语句  *.*:所有库下的所有表   %:任何IP地址或主机都可以连接)<span class="hljs-regexp">//g</span>rant all <span class="hljs-literal">on</span> *.* to <span class="hljs-string">'hive'</span>@<span class="hljs-string">'%'</span> identified <span class="hljs-keyword">by</span> <span class="hljs-string">'hive'</span>;  <span class="hljs-regexp">//</span>将权限授予host为的hive用户Query OK, <span class="hljs-number">0</span> rows affected (<span class="hljs-number">0.00</span> sec)mysql> flush privileges;Query OK, <span class="hljs-number">0</span> rows affected (<span class="hljs-number">0.00</span> sec)</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

备注:查看host 和user 之间的关系——在mysql 库中的user 表

<code class="hljs sql has-numbering">use mysql;//使用数据库<span class="hljs-operator"><span class="hljs-keyword">select</span> host,<span class="hljs-keyword">user</span> <span class="hljs-keyword">from</span> <span class="hljs-keyword">user</span>;</span></code><ul class="pre-numbering"><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

如果 hive 账户无法登陆。为hive@ywendeng 设置密码。

<code class="hljs ruby has-numbering">[root<span class="hljs-variable">@ywendeng</span> ~]<span class="hljs-comment">#mysql -u root -p root</span>mysql>set password <span class="hljs-keyword">for</span> hive<span class="hljs-variable">@localhost</span>=password(<span class="hljs-string">'hive'</span>);</code><ul class="pre-numbering"><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

5) 建立 Hive 专用的元数据库,记得用刚才创建的 “hive” 账号登录,命令如下。

<code class="hljs scss has-numbering"><span class="hljs-attr_selector">[root@ywendeng ~]</span><span class="hljs-id">#mysql</span> -u hive -<span class="hljs-tag">p</span> <span class="hljs-comment">//用hive用户登录,密码hive</span>Enter password<span class="hljs-value">: mysql> create database hive;</span>   <span class="hljs-comment">//创建数据库的名称为hive</span>Query OK, 1 row affected (0<span class="hljs-class">.00</span> sec)</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

6) 找到Hive安装目录 conf/下的 hive-site.xml文件,修改以下几个属性。

<code class="hljs xml has-numbering">[hadoop@ywendeng conf]$ vi hive-site.xml<span class="hljs-tag">< <span class="hljs-attribute">property</span>></span>    <span class="hljs-tag">< <span class="hljs-attribute">name</span>></span>javax.jdo.option.ConnectionDriverName<span class="hljs-tag">< /<span class="hljs-attribute">name</span>></span>    <span class="hljs-tag">< <span class="hljs-attribute">value</span>></span>com.mysql.jdbc.Driver<span class="hljs-tag">< /<span class="hljs-attribute">value</span>></span>    <span class="hljs-tag">< <span class="hljs-attribute">description</span>></span>Driver class name for a JDBC metastore<span class="hljs-tag">< /<span class="hljs-attribute">description</span>></span><span class="hljs-tag">< /<span class="hljs-attribute">property</span>></span><span class="hljs-tag">< <span class="hljs-attribute">property</span>></span>    <span class="hljs-tag">< <span class="hljs-attribute">name</span>></span>javax.jdo.option.ConnectionURL<span class="hljs-tag">< /<span class="hljs-attribute">name</span>></span>    <span class="hljs-tag">< <span class="hljs-attribute">value</span>></span>jdbc:mysql://localhost:3306/hive?characterEncoding=UTF-8<span class="hljs-tag">< /<span class="hljs-attribute">value</span>></span>    <span class="hljs-tag">< <span class="hljs-attribute">description</span>></span>JDBC connect string for a JDBC metastore<span class="hljs-tag">< /<span class="hljs-attribute">description</span>></span><span class="hljs-tag">< /<span class="hljs-attribute">property</span>></span><span class="hljs-tag">< <span class="hljs-attribute">property</span>></span>    <span class="hljs-tag">< <span class="hljs-attribute">name</span>></span>javax.jdo.option.ConnectionUserName<span class="hljs-tag">< /<span class="hljs-attribute">name</span>></span>    <span class="hljs-tag">< <span class="hljs-attribute">value</span>></span>hive<span class="hljs-tag">< /<span class="hljs-attribute">value</span>></span>    <span class="hljs-tag">< <span class="hljs-attribute">description</span>></span>Username to use against metastore database<span class="hljs-tag">< /<span class="hljs-attribute">description</span>></span><span class="hljs-tag">< /<span class="hljs-attribute">property</span>></span><span class="hljs-tag">< <span class="hljs-attribute">property</span>></span>    <span class="hljs-tag">< <span class="hljs-attribute">name</span>></span>javax.jdo.option.ConnectionPassword<span class="hljs-tag">< /<span class="hljs-attribute">name</span>></span>    <span class="hljs-tag">< <span class="hljs-attribute">value</span>></span>hive<span class="hljs-tag">< /<span class="hljs-attribute">value</span>></span>    <span class="hljs-tag">< <span class="hljs-attribute">description</span>></span>password to use against metastore database<span class="hljs-tag">< /<span class="hljs-attribute">description</span>></span><span class="hljs-tag">< /<span class="hljs-attribute">property</span>></span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

如果conf/目录下没有 hive-site.xml文件,则需要拷贝一个名为hive-site.xml的文件。

<code class="hljs avrasm has-numbering">[hadoop@ywendeng  conf]$ <span class="hljs-keyword">cp</span> hive-default<span class="hljs-preprocessor">.xml</span><span class="hljs-preprocessor">.template</span> hive-site<span class="hljs-preprocessor">.xml</span> </code><ul class="pre-numbering"><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

7)将mysql-connector-java-5.1.21.jar驱动包,拷贝到 $HIVE_HOME/lib 目录下。可点击下载 mysql驱动包

<code class="hljs ruby has-numbering">[hadoop<span class="hljs-variable">@ywendeng</span> lib]<span class="hljs-comment">#rz   //回车,选择已经下载好的mysql驱动包即可</span>[hadoop<span class="hljs-variable">@ywendeng</span> lib]<span class="hljs-variable">$ </span>lsmysql-connector-java-<span class="hljs-number">5.1</span>.<span class="hljs-number">21</span>.jar</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

8) 启动 Hive Shell,测试运行。

<code class="hljs ruby has-numbering">[hadoop<span class="hljs-variable">@ywendeng</span> hive]<span class="hljs-variable">$ </span>hivehive> show databases;</code><ul class="pre-numbering"><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

hive切换到mysql元数据库之后,hive启动时如果遇到以下错误:

<code class="hljs avrasm has-numbering">Exception <span class="hljs-keyword">in</span> thread <span class="hljs-string">"main"</span>java<span class="hljs-preprocessor">.lang</span><span class="hljs-preprocessor">.RuntimeException</span>: java<span class="hljs-preprocessor">.lang</span><span class="hljs-preprocessor">.IllegalArgumentException</span>:java<span class="hljs-preprocessor">.net</span><span class="hljs-preprocessor">.URISyntaxException</span>: Relative path <span class="hljs-keyword">in</span> absolute URI:${system:java<span class="hljs-preprocessor">.io</span><span class="hljs-preprocessor">.tmpdir</span>%<span class="hljs-number">7</span>D/$%<span class="hljs-number">7</span>Bsystem:user<span class="hljs-preprocessor">.name</span>%<span class="hljs-number">7</span>D</code><ul class="pre-numbering"><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

解决方案:

在hive 安装目录下,创建一个临时的IO文件iotmp

<code class="hljs ruby has-numbering">[hadoop<span class="hljs-variable">@ywendeng</span> hive]<span class="hljs-variable">$ </span>mkdir iotmp[hadoop<span class="hljs-variable">@ywendeng</span> hive]<span class="hljs-variable">$ </span>lsbin   derby.log  hcatalog  lib      metastore_db  <span class="hljs-constant">README</span>.txt         scriptsconf  examples   iotmp     <span class="hljs-constant">LICENSE</span>  <span class="hljs-constant">NOTICE</span>        <span class="hljs-constant">RELEASE_NOTES</span>.txt</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

然后将路径配置到hive-site.xml文件的以下参数中:

<code class="hljs applescript has-numbering">[hadoop@ywendeng conf]$ vi hive-site.xml< <span class="hljs-keyword">property</span>>    < <span class="hljs-property">name</span>>hive.querylog.location< /<span class="hljs-property">name</span>>    < value>/home/hadoop/app/hive/iotmp< /value>    < description>Location <span class="hljs-keyword">of</span> Hive <span class="hljs-command">run</span> <span class="hljs-property">time</span> structured <span class="hljs-command">log</span> <span class="hljs-type">file</span>< /description>< /<span class="hljs-keyword">property</span>>< <span class="hljs-keyword">property</span>>    < <span class="hljs-property">name</span>>hive.exec.<span class="hljs-keyword">local</span>.scratchdir< /<span class="hljs-property">name</span>>    < value>/home/hadoop/app/hive/iotmp< /value>    < description>Local scratch <span class="hljs-constant">space</span> <span class="hljs-keyword">for</span> Hive jobs< /description>< /<span class="hljs-keyword">property</span>>< <span class="hljs-keyword">property</span>>    < <span class="hljs-property">name</span>>hive.downloaded.resources.dir< /<span class="hljs-property">name</span>>    < value>/home/hadoop/app/hive/iotmp< /value>    < description>Temporary <span class="hljs-keyword">local</span> directory <span class="hljs-keyword">for</span> added resources <span class="hljs-keyword">in</span> <span class="hljs-keyword">the</span> remote <span class="hljs-type">file</span> system.< /description>< /<span class="hljs-keyword">property</span>></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

保存,重启hive即可。

<code class="hljs ruby has-numbering">[hadoop<span class="hljs-variable">@ywendeng</span>  hive]<span class="hljs-variable">$ </span>hivehive> show databases;<span class="hljs-constant">OK</span>default<span class="hljs-constant">Time</span> <span class="hljs-symbol">taken:</span> <span class="hljs-number">3.684</span> seconds, <span class="hljs-constant">Fetched</span><span class="hljs-symbol">:</span> <span class="hljs-number">1</span> row(s)hive></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>
  • 解释器、编译器、优化器。

      Driver 调用解释器(Compiler)处理 HiveQL 字串,这些字串可能是一条 DDL、DML或查询语句。编译器将字符串转化为策略(plan)。策略仅由元数据操作 和 HDFS 操作组成,元数据操作只包含 DDL 语句,HDFS 操作只包含 LOAD 语句。对插入和查询而言,策略由 MapReduce 任务中的具有方向的非循环图(directedacyclic graph,DAG)组成,具体流程如下。

1)解析器(parser):将查询字符串转化为解析树表达式。

2)语义分析器(semantic analyzer):将解析树表达式转换为基于块(block-based)的内部查询表达式,将输入表的模式(schema)信息从 metastore 中进行恢复。用这些信息验证列名, 展开 SELECT * 以及类型检查(固定类型转换也包含在此检查中)。

3)逻辑策略生成器(logical plan generator):将内部查询表达式转换为逻辑策略,这些策略由逻辑操作树组成。

4)优化器(optimizer):通过逻辑策略构造多途径并以不同方式重写。优化器的功能如下。

将多 multiple join 合并为一个 multi-way join;

对join、group-by 和自定义的 map-reduce 操作重新进行划分;

消减不必要的列;

在表扫描操作中推行使用断言(predicate);

对于已分区的表,消减不必要的分区;

在抽样(sampling)查询中,消减不必要的桶。

此外,优化器还能增加局部聚合操作用于处理大分组聚合(grouped aggregations)和 增加再分区操作用于处理不对称(skew)的分组聚合。

  • Hive 文件格式

    hive文件存储格式包括以下几类:

1、TEXTFILE
2、SEQUENCEFILE
3、RCFILE
4、ORCFILE(0.11以后出现)

   其中TEXTFILE为默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理。
   SEQUENCEFILE,RCFILE,ORCFILE格式的表不能直接从本地文件导入数据,数据要先导入到textfile格式的表中, 然后再从表中用insert导入SequenceFile,RCFile,ORCFile表中。

1、TEXTFILE 格式

   默认格式,数据不做压缩,磁盘开销大,数据解析开销大。 可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分, 从而无法对数据进行并行操作。

<code class="hljs sql has-numbering">示例:<span class="hljs-operator"><span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> <span class="hljs-keyword">exists</span> textfile_table(site string,url  string,pv   bigint,label string)<span class="hljs-keyword">row</span> format delimitedfields terminated <span class="hljs-keyword">by</span> <span class="hljs-string">'\t'</span>stored <span class="hljs-keyword">as</span> textfile;</span>插入数据操作:<span class="hljs-operator"><span class="hljs-keyword">set</span> hive.<span class="hljs-keyword">exec</span>.compress.<span class="hljs-keyword">output</span>=<span class="hljs-keyword">true</span>;</span>  <span class="hljs-operator"><span class="hljs-keyword">set</span> mapred.<span class="hljs-keyword">output</span>.compress=<span class="hljs-keyword">true</span>;</span>  <span class="hljs-operator"><span class="hljs-keyword">set</span> mapred.<span class="hljs-keyword">output</span>.compression.codec=org.apache.hadoop.io.compress.GzipCodec;</span>  <span class="hljs-operator"><span class="hljs-keyword">set</span> io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;</span>  <span class="hljs-operator"><span class="hljs-keyword">insert</span> overwrite <span class="hljs-keyword">table</span> textfile_table <span class="hljs-keyword">select</span> * <span class="hljs-keyword">from</span> textfile_table;</span> </code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

2、SEQUENCEFILE 格式

   SequenceFile是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。 SequenceFile支持三种压缩选择:NONE,RECORD,BLOCK。Record压缩率低,一般建议使用BLOCK压缩。

<code class="hljs sql has-numbering">示例:<span class="hljs-operator"><span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> <span class="hljs-keyword">exists</span> seqfile_table(site string,url  string,pv   bigint,label string)<span class="hljs-keyword">row</span> format delimitedfields terminated <span class="hljs-keyword">by</span> <span class="hljs-string">'\t'</span>stored <span class="hljs-keyword">as</span> sequencefile;</span>插入数据操作:<span class="hljs-operator"><span class="hljs-keyword">set</span> hive.<span class="hljs-keyword">exec</span>.compress.<span class="hljs-keyword">output</span>=<span class="hljs-keyword">true</span>;</span>  <span class="hljs-operator"><span class="hljs-keyword">set</span> mapred.<span class="hljs-keyword">output</span>.compress=<span class="hljs-keyword">true</span>;</span>  <span class="hljs-operator"><span class="hljs-keyword">set</span> mapred.<span class="hljs-keyword">output</span>.compression.codec=org.apache.hadoop.io.compress.GzipCodec;</span>  <span class="hljs-operator"><span class="hljs-keyword">set</span> io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;</span>  <span class="hljs-operator"><span class="hljs-keyword">SET</span> mapred.<span class="hljs-keyword">output</span>.compression.type=BLOCK;</span><span class="hljs-operator"><span class="hljs-keyword">insert</span> overwrite <span class="hljs-keyword">table</span> seqfile_table <span class="hljs-keyword">select</span> * <span class="hljs-keyword">from</span> textfile_table;</span>  </code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

3、RCFILE 文件格式
   RCFILE是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。

<code class="hljs sql has-numbering">RCFILE文件示例:<span class="hljs-operator"><span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> <span class="hljs-keyword">exists</span> rcfile_table(site string,url  string,pv   bigint,label string)<span class="hljs-keyword">row</span> format delimitedfields terminated <span class="hljs-keyword">by</span> <span class="hljs-string">'\t'</span>stored <span class="hljs-keyword">as</span> rcfile;</span>插入数据操作:<span class="hljs-operator"><span class="hljs-keyword">set</span> hive.<span class="hljs-keyword">exec</span>.compress.<span class="hljs-keyword">output</span>=<span class="hljs-keyword">true</span>;</span>  <span class="hljs-operator"><span class="hljs-keyword">set</span> mapred.<span class="hljs-keyword">output</span>.compress=<span class="hljs-keyword">true</span>;</span>  <span class="hljs-operator"><span class="hljs-keyword">set</span> mapred.<span class="hljs-keyword">output</span>.compression.codec=org.apache.hadoop.io.compress.GzipCodec;</span>  <span class="hljs-operator"><span class="hljs-keyword">set</span> io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;</span>  <span class="hljs-operator"><span class="hljs-keyword">insert</span> overwrite <span class="hljs-keyword">table</span> rcfile_table <span class="hljs-keyword">select</span> * <span class="hljs-keyword">from</span> textfile_table;</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

总结: 相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存储方式,数据加载时性能消耗较大,但是具有较好的压缩比和查询响应。数据仓库的特点是一次写入、多次读取,因此,整体来看,RCFILE相比其余两种格式具有较明显的优势。

三、Hive 工作原理

Hive 工作原理如下图所示。
  这里写图片描述

   MapReduce 开发人员可以把自己写的 Mapper 和 Reducer 作为插件支持 Hive 做更复杂的数据分析。 它与关系型数据库的 SQL 略有不同,但支持了绝大多数的语句(如 DDL、DML)以及常见的聚合函数、连接查询、条件查询等操作。

  Hive 不适合用于联机(online) 事务处理,也不提供实时查询功能。它最适合应用在基于大量不可变数据的批处理作业。Hive 的特点是可 伸缩(在Hadoop 的集群上动态的添加设备),可扩展、容错、输入格式的松散耦合。Hive 的入口是DRIVER ,执行的 SQL 语句首先提交到 DRIVER 驱动,然后调用 COMPILER 解释驱动, 最终解释成 MapReduce 任务执行,最后将结果返回。

四、Hive安装步骤

Hive 安装依赖 Hadoop 的集群,它是运行在 Hadoop 的基础上。 所以在安装 Hive 之前,保证 Hadoop 集群能够成功运行。Hive的安装详细流程如下所示。

1、 下载Hive

Hive是Apache 的一个顶级开源项目,我们可以直接到官网下载需要的版本即可。官网下载地址:http://mirrors.cnnic.cn/apache/hive/

2、把Hive安装包apache-hive-1.0.0-bin.tar.gz移动到/home/hadoop/app/目录下并解压,然后将文件名称改为 hive。

[hadoop@ywendeng app]$ tar -zxvf apache-hive-1.0.0-bin.tar.gz

[hadoop@ywendeng app]$ mv apache-hive-1.0.0-bin hive

3、 添加hive环境变量

在/etc/profile文件中增加如下内容:

<code class="hljs ruby has-numbering">[root<span class="hljs-variable">@ywendeng</span> ~]<span class="hljs-variable">$ </span>vi /etc/profile<span class="hljs-constant">HIVE_HOME</span>=<span class="hljs-regexp">/home/hadoop</span><span class="hljs-regexp">/app/hive</span><span class="hljs-constant">PATH</span>=<span class="hljs-variable">$JAVA_HOME</span>/<span class="hljs-symbol">bin:</span><span class="hljs-variable">$HADOOP_HOME</span>/<span class="hljs-symbol">bin:</span><span class="hljs-variable">$HIVE_HOME</span>/<span class="hljs-symbol">bin:</span><span class="hljs-variable">$PATH</span>export <span class="hljs-constant">HIVE_HOME</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

保存退出后,通过source命令使配置文件生效

<code class="hljs ruby has-numbering">[root<span class="hljs-variable">@ywendeng</span> ~]<span class="hljs-variable">$ </span>source /etc/profile</code><ul class="pre-numbering"><li>1</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets_01.png" alt="" /></a></div>

4、 启动 Hive

此时切换用户至 hadoop 用户,在命令行输入“hive”命令进行测试。

[hadoop@ ywendeng ]$ hive
hive>

在启动hive的过程中可能遇到的错误及解决办法:

<code class="hljs avrasm has-numbering">[错误<span class="hljs-number">1</span>]Caused by: java<span class="hljs-preprocessor">.net</span><span class="hljs-preprocessor">.ConnectException</span>: Connection refused    at sun<span class="hljs-preprocessor">.nio</span><span class="hljs-preprocessor">.ch</span><span class="hljs-preprocessor">.SocketChannelImpl</span><span class="hljs-preprocessor">.checkConnect</span>(Native Method)    at sun<span class="hljs-preprocessor">.nio</span><span class="hljs-preprocessor">.ch</span><span class="hljs-preprocessor">.SocketChannelImpl</span><span class="hljs-preprocessor">.finishConnect</span>(SocketChannelImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">739</span>)    at org<span class="hljs-preprocessor">.apache</span><span class="hljs-preprocessor">.hadoop</span><span class="hljs-preprocessor">.net</span><span class="hljs-preprocessor">.SocketIOWithTimeout</span><span class="hljs-preprocessor">.connect</span>(SocketIOWithTimeout<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">206</span>)    at org<span class="hljs-preprocessor">.apache</span><span class="hljs-preprocessor">.hadoop</span><span class="hljs-preprocessor">.net</span><span class="hljs-preprocessor">.NetUtils</span><span class="hljs-preprocessor">.connect</span>(NetUtils<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">529</span>)    at org<span class="hljs-preprocessor">.apache</span><span class="hljs-preprocessor">.hadoop</span><span class="hljs-preprocessor">.net</span><span class="hljs-preprocessor">.NetUtils</span><span class="hljs-preprocessor">.connect</span>(NetUtils<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">493</span>)    at org<span class="hljs-preprocessor">.apache</span><span class="hljs-preprocessor">.hadoop</span><span class="hljs-preprocessor">.ipc</span><span class="hljs-preprocessor">.Client</span>$Connection<span class="hljs-preprocessor">.setupConnection</span>(Client<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">604</span>)    at org<span class="hljs-preprocessor">.apache</span><span class="hljs-preprocessor">.hadoop</span><span class="hljs-preprocessor">.ipc</span><span class="hljs-preprocessor">.Client</span>$Connection<span class="hljs-preprocessor">.setupIOstreams</span>(Client<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">699</span>)    at org<span class="hljs-preprocessor">.apache</span><span class="hljs-preprocessor">.hadoop</span><span class="hljs-preprocessor">.ipc</span><span class="hljs-preprocessor">.Client</span>$Connection<span class="hljs-preprocessor">.access</span>$2800(Client<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">367</span>)    at org<span class="hljs-preprocessor">.apache</span><span class="hljs-preprocessor">.hadoop</span><span class="hljs-preprocessor">.ipc</span><span class="hljs-preprocessor">.Client</span><span class="hljs-preprocessor">.getConnection</span>(Client<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">1462</span>)    at org<span class="hljs-preprocessor">.apache</span><span class="hljs-preprocessor">.hadoop</span><span class="hljs-preprocessor">.ipc</span><span class="hljs-preprocessor">.Client</span><span class="hljs-preprocessor">.call</span>(Client<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">1381</span>)异常原因: hadoop 没有启动  解决办法:在hadoop 安装目录下启动hadoop: 使用命令 sbin/start-all<span class="hljs-preprocessor">.sh</span> </code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>
<code class="hljs avrasm has-numbering">[错误<span class="hljs-number">2</span>][ERROR] Terminal initialization failed<span class="hljs-comment">; falling back to unsupported</span><span class="hljs-label">java.lang.IncompatibleClassChangeError:</span> Found class jline<span class="hljs-preprocessor">.Terminal</span>, but interface was expected    at jline<span class="hljs-preprocessor">.TerminalFactory</span><span class="hljs-preprocessor">.create</span>(TerminalFactory<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">101</span>)    at jline<span class="hljs-preprocessor">.TerminalFactory</span><span class="hljs-preprocessor">.get</span>(TerminalFactory<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">158</span>)    at jline<span class="hljs-preprocessor">.console</span><span class="hljs-preprocessor">.ConsoleReader</span>.<init>(ConsoleReader<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">229</span>)    at jline<span class="hljs-preprocessor">.console</span><span class="hljs-preprocessor">.ConsoleReader</span>.<init>(ConsoleReader<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">221</span>)    at jline<span class="hljs-preprocessor">.console</span><span class="hljs-preprocessor">.ConsoleReader</span>.<init>(ConsoleReader<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">209</span>)    at org<span class="hljs-preprocessor">.apache</span><span class="hljs-preprocessor">.hadoop</span><span class="hljs-preprocessor">.hive</span><span class="hljs-preprocessor">.cli</span><span class="hljs-preprocessor">.CliDriver</span><span class="hljs-preprocessor">.setupConsoleReader</span>(CliDriver<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">787</span>)    at org<span class="hljs-preprocessor">.apache</span><span class="hljs-preprocessor">.hadoop</span><span class="hljs-preprocessor">.hive</span><span class="hljs-preprocessor">.cli</span><span class="hljs-preprocessor">.CliDriver</span><span class="hljs-preprocessor">.executeDriver</span>(CliDriver<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">721</span>)    at org<span class="hljs-preprocessor">.apache</span><span class="hljs-preprocessor">.hadoop</span><span class="hljs-preprocessor">.hive</span><span class="hljs-preprocessor">.cli</span><span class="hljs-preprocessor">.CliDriver</span><span class="hljs-preprocessor">.run</span>(CliDriver<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">681</span>)    at org<span class="hljs-preprocessor">.apache</span><span class="hljs-preprocessor">.hadoop</span><span class="hljs-preprocessor">.hive</span><span class="hljs-preprocessor">.cli</span><span class="hljs-preprocessor">.CliDriver</span><span class="hljs-preprocessor">.main</span>(CliDriver<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">621</span>)    at sun<span class="hljs-preprocessor">.reflect</span><span class="hljs-preprocessor">.NativeMethodAccessorImpl</span><span class="hljs-preprocessor">.invoke</span>0(Native Method)    at sun<span class="hljs-preprocessor">.reflect</span><span class="hljs-preprocessor">.NativeMethodAccessorImpl</span><span class="hljs-preprocessor">.invoke</span>(NativeMethodAccessorImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">57</span>)    at sun<span class="hljs-preprocessor">.reflect</span><span class="hljs-preprocessor">.DelegatingMethodAccessorImpl</span><span class="hljs-preprocessor">.invoke</span>(DelegatingMethodAccessorImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">43</span>)    at java<span class="hljs-preprocessor">.lang</span><span class="hljs-preprocessor">.reflect</span><span class="hljs-preprocessor">.Method</span><span class="hljs-preprocessor">.invoke</span>(Method<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">606</span>)    at org<span class="hljs-preprocessor">.apache</span><span class="hljs-preprocessor">.hadoop</span><span class="hljs-preprocessor">.util</span><span class="hljs-preprocessor">.RunJar</span><span class="hljs-preprocessor">.main</span>(RunJar<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">212</span>)Exception <span class="hljs-keyword">in</span> thread <span class="hljs-string">"main"</span> java<span class="hljs-preprocessor">.lang</span><span class="hljs-preprocessor">.IncompatibleClassChangeError</span>: Found class jline<span class="hljs-preprocessor">.Terminal</span>, but interface was expected    at jline<span class="hljs-preprocessor">.console</span><span class="hljs-preprocessor">.ConsoleReader</span>.<init>(ConsoleReader<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">230</span>)    at jline<span class="hljs-preprocessor">.console</span><span class="hljs-preprocessor">.ConsoleReader</span>.<init>(ConsoleReader<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">221</span>)    at jline<span class="hljs-preprocessor">.console</span><span class="hljs-preprocessor">.ConsoleReader</span>.<init>(ConsoleReader<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">209</span>)    at org<span class="hljs-preprocessor">.apache</span><span class="hljs-preprocessor">.hadoop</span><span class="hljs-preprocessor">.hive</span><span class="hljs-preprocessor">.cli</span><span class="hljs-preprocessor">.CliDriver</span><span class="hljs-preprocessor">.setupConsoleReader</span>(CliDriver<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">787</span>)    at org<span class="hljs-preprocessor">.apache</span><span class="hljs-preprocessor">.hadoop</span><span class="hljs-preprocessor">.hive</span><span class="hljs-preprocessor">.cli</span><span class="hljs-preprocessor">.CliDriver</span><span class="hljs-preprocessor">.executeDriver</span>(CliDriver<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">721</span>)    at org<span class="hljs-preprocessor">.apache</span><span class="hljs-preprocessor">.hadoop</span><span class="hljs-preprocessor">.hive</span><span class="hljs-preprocessor">.cli</span><span class="hljs-preprocessor">.CliDriver</span><span class="hljs-preprocessor">.run</span>(CliDriver<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">681</span>)    at org<span class="hljs-preprocessor">.apache</span><span class="hljs-preprocessor">.hadoop</span><span class="hljs-preprocessor">.hive</span><span class="hljs-preprocessor">.cli</span><span class="hljs-preprocessor">.CliDriver</span><span class="hljs-preprocessor">.main</span>(CliDriver<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">621</span>)    at sun<span class="hljs-preprocessor">.reflect</span><span class="hljs-preprocessor">.NativeMethodAccessorImpl</span><span class="hljs-preprocessor">.invoke</span>0(Native Method)    at sun<span class="hljs-preprocessor">.reflect</span><span class="hljs-preprocessor">.NativeMethodAccessorImpl</span><span class="hljs-preprocessor">.invoke</span>(NativeMethodAccessorImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">57</span>)    at sun<span class="hljs-preprocessor">.reflect</span><span class="hljs-preprocessor">.DelegatingMethodAccessorImpl</span><span class="hljs-preprocessor">.invoke</span>(DelegatingMethodAccessorImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">43</span>)    at java<span class="hljs-preprocessor">.lang</span><span class="hljs-preprocessor">.reflect</span><span class="hljs-preprocessor">.Method</span><span class="hljs-preprocessor">.invoke</span>(Method<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">606</span>)    at org<span class="hljs-preprocessor">.apache</span><span class="hljs-preprocessor">.hadoop</span><span class="hljs-preprocessor">.util</span><span class="hljs-preprocessor">.RunJar</span><span class="hljs-preprocessor">.main</span>(RunJar<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">212</span>)异常解决办法:将hive下的新版本jline的JAR包拷贝到hadoop下:<span class="hljs-keyword">cp</span> /hive/apache-hive-<span class="hljs-number">1.2</span><span class="hljs-number">.1</span>-bin/lib/jline-<span class="hljs-number">2.12</span><span class="hljs-preprocessor">.jar</span> /cloud/hadoop-<span class="hljs-number">2.4</span><span class="hljs-number">.1</span>/share/hadoop/yarn/lib</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

1) 测试 Hive 是否安装成功。

<code class="hljs vhdl has-numbering">hive> show tables;OK<span class="hljs-typename">Time</span> taken: <span class="hljs-number">0.043</span> seconds</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

2) 创建表。

<code class="hljs vbscript has-numbering">hive> create table test_table (id <span class="hljs-built_in">int</span> ,name <span class="hljs-built_in">string</span>,no <span class="hljs-built_in">int</span>);OK<span class="hljs-built_in">Time</span> taken: <span class="hljs-number">0.5</span> seconds</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

3) 查询表。

<code class="hljs cs has-numbering">hive> <span class="hljs-keyword">select</span> * <span class="hljs-keyword">from</span> test_table;OKTime taken: <span class="hljs-number">0.953</span> seconds</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets_01.png" alt="" /></a></div>

如果创建表和查询表操作没有出错,就说明 Hive 安装成功。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果账号密码和手机号码忘了怎么办 网上购物付款后商家不发货怎么办 夏商国际商城买到假货怎么办 重庆时时彩突然冻结账户资金怎么办 微信安全中心打不开是白色的怎么办 在淘宝买东西说好返现不给返怎么办 联通斐讯路由器返现被骗了怎么办 消费分期后退款分期账单还在怎么办 新房装修物业电梯用不了费用怎么办 在京东拼购没有拼成已付款的怎么办 微信上买东西发的货不一样怎么办 微信买东西收到货不付款怎么办 京东商品店家待出库不发货怎么办 微信二维码付款多付了怎么办 微信二维码付款付错了怎么办 身份证被移动公司拉黑了怎么办 微店申请退款卖家不同意怎么办 淘宝退货快递把我名字填错了怎么办 刚申请淘宝店信用为零怎么办 淘宝买家已付款卖家不做皮单怎么办 淘宝店铺被屏蔽7天后该怎么办 香信得登录密码忘了怎么办 苹果手机迅雷下载不了的资源怎么办 快手官方私信你的作品违规了怎么办 顺丰生鲜速配食物坏了怎么办 半年汽车没有年检 交警抓到怎么办 没年检的车子被交警抓到怎么办 去年检的路上被交警抓了怎么办 微信聊天界面群聊删除找不到怎么办 微博抽奖的奖品没发货怎么办 两个微信号绑了一个手机号怎么办 欧月玫瑰花朵叶子上有白粉怎么办 进对方空间被挡不想让他知道怎么办 qq上买东西给钱了对方没给怎么办 微信钱包手势密码忘记了怎么办 买家一起拍了两件宝贝怎么办 宿雾航空付款无法显示验证码怎么办 不小心把购物车的东西删了怎么办 微信在别人电脑登录忘退出怎么办 微信电脑版忘了退出怎么办 给微商交了定金不给退怎么办