在Alluxio上运行Presto

该文档介绍如何运行Presto,让Presto能够查询存储在Alluxio上的Hive表。

前期准备

开始之前你需要安装好Java,Java 版本要求在1.8以上,同时使用本地模式集群模式构建好Alluxio。

Alluxio客户端需要和Presto的具体配置文件一起编译。在顶层目录’alluxio’下使用下面的命令编译整个项目

mvn clean package -Ppresto -DskipTests

接着下载Presto(此文档使用0.170版本)。并且请使用 Hive On Alluxio完成Hive初始化。

配置

Presto 从Hive metastore中获取数据库和表元数据的信息,同时通过表的元数据信息条目来获取表数据所在的hdfs位置信息。 所以需要先配置Presto on HDFS,为了访问HDFS, 需要将Hadoop的core-site.xml、hdfs-site.xml加入到Presto每个节点的设置文件/<PATH_TO_PRESTO>/etc/catalog/hive.properties中的hive.config.resources的值.

配置core-site.xml

你需要向你的hive.properties指向的core-site.xml中添加以下配置项:

<property>
  <name>fs.alluxio.impl</name>
  <value>alluxio.hadoop.FileSystem</value>
</property>
<property>
  <name>fs.AbstractFileSystem.alluxio.impl</name>
  <value>alluxio.hadoop.AlluxioFileSystem</value>
  <description>The Alluxio AbstractFileSystem (Hadoop 2.x)</description>
</property>

要使用容错模式,需要在classpath的alluxio-site.properties文件中正确的配置Alluxio集群的属性:

alluxio.zookeeper.enabled=true
alluxio.zookeeper.address=[zookeeper_hostname]:2181

或者,你可以将属性添加到Hadoopcore-site.xml配置中,然后将其传播到Alluxio

<configuration>
  <property>
    <name>alluxio.zookeeper.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>alluxio.zookeeper.address</name>
    <value>[zookeeper_hostname]:2181</value>
  </property>
</configuration>

配置额外的Alluxio配置

类似于上面的配置方法,额外的Alluxio设置可以添加到每个节点上Hadoop目录下的core-site.xml文件里。比如可以如此来将alluxio.user.file.writetype.default从默认值MUST_CACHE改为CACHE_THROUGH:

<property>
 <name>alluxio.user.file.writetype.default</name>
 <value>CACHE_THROUGH</value>
</property>

另外,你也可以将alluxio-site.properties的路径追加到Presto JVM配置中,该配置在Presto目录下的etc/jvm.config文件中。该方法的好处是只需在alluxio-site.properties配置文件中设置所有Alluxio属性。

...
-Xbootclasspath/p:<path-to-alluxio-site-properties>

此外,我们建议提高alluxio.user.network.netty.timeout.ms的值(比如10分钟),来防止读远程worker中的大文件时的超时问题。

提高hive.max-split-size

Presto的Hive集成里使用了配置hive.max-split-size来控制一个查询的分布式并行粒度。我们建议将这个值提高到你的Alluxio的块大小以上,以防止Presto在同一个块上进行多个并行的查找带来的相互阻塞。

分发Alluxio客户端jar包

将Alluxio客户端Jar包分发到Presto所有节点中:

  • 因为Presto使用的guava版本是18.0,而Alluxio使用的是14.0,所以需要将Alluxio client端的pom.xml中guava版本修改为18.0并重新编译Alluxio客户端。

  • 你必须将Alluxio客户端jar包 /<PATH_TO_ALLUXIO>/client/default/alluxio-1.6.0-SNAPSHOT-default-client.jar放置在所有Presto节点的$PRESTO_HOME/plugin/hive-hadoop2/ 目录中(针对不同hadoop版本,放到相应的文件夹下),并且重启所有coordinator和worker。

另外,高级用户可以选择从源代码编译这个客户端jar。根据这里的指导,并在这份指导的其余部分使用/<PATH_TO_ALLUXIO>/core/client/runtime/target/alluxio-core-client-runtime-1.6.0-SNAPSHOT-jar-with-dependencies.jar里生成的jar。

Presto命令行示例

在Hive中创建表并且将本地文件加载到Hive中:

你可以从http://grouplens.org/datasets/movielens/下载数据文件。

hive> CREATE TABLE u_user (
userid INT,
age INT,
gender CHAR(1),
occupation STRING,
zipcode STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
STORED AS TEXTFILE;

hive> LOAD DATA LOCAL INPATH '<path_to_ml-100k>/u.user'
OVERWRITE INTO TABLE u_user;

在浏览器中输入http://master_hostname:19999以访问Alluxio Web UI,你可以看到相应文件夹以及Hive创建的文件:

HiveTableInAlluxio

你可以通过说明创建已存在在Alluxio中的表。

之后,在presto client执行如下查询:

/home/path/presto/presto-cli-0.170-executable.jar --server masterIp:prestoPort --execute "use default;select * from u_user limit 10;" --user username --debug

你可以在命令行中看到相应查询结果:

PrestoQueryResult

日志:

PrestoQueryLog

Need help? Ask a Question