# Kudu 入门指南

原文链接 : [http://kudu.apache.org/docs/quickstart.html](http://kudu.apache.org/docs/quickstart.html)

译文链接 : [http://cwiki.apachecn.org/pages/viewpage.action?pageId=10813610](http://cwiki.apachecn.org/pages/viewpage.action?pageId=10813610)

贡献者 : [小瑶](/display/~chenyao) [ApacheCN](/display/~apachecn) [Apache中文网](/display/~apachechina)

## Apache Kudu 快速开始

按照这些说明设置和运行 **Kudu VM** ，并在几分钟之内从 **Kudu** ，**Kudu_Impala** 和 **CDH** 开始。

## 获得 Kudu 快速开始 VM

### 先决条件

1.  安装 **[Oracle Virtualbox](https://www.virtualbox.org/)** 。**VM** 已经通过测试，可以在 **Ubuntu 14.04** 上使用 **VirtualBox 4.3** 版本，并在 **OSX 10.9** 上使用 **VirtualBox 5** 的版本。**VirtualBox** 也包含在大多数软件包管理器中：**apt-get** ，**brew** 等。
2.  安装完成后，使用 **which VBoxManage** 命令确保 **VBoxManage** 在您的 **PATH** 中。

### 安装

要下载并启动 **VM** ，请在终端窗口中执行以下命令。

```
$ curl -s https://raw.githubusercontent.com/cloudera/kudu-examples/master/demo-vm-setup/bootstrap.sh | bash
```

此命令下载一个 **shell** 脚本，这个脚本克隆了 **kudu-example Git** 仓库，然后将大约 **1.2 GB** 大小的 **VM** 映像下载到当前的工作目录中。您可以在此脚本下载下来之后检查这个脚本通过删除上面脚本的 **| bash** 部分。安装完成之后，您可以通过 **SSH** 连接到 **guest** 虚拟机来验证一切是否正常：

```
$ ssh demo@quickstart.cloudera
```

上面的 **username** 和 **password** 都是演示。此外，演示用户具有无密码的 **sudo** 权限，以便您可以安装其他软件和管理 **guest OS** 。您还可以访问 **kudu-examples** 作为** /home/demo/kudu-examples/** 中的共享文件夹，或者在 **host** 上的 **VirtualBox** 共享文件夹位置。这是使脚本或数据对 guest 可见的一种快捷方式。

你可以通过执行以下命令快速验证 **Kudu** 和 **Impala** 是否正在运行：

```
$ ps aux | grep kudu
$ ps aux | grep impalad
```

如果连接到 **VM** 或其中一个进程没有运行时出现问题，请务必参阅 “[疑难解答](/pages/viewpage.action?pageId=10813626)” 部分。

## 加载数据

要使用 **Kudu** 和 Impala 进行一些典型的操作，我们将使用 **[San Francisco MTA GPS dataset](https://data.sfgov.org/Transportation/Raw-AVL-GPS-data/5fk7-ivit/data) **。该数据集包含从 **SF MTA**车队的总线上安装的传感器周期性传输的原始位置数据。

1.  下载示例数据并将其加载到 **HDFS** 中
    首先我们将下载示例数据集，准备并将其上传到 **HDFS** 集群中。
    **SF MTA** 的站点通常有点慢，所以我们从数据集中镜像了一个 **CSV** 文件样本，网址为  **[http://kudu-sample-data.s3.amazonaws.com/sfmtaAVLRawData01012013.csv.gz](http://kudu-sample-data.s3.amazonaws.com/sfmtaAVLRawData01012013.csv.gz)**
    原始数据集使用 **DOS** 类型的行结尾，因此我们将在上传过程中使用 **tr** 将其转换为 **UNIX** 风格。

    ```
    $ wget http://kudu-sample-data.s3.amazonaws.com/sfmtaAVLRawData01012013.csv.gz
    $ hdfs dfs -mkdir /sfmta
    $ zcat sfmtaAVLRawData01012013.csv.gz | tr -d '\r' | hadoop fs -put - /sfmta/data.csv
    ```

2.  创建一个新的外部 **Impala** 表以访问纯文本数据。要在虚拟机中连接到 **Impala** ，请执行以下命令：

    ```
    ssh demo@quickstart.cloudera -t impala-shell
    ```

    现在，您可以执行以下命令：

    ```
    CREATE EXTERNAL TABLE sfmta_raw (
      revision int,
      report_time string,
      vehicle_tag int,
      longitude float,
      latitude float,
      speed float,
      heading float
    )
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ','
    LOCATION '/sfmta/'
    TBLPROPERTIES ('skip.header.line.count'='1');
    ```

3.  验证数据是否实际加载运行以下命令：

    ```
    SELECT count(*) FROM sfmta_raw;

    +----------+
    | count(*) |
    +----------+
    | 859086   |
    +----------+
    ```

4.  接下来，我们将创建一个 **Kudu** 表并加载数据。请注意，我们将字符串 **report_time** 字段转换为 **unix** 风格的时间戳，以便更有效的存储。

    ```
    CREATE TABLE sfmta
    PRIMARY KEY (report_time, vehicle_tag)
    PARTITION BY HASH(report_time) PARTITIONS 8
    STORED AS KUDU
    AS SELECT
      UNIX_TIMESTAMP(report_time,  'MM/dd/yyyy HH:mm:ss') AS report_time,
      vehicle_tag,
      longitude,
      latitude,
      speed,
      heading
    FROM sfmta_raw;

    +------------------------+
    | summary                |
    +------------------------+
    | Inserted 859086 row(s) |
    +------------------------+
    Fetched 1 row(s) in 5.75s
    ```

    创建的表使用复合主键。有关 **Impala** 的扩展 **SQL** 语法的更详细的介绍，请参阅 [**Kudu Impala** 集成](/pages/viewpage.action?pageId=10813620)。

## 读取和修改数据

现在数据存储在 **Kudu** 中，您可以对其执行查询。以下查询查找包含最高记录车速的数据点。

```
SELECT * FROM sfmta ORDER BY speed DESC LIMIT 1;

+-------------+-------------+--------------------+-------------------+-------------------+---------+
| report_time | vehicle_tag | longitude          | latitude          | speed             | heading |
+-------------+-------------+--------------------+-------------------+-------------------+---------+
| 1357022342  | 5411        | -122.3968811035156 | 37.76665878295898 | 68.33300018310547 | 82      |
+-------------+-------------+--------------------+-------------------+-------------------+---------+
```

通过快速的 **Google** 搜索，我们可以看到这辆公共汽车在 **68MPH** 的 **16** 街上东行。乍一看，这似乎不太可能是真实的。也许我们做一些研究，发现这辆公共汽车的传感器设备被打破了，我们决定删除数据。使用 **Kudu** 和 标准 **SQL** 这是非常容易纠正的：

```
DELETE FROM sfmta WHERE vehicle_tag = '5411';

-- Modified 1169 row(s), 0 row error(s) in 0.25s
```

## 下一步

以上示例显示了如何使用 **Impala** 和 **Kudu** 加载，查询和变更静态数据集。然而， **Kudu** 的真正实力是以流媒体方式吸收和突变数据的能力。

作为学习 **Kudu** 编程 **API** 的练习，请尝试实现一个使用 **SFMTA XML** 数据 **Feed** 的程序，将该相同的数据集实时摄取到 **Kudu** 表中。

### 故障排除

#### 通过 SSH 访问 VM 的问题

*   确保主机已安装 **SSH** 客户端。
*   确保 **VM** 正在运行，通过运行以下命令并检查名为 **kudu-demo** 的虚拟机：

    ```
    $ VBoxManage list runningvms
    ```

*   验证 **VM** 的 **IP** 地址是否包含在主机的 **/etc/hosts** 文件中。您应该看到一行包含一个 **IP** 地址，后跟主机名 **quickstart.cloudera** 。要检查正在运行的 **VM** 的 **IP** 地址，请使用下面的 **VBoxManage** 命令。

    ```
    $ VBoxManage guestproperty get kudu-demo /VirtualBox/GuestInfo/Net/0/V4/IP
    Value: 192.168.56.100
    ```

*   如果您以前使用过 **Cloudera QuickStart VM** ，则 **.ssh/known_hosts** 文件可能包含对先前 **VM** 的 **SSH** 凭据的引用。从此文件删除对 **quickstart.cloudera** 的任何引用。

#### 在 VirtualBox 中运行时缺少 SSE4.2 支持

*   运行 **Kudu** 目前需要一个支持 **SSE4.2** ( **Nehalem** 或者更高版本的 **Intel** ) 的 **CPU** 。要通过 **SSE4.2** 支持进入 **guest** 虚拟机，请参阅 [**VirtualBox** 文档](https://www.virtualbox.org/manual/ch09.html#sse412passthrough)。

## 下一步

*   [安装 **Kudu**](/pages/viewpage.action?pageId=10813613)
*   [配置 **Kudu**](/pages/viewpage.action?pageId=10813616)