Google DataProc Hive和Presto查询不起作用

时间:2019-05-03 19:06:57

标签: hive presto google-cloud-dataproc

我有一个Google DataProc集群,其中presto已安装为可选组件。我在Hive中创建一个外部表,其大小约为1GB。虽然该表是可查询的(例如,groupby语句,distinct等成功),但是我在用Hive和Presto执行简单的select * from tableA时遇到了问题:

  1. 对于Hive,如果我登录到群集的主节点,并从Hive命令行运行查询,则成功。但是,当我从本地计算机运行以下命令时:

gcloud dataproc jobs submit hive --cluster $CLUSTER_NAME --region $REGION --execute "SELECT * FROM tableA;"

我收到以下错误:

线程“主”中的异常java.lang.OutOfMemoryError:Java堆空间 错误:(gcloud.dataproc.jobs.submit.hive)作业[3e165c0edcda4e35ad0d5f62b77725bc]在等待[完成]时进入了[错误]状态。

尽管我已将mapred-site.xml中的配置更新为:

mapreduce.map.memory.mb=9000;
mapreduce.map.java.opts=-Xmx7000m;
mapreduce.reduce.memory.mb=9000;
mapreduce.reduce.java.opts=-Xmx7000m;
  1. 对于Presto,类似的语句,例如groupBy和distinct work。但是,对于select * from tableA来说,它每次都以RUNNING 60%的速度永久挂起,直到超时。而且无论我是从本地计算机运行还是从群集的主节点运行,都会遇到相同的问题。

我不明白为什么这么小的外部表会出现这样的问题。感谢您的任何帮助,谢谢!

2 个答案:

答案 0 :(得分:1)

我认为问题在于gcloud dataproc jobs submit hive --cluster $CLUSTER_NAME --region $REGION --execute "SELECT * FROM tableA;"的输出通过了OOMed的Dataproc服务器。为了避免这种情况,您可以直接从群集中查询数据,而无需通过服务器。

尝试遵循Dataproc Presto tutorial - Presto CLI queries,从本地计算机运行以下命令:

gcloud compute ssh <master-node> \
    --project=${PROJECT} \
    --zone=${ZONE} \
    -- -D 1080 -N
./presto-cli \
    --server <master-node>:8080 \
    --socks-proxy localhost:1080 \
    --catalog hive \
    --schema default

答案 1 :(得分:1)

Presto CLI二进制文件/usr/bin/presto内联指定了一个jvm -Xmx参数(它使用一些技巧将自身作为Java二进制文件进行引导);不幸的是,通常不会像实际/opt/presto-server/etc/jvm.config的设置那样从presto-server获取-Xmx。

在您的情况下,如果要从1G实木复合地板表中选择所有内容,则实际上可能是在处理6G未压缩的文本,并且您试图将所有这些内容流式传输到控制台输出。这也可能不适用于Dataproc作业提交,因为流输出旨在打印出人类可读的数据量,并且如果处理非人为的数据量则会大大降低 的速度。数据。

如果您仍想使用CLI尝试执行此操作,则可以运行:

sudo sed -i "s/Xmx1G/Xmx5G/" /usr/bin/presto

要在主服务器上修改CLI的jvm设置,然后再备份它。然后,您可能希望将输出通过管道传输到本地文件,而不是将其流式传输到控制台,因为您将无法通过屏幕读取6G文本流。