zoukankan      html  css  js  c++  java
  • Hive官方手册翻译(Getting Started)

    翻译Hive官方文档系列,文中括号中包含 注: 字样的,为我自行标注的,水平有限,翻译不是完美无缺的。如有疑问,请参照Hive官方文档对照查看。
     
    内容列表
    Cloudera制作的Hive介绍视频
    安装与配置
    系统需求
    安装Hive发行版
    从Hive源码编译
    运行Hive
    配置管理概览
    运行时配置
    Hive, Map-Reduce 与本地模式
    错误日志
    DDL 操作
    元数据存储
    DML 操作
    SQL 操作
    查询示例
    SELECTS 和 FILTERS
    GROUP BY
    JOIN
    MULTITABLE INSERT
    STREAMING
    Simple Example Use Cases
    MovieLens User Ratings
    Apache Weblog Data
    免责声明: Hive目前仅在Unix(linux)和Mac系统下使用Java 1.6测试运行,可以在这些或类似的平台上正常运行。并不支持在Cygwin上工作(注:windows还是别想了)。
    绝大部分的测试工作是基于Hadoop 0.20完成的 - 所以,我们建议不要使用其他版本,以避免编译或运行的异常。
     
    Cloudera制作的Hive介绍视频
    安装与配置
    系统需求
    Java 1.6
    Hadoop 0.20.x.(注:目前0.9.0支持hadoop 1.0.x)
    用发行版安装Hive
    使用下载工具从Apache下载镜像下载最近的Hive发行包(查看 Hive发行包)
    下一步你需要解压缩Tar包,这将会创建一个名为hive-x.y.z的子目录:
    $ tar -xzvf hive-x.y.z.tar.gz
    设置HIVE_HOME环境变量指向到Hive的安装目录:
    $ cd hive-x.y.z
    $ export HIVE_HOME={{pwd}}
    最后, 将$HIVE_HOME/bin添加到你的PATH环境变量中:
    $ export PATH=$HIVE_HOME/bin:$PATH
    使用源码创建Hive
    Hive SVN 源: http://svn.apache.org/repos/asf/hive/trunk
    $ svn co http://svn.apache.org/repos/asf/hive/trunk hive
    $ cd hive
    $ ant clean package
    $ cd build/dist
    $ ls
    README.txt
    bin/ (所有shell脚本)
    lib/ (所需的jar文件)
    conf/ (配置文件)
    examples/ (示例输入与查询文件)
    在接下来, 我们会交替的使用build/dist和<install-dir>.
    运行Hive
    Hive 使用Hadoop,这意味着:
    你必须在PATH里面设置了hadoop路径 (注:原文是 you must have hadoop in your path,我认为这个path应该是大写的)  或者
    export HADOOP_HOME=<hadoop-install-dir>
    作为附加的, 你必须在创建Hive库表前,在HDFS上创建/tmp和/user/hive/warehouse,并且将它们的权限设置为chmod g+w.
    完成这个操作的命令如下:
    $ $HADOOP_HOME/bin/hadoop fs -mkdir             /tmp
    $ $HADOOP_HOME/bin/hadoop fs -mkdir             /user/hive/warehouse
    $ $HADOOP_HOME/bin/hadoop fs -chmod g+w     /tmp
    $ $HADOOP_HOME/bin/hadoop fs -chmod g+w     /user/hive/warehouse
    我同样发现设置 HIVE_HOME 是很重要的,但并非必须
    $ export HIVE_HOME=<hive-install-dir>
    在Shell中使用Hive命令行(cli)模式:
    $ $HIVE_HOME/bin/hive
    配置文件管理概述
    Hive 默认的配置文件保存在 <install-dir>/conf/hive-default.xml
    你可以修改其中的配置,并重命名这个文件为 <install-dir>/conf/hive-site.xml(注:我建议你还是保留原始配置文件)
    Hive配置文件的位置可以通过设置HIVE_CONF_DIR环境变量来改变.
    Log4j的配置保存在 <install-dir>/conf/hive-log4j.properties
    Hive的配置存在于Hadoop之上,这意味着Hadoop的配置默认会被继承到Hive中.
    Hive 配置可以被如下方式控制:
    编辑 hive-site.xml 并定义任何需要的变量 (包括hadoop的变量)
    从 cli 模式使用使用set命令 (看下面)
    使用如下方式:
    $ bin/hive -hiveconf x1=y1 -hiveconf x2=y2
    这个例子分别设置了变量x1为y1,x2为y2
    设置使用 HIVE_OPTS 环境变量 "-hiveconf x1=y1 -hiveconf x2=y2" 与上面的功能相同
    运行时配置
    Hive 查询是执行map-reduce查询,并且,这些查询是可以被hadoop的配置所控制的.
    命令行命令 'SET' 可以被用来设置任何hadoop(或者hive)的配置变量,例如:
        hive> SET mapred.job.tracker=myhost.mycompany.com:50030;
        hive> SET -v;
    后者(注 SET -v)用来查看当前全部的设置. 而不使用 -v 选项,则是用来查看当前与Hadoop不同的配置.
    Hive, Map-Reduce 与本地模式
    Hive编译器会为绝大多数查询生成map-reduce的jobs。这些Jobs使用下面这个变量来表明被提交到Map-Reduce集群中:
        mapred.job.tracker
    由于这通常是在一个多节点的map-reduce集群中被指出,Hadoop同样有个就近的方式来在用户的工作机上运行map-reduce jobs。这就在小数据集的查询上显得非常有用 - 在这种情况下,本地模式运行通常会比将任务提交到整个大集群中查询更快。数据从HDFS上获取是透明的。同样的,由于本地模式仅运行一个reducer,这样,在大数据查询上是非常慢的。
    从 0.7 版本开始, Hive全面支持本地运行模式,要使用这个模式,请按照下列进行设置:
        hive> SET mapred.job.tracker=local;
    作为附加的,mapred.local.dir应该指定一个合法的本机路径(注:安装hive的那台服务器) (例如: /tmp/<username>/mapred/local). (否则,用户将获取一个定位本地空间的异常抛出).
    从0.7版本开始, Hive同样支持自动/非自动地使用本地模式来完成map-reduce jobs,相关的选项是:
        hive> SET hive.exec.mode.local.auto=false;
    请注意这个功能默认是关闭的,如果打开 - Hive将分析每一个查询的map-reduce job ,并且如果以下阀值被确认为OK,就尝试运行在本地:
    全部job的输入大小低于: hive.exec.mode.local.auto.inputbytes.max (128MB 默认)
    全部的map任务数低于: hive.exec.mode.local.auto.tasks.max (4 个默认)
    全部reduce任务数等于 1 或者 0.
    对于查询大于小数据集,或者需要查询在多个map-reduce jobs中完成,但是子查询很小的(注:小于上述条件),jobs仍可能使用本地模式来运行。
    注意,可能不同的hadoop服务器节点和hive客户端的运行时环境(由于不同的jvm版本或者不同的软件库)。运行本地模式可能会导致一个不可被捕获的错误。同样需要注意的是,本地运行模式是在一个独立的子jvm(hive 客户端的子进程)中完成的。 如果用户希望,子jvm所能使用的最大内存数,可以通过访问hive.mapred.local.mem来进行控制。默认设置是0,所以Hive允许Hadoop来决定子jvm的默认内存限制
    错误日志
    Hive 使用 log4j 来记录日志. 默认来说,日志不会被返回到CLI模式的控制台上(注:也就是CRT中)。默认的日志记录等级是WARN,并被保存到以下文件夹中:
    /tmp/<user.name>/hive.log
    如果用户愿意 - 日志可以通过修改下面的参数来返回到控制台上:
    bin/hive -hiveconf hive.root.logger=INFO,console
    另外,用户可以改变记录等级:
    bin/hive -hiveconf hive.root.logger=INFO,DRFA
    注意,配置项 hive.root.logger 在hive初始化以后,即不能通过使用'set'命令来改变了
    Hive同样会为每个hive会话保存查询日志,在/tmp/<user.name>/ (注:本机路径下),但是可以通过修改 hive-site.xml 中的 hive.querylog.location属性来变更。
    Hive在一个hadoop集群上运行过程中的日志是由Hadoop的配置所决定的。通常Hadoop会为每个map和reduce任务创建日志文件,并保存在运行任务的集群服务器上。日志文件可以通过Hadoop Jobtracker提供的Web UI上的Task Detail页面来跟踪观察。
    运行本地模式时(mapred.job.tracker=local),Hadoop/Hive 将会将执行日志放在本机上,从0.6版本开始 - Hive使用hive-exec-log4j.properties (如果不存在,则是使用hive-log4j.properties文件)来决定默认的日志的保存方式。默认的配置文件将为每个查询执行在本地模式下的日志放到/tmp/<user.name>。这样做的目的是为了将配置单独管理,并可以将日志集中存放到一个用户需要的位置(例如一个NFS文件服务器)上。执行日志对于运行时错误的debug并无帮助。
    错误日志对于定位问题非常有用,请将存在的任何bug发送到hive-dev@hadoop.apache.org
     
    DDL 操作
    创建Hive表和查看使用
    hive> CREATE TABLE pokes (foo INT, bar STRING);
    创建一个包含两个字段,名称为pokes的表,第一个字段是int(注:整型),第二个字段是string(注:字符串)
    hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);
    创建一个名为invites的表,其中包含两个字段和一个叫做ds的分区(partition)字段. 分区字段是一个虚拟的字段,本身并不包含在数据中,但是是从加载进来的数据中特别衍生出来的数据集.
    默认情况下,表被假定是纯文本的格式,并且使用^A(ctrl-a)来作为数据分割的。
    hive> SHOW TABLES;
    列出所有的表
    hive> SHOW TABLES '.*s';
     
    列出所有结尾包含 's' 的表名。匹配方式使用Java正则表达式,查看下列连接获取关于Java正则的信息  http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html
    hive> DESCRIBE invites;
    查看invites表的全部字段
    可以修改表名,增加修改新的字段等:
    hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);
    hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');
    hive> ALTER TABLE events RENAME TO 3koobecaf;
    删除表:
    hive> DROP TABLE pokes;
    元数据存储
    元数据默认使用Derby数据库保存在本地文件系统中,并保存在./metastore_db下。通过修改conf/hive-default.xml中的javax.jdo.option.ConnectionURL变量修改。
    当前,在默认配置下,元数据每次只能同时被一个用户所使用。
    元数据可以存储在任何一个使用JPOX支持的数据库中,这些关系型数据库的连接和类型可以通过两个变量进行控制。javax.jdo.option.ConnectionURL 和 javax.jdo.option.ConnectionDriverName。
    你需要查看数据库的JDO(或JPOX)手册来获取更多信息。
    数据库的Schema定义在JDO元数据注释文件package.jdo中,位置在src/contrib/hive/metastore/src/model。
    计划在未来,元数据存储引擎可以成为一个独立的服务。
    如果你想将元数据作为一个网络的服务来在多个节点中访问,请尝试HiveDerbyServerMode.
     
    DML 操作
    将文件中的数据加载到Hive中:
    hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
     
    加载到pokes表的文件包含两个用ctrl-a符号分割的数据列,'LOCAL' 意味着文件是从本地文件系统加载,如果没有 'LOCAL' 则意味着从HDFS中加载。
    关键词 'OVERWRITE' 意味着当前表中已经存在的数据将会被删除掉。
    如果没有给出 'OVERWRITE',则意味着数据文件将追加到当前的数据集中。
    注意:
    通过load命令加载的数据不会被校验正确性。
    如果文件在HDFS上,他将会被移动到hive所管理的文件系统的命名空间中
    Hive目录的根路径是在hive-default.xml文件中的变量
    hive.metastore.warehouse.dir
    决定的。
    我们建议用户在使用Hive建表之前就创建好这个变量指定的目录。
    hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
    hive> LOAD DATA LOCAL INPATH './examples/files/kv3.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-08');
     
    上面这两个 LOAD 语句,将加载不同的数据到invites表的分区(partition)中。invites表必须事先使用 ds 创建好partition。
    hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
     
    上述命令是将HDFS上的文件加载到表中。
    注意从HDFS中加载数据,将会把数据移动到目录下。这几乎是瞬间完成的。(注:因为只是在HDFS元数据中修改了文件路径的指向。)
     
    SQL 查询
    查询示例
    下面会演示一些查询范例,在build/dist/examples/queries中可以找到。
    更多的,可以在hive源码中的 ql/src/test/queries/positive中可以找到。
     
    SELECTS 和 FILTERS
    hive> SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';
    从invite表的字段 'foo' 中选择所有分区ds=2008-08-15的结果。这些结果并不存储在任何地方,只在控制台中显示。
    注意:下面的示例中,INSERT (到hive表,本地目录或者HDFS目录) 是可选命令。
        hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='2008-08-15';
     
    从invites表中选择分区 ds=2008-08-15 的所有行,并放入HDFS目录中。结果数据在在/tmp/hdfs_out目录中的文件(多个文件,文件数量取决于mapper的数量)。
     
    存在分区的表在使用 WHERE 条件过滤的时候必须至少指定一个分区来查询。
    hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;
     
    选择pokes表中所有的数据并放到一个本地(注:当前服务器)的文件路径中。
    hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a;
    hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100;
    hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/reg_3' SELECT a.* FROM events a;
    hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_4' select a.invites, a.pokes FROM profiles a;
    hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT COUNT(*) FROM invites a WHERE a.ds='2008-08-15';
    hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT a.foo, a.bar FROM invites a;
    hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sum' SELECT SUM(a.pc) FROM pc1 a;
     
    字段计算和,最大值,最小值同样可以使用,注意不包含在 HIVE-287 中的Hive版本,你需要使用COUNT(1) 来代替 COUNT(*)
    GROUP BY
    hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(*) WHERE a.foo > 0 GROUP BY a.bar;
    hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(*) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;
     
    注意不包含在 HIVE-287 中的Hive版本,你需要使用COUNT(1) 来代替 COUNT(*)
    JOIN
    hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;
     
    MULTITABLE INSERT(多重插入)
        FROM src
        INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100
        INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200
        INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300
        INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300;
    STREAMING
        hive> FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09';
    在map中使用脚本/bin/cat对数据的流式访问(就像使用hadoop的streaming)
    同样的 - 流式访问也可以使用在reduce阶段。(请查看 Hive Tutorial 范例)
     
    简单的使用范例
    用户对电影的投票统计
    首先,创建一个使用tab分割的文本文件的表
    CREATE TABLE u_data (
            userid INT,
            movieid INT,
            rating INT,
            unixtime STRING)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ' '
    STORED AS TEXTFILE;
     
    然后,下载这个数据文件
    wget http://www.grouplens.org/system/files/ml-data.tar+0.gz
    tar xvzf ml-data.tar+0.gz
    将这个文件加载到刚刚创建的表中:
    LOAD DATA LOCAL INPATH 'ml-data/u.data' OVERWRITE INTO TABLE u_data;
     
    计算表 u_data 中的总行数:
    SELECT COUNT(*) FROM u_data;
    注意不包含在 HIVE-287 中的Hive版本,你需要使用COUNT(1) 来代替 COUNT(*)
    现在,我们可以在表 u_data 中做一些复杂的数据分析
    创建 weekday_mapper.py:
    import sys
    import datetime
    for line in sys.stdin:
        line = line.strip()
        userid, movieid, rating, unixtime = line.split(' ')
        weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
        print ' '.join([userid, movieid, rating, str(weekday)])
    使用mapper脚本:
    CREATE TABLE u_data_new (
            userid INT,
            movieid INT,
            rating INT,
            weekday INT)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ' ';
    add FILE weekday_mapper.py;
    INSERT OVERWRITE TABLE u_data_new
    SELECT
            TRANSFORM (userid, movieid, rating, unixtime)
            USING 'python weekday_mapper.py'
            AS (userid, movieid, rating, weekday)
    FROM u_data;
    SELECT weekday, COUNT(*)
    FROM u_data_new
    GROUP BY weekday;
    注意 0.5.0 及更早的的Hive版本,你需要使用COUNT(1) 来代替 COUNT(*)
    Apache Web日志数据
    Apache日志格式是可以自定义的,作为大多数网管来说都是使用默认设置。
    我们可以给默认的Apache日志创建一个如下的表
    更多的关于正则序列化/反序列化(注: 原文!RegexSerDe) 可以在这里看到。
    http://issues.apache.org/jira/browse/HIVE-662
    add jar ../build/contrib/hive_contrib.jar;
    CREATE TABLE apachelog (
            host STRING,
            identity STRING,
            user STRING,
            time STRING,
            request STRING,
            status STRING,
            size STRING,
            referer STRING,
            agent STRING)
    ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
    WITH SERDEPROPERTIES (
            "input.regex" = "([^]*) ([^]*) ([^]*) (-|\[^\]*\]) ([^ "]*|"[^"]*") (-|[0-9]*) (-|[0-9]*)(?: ([^ "]*|".*") ([^ "]*|".*"))?",
            "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s"
    )
    STORED AS TEXTFILE;
  • 相关阅读:
    [转]asp.net页面缓存技术
    UL和LI在div中的高度的IE6下兼容性
    jquery制作的横向图片滚动带横向滚动条TackerScroll
    电脑可以上网,但是qq登陆不上去?
    Introduction to discrete event system学习笔记4.6
    Introduction to Discrete event system学习笔记4.9
    Introduction to discrete event systemsstudy 4.5
    Symbolic synthesis of obserability requirements for diagnosability B.Bittner,M.Bozzano,A.Cimatti,and X.Olive笔记4.16
    Introduction to discrete event system学习笔记4.8pm
    Introduction to discrete event system学习笔记 4.8
  • 原文地址:https://www.cnblogs.com/zhengrunjian/p/4647572.html
Copyright © 2011-2022 走看看