Google DataProc Hive 和 Presto 查询不起作用
Google DataProc Hive and Presto query doesn't work
我有一个 Google DataProc 集群,presto 作为可选组件安装。我在 Hive 中创建了一个外部 table,它的大小是 ~1GB。虽然 table 是可查询的(例如,groupby 语句、distinct 等成功),但我在使用 Hive 和 Presto 执行简单的 select * from tableA
时遇到问题:
- 对于 Hive,如果我登录到集群的主节点,并且 运行 从 Hive 命令行查询,它会成功。但是,当我从我的本地计算机 运行 以下命令时:
gcloud dataproc jobs submit hive --cluster $CLUSTER_NAME --region $REGION --execute "SELECT * FROM tableA;"
我收到以下错误:
线程 "main" java.lang.OutOfMemoryError 异常:Java 堆 space
错误:(gcloud.dataproc.jobs.submit.hive)作业 [3e165c0edcda4e35ad0d5f62b77725bc] 在等待 [DONE] 时进入状态 [ERROR]。
尽管我已经将 mapred-site.xml 中的配置更新为:
mapreduce.map.memory.mb=9000;
mapreduce.map.java.opts=-Xmx7000m;
mapreduce.reduce.memory.mb=9000;
mapreduce.reduce.java.opts=-Xmx7000m;
- 对于 Presto,groupBy 和 distinct 等语句同样有效。然而,对于
select * from tableA
,每次它都永远挂在大约 运行 60% 直到超时。而且无论我 运行 来自本地机器还是集群的主节点,我都会遇到同样的问题。
我不明白为什么这么小的外部 table 会有这样的问题。感谢任何帮助,谢谢!
我认为问题在于 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
Presto CLI 二进制文件 /usr/bin/presto
指定一个 jvm -Xmx
内联参数(它使用一些技巧将 bootstrap 本身作为 java 二进制文件);不幸的是,-Xmx 通常不像实际 presto-server
.
的设置那样从 /opt/presto-server/etc/jvm.config
中获取
在您的情况下,如果您从 1G 镶木地板 table 中选择所有内容,您实际上可能正在处理类似 6G 未压缩文本的内容,并且您正在尝试将所有这些内容流式传输到控制台输出。这也可能不适用于 Dataproc job-submission,因为流式输出旨在打印出 human-readable 数据量,如果处理 non-human 数据量。
如果您仍想尝试使用 CLI 执行此操作,可以 运行:
sudo sed -i "s/Xmx1G/Xmx5G/" /usr/bin/presto
在启动备份之前修改主服务器上 CLI 的 jvm 设置。然后您可能希望将输出通过管道传输到本地文件,而不是将其流式传输到您的控制台,因为您将无法通过屏幕读取 6G 的文本流。
我有一个 Google DataProc 集群,presto 作为可选组件安装。我在 Hive 中创建了一个外部 table,它的大小是 ~1GB。虽然 table 是可查询的(例如,groupby 语句、distinct 等成功),但我在使用 Hive 和 Presto 执行简单的 select * from tableA
时遇到问题:
- 对于 Hive,如果我登录到集群的主节点,并且 运行 从 Hive 命令行查询,它会成功。但是,当我从我的本地计算机 运行 以下命令时:
gcloud dataproc jobs submit hive --cluster $CLUSTER_NAME --region $REGION --execute "SELECT * FROM tableA;"
我收到以下错误:
线程 "main" java.lang.OutOfMemoryError 异常:Java 堆 space 错误:(gcloud.dataproc.jobs.submit.hive)作业 [3e165c0edcda4e35ad0d5f62b77725bc] 在等待 [DONE] 时进入状态 [ERROR]。
尽管我已经将 mapred-site.xml 中的配置更新为:
mapreduce.map.memory.mb=9000;
mapreduce.map.java.opts=-Xmx7000m;
mapreduce.reduce.memory.mb=9000;
mapreduce.reduce.java.opts=-Xmx7000m;
- 对于 Presto,groupBy 和 distinct 等语句同样有效。然而,对于
select * from tableA
,每次它都永远挂在大约 运行 60% 直到超时。而且无论我 运行 来自本地机器还是集群的主节点,我都会遇到同样的问题。
我不明白为什么这么小的外部 table 会有这样的问题。感谢任何帮助,谢谢!
我认为问题在于 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
Presto CLI 二进制文件 /usr/bin/presto
指定一个 jvm -Xmx
内联参数(它使用一些技巧将 bootstrap 本身作为 java 二进制文件);不幸的是,-Xmx 通常不像实际 presto-server
.
/opt/presto-server/etc/jvm.config
中获取
在您的情况下,如果您从 1G 镶木地板 table 中选择所有内容,您实际上可能正在处理类似 6G 未压缩文本的内容,并且您正在尝试将所有这些内容流式传输到控制台输出。这也可能不适用于 Dataproc job-submission,因为流式输出旨在打印出 human-readable 数据量,如果处理 non-human 数据量。
如果您仍想尝试使用 CLI 执行此操作,可以 运行:
sudo sed -i "s/Xmx1G/Xmx5G/" /usr/bin/presto
在启动备份之前修改主服务器上 CLI 的 jvm 设置。然后您可能希望将输出通过管道传输到本地文件,而不是将其流式传输到您的控制台,因为您将无法通过屏幕读取 6G 的文本流。