# 入门指南

## 要求

* Mac OS X或Linux
* Java 8 Update 161或更高版本(8u161+)（64位）。同时支持Oracle JDK和OpenJDK。
* Maven 3.3.9+（用于构建）
* Python 2.4+（与启动器脚本一起运行）

## 构建openLooKeng Core

openLooKeng Core是一个标准Maven项目。在项目根目录下运行以下命令即可：

    ./mvnw clean install

在第一次构建中，Maven将从Internet下载所有依赖项并将其缓存在本地存储库(`~/.m2/repository`)中，这可能需要相当长的时间。后续的构建会更快。

openLooKeng Core有一组全面的单元测试，运行这些测试可能需要几分钟的时间。您可以在构建时禁用这些测试：

    ./mvnw clean install -DskipTests

## 在您的IDE中运行openLooKeng Core

### 概述

首次构建openLooKeng Core之后，您可以将该项目加载到您的IDE中并运行服务器。我们建议使用[IntelliJ IDEA](http://www.jetbrains.com/idea/)。由于openLooKeng是一个标准Maven项目，因此您可以使用根文件`pom.xml`将其导入到您的IDE中。在IntelliJ中，从“Quick Start”框中选择“Open Project”或从“File”菜单中选择“Open”，然后选择根文件 `pom.xml`。

在IntelliJ中打开该项目之后，仔细检查是否为该项目正确配置了Java SDK：

* 打开“File”菜单并选择“Project Structure”。
* 在“SDKs”部分中，确保选择1.8 JDK（如果不存在，则创建一个）。
* 在“Project”部分中，确保将“Project language level”设置为8.0，因为openLooKeng Core使用了一些Java 8语言功能。

openLooKeng Core附带的样例配置可以直接用于开发。使用以下选项创建运行配置：

* Main Class：`io.prestosql.server.PrestoServer`
* VM Options：`-ea -XX:+UseG1GC -XX:G1HeapRegionSize=32M -XX:+UseGCOverheadLimit -XX:+ExplicitGCInvokesConcurrent -Xmx2G -Dconfig=etc/config.properties -Dlog.levels-file=etc/log.properties`
* Working directory：`$MODULE_DIR$`
* Use classpath of module：`presto-main`

工作目录应该是`presto-main`子目录。在IntelliJ中，使用`$MODULE_DIR$`可以自动完成该设置。

此外，必须使用您的Hive元存储Thrift服务的位置对Hive插件进行配置。使用正确的主机和端口（如果您没有Hive元存储，则使用下面的值）替换`localhost:9083`，将以下内容添加到虚拟机选项列表中：

    -Dhive.metastore.uri=thrift://localhost:9083

### 为Hive或HDFS使用SOCKS

如果您的本地计算机无法直接访问Hive元存储或HDFS集群，则可以使用SSH端口转发进行访问。设置一个动态SOCKS代理，其中SSH侦听本地端口1080：

    ssh -v -N -D 1080 server

然后在虚拟机选项列表中添加以下内容：

    -Dhive.metastore.thrift.client.socks-proxy=localhost:1080

### 日志记录

审计日志功能默认关闭。要使用默认设置开启，需要修改`etc/event-listener.properties`中的配置，确保运行服务端的进程对审计日志目录有写权限。

### 运行CLI

启动CLI以连接到服务器并运行SQL查询：

    presto-cli/target/hetu-cli-*-executable.jar

查询集群中的节点信息：

    SELECT * FROM system.runtime.nodes;

在样例配置中，Hive Connector挂载在`hive`目录中，因此您可以运行以下查询来显示Hive数据库`default`中的表：

    SHOW TABLES FROM hive.default;

## 代码样式

我们建议您使用IntelliJ作为IDE。可以在[代码样式](https://github.com/airlift/codestyle)存储库中找到项目的代码样式模板，其中还提供了我们的通用编程和Java指南。除此之外，您还应遵守以下要求：

* 将文档源文件（包括目录文件和其他常规文档文件）中的各节按字母顺序进行排列。一般而言，如果周围的代码中已经存在这样的排序，则按字母顺序排列方法/变量/节。
* 在合适的时候使用Java 8流API。不过，请注意流实现的性能不佳，因此应避免在内循环或其他对性能敏感的节中使用流实现。
* 在抛出异常时对错误进行分类。例如，PrestoException接受错误代码作为参数：`PrestoException(HIVE_TOO_MANY_OPEN_PARTITIONS)`。您可以利用该分类来生成报告，以便能够监视各种故障的出现频率。
* 确保所有文件都有适当的许可证标头；您可以通过运行`mvn license:format`来生成许可证。
* 考虑使用字符串格式化（使用Java`Formatter`类进行printf样式格式化）：`format("Session property %s is invalid: %s", name, value)`（请注意，应始终以静态方式导入`format()`）。有时，如果只需要附加某些内容，可以考虑使用`+`运算符。
* 除非是普通表达式，否则避免使用三元运算符。
* 如果Airlift的`Assertions`类中有覆盖您的情况的断言，请使用该断言，而不是手动编写该断言。随着时间的推移，我们可能会转向更流畅的断言，如AssertJ。
* 在编写Git提交消息时，请遵循这些[准则](https://chris.beams.io/posts/git-commit/)。

## 构建Web UI

openLooKeng Web UI使用JSX和ES6编写，由多个React组件组成。该源代码被编译并打包成与浏览器兼容的Javascript，然后该Javascript被签入到openLooKeng Core源代码（在文件夹`dist`中）中。您必须安装[Node.js](https://nodejs.org/en/download/)和[Yarn](https://yarnpkg.com/en/)才能执行这些命令。要在更改之后更新该文件夹，只需运行以下命令：

    yarn --cwd presto-main/src/main/resources/webapp/src install

如果没有任何Javascript依赖项发生更改（即`package.json`未更改），则运行以下命令会更快：

    yarn --cwd presto-main/src/main/resources/webapp/src run package

为了简化迭代，您还可以在`watch`模式下运行，此时会在检测到源文件更改时自动重新编译：

    yarn --cwd presto-main/src/main/resources/webapp/src run watch

要快速进行迭代，只需在打包完成后在IntelliJ中重新构建项目。项目资源将被热重载，更改将在浏览器刷新时得到反映。