诊断 Dataproc 集群

查看日志和配置信息对于排查集群或作业的问题很有用。遗憾的是,日志和配置文件太多了,并且收集每个文件以进行调查可能非常耗时。为了解决此问题,Dataproc 集群通过 Cloud SDK 支持特殊的 diagnose 命令。此命令会收集并归档重要系统、Spark/Hadoop 和 Dataproc 日志,然后将归档文件上传至挂接到集群的 Cloud Storage 存储分区。

使用 Cloud SDK 诊断命令

您可以在 Dataproc 集群上使用 Cloud SDK diagnose 命令(请参阅 Dataproc 和 Cloud SDK)。

安装并配置 Cloud SDK 后,您可以在集群上运行 gcloud dataproc clusters diagnose 命令,如下所示。将 cluster-name 替换为您的集群名称,并将 region 替换为您的集群的区域,例如 --region=us-central1

gcloud dataproc clusters diagnose cluster-name \
    --region=region \
    ... other args ...

该命令会输出包含您的数据的归档文件的名称和位置。

...
Saving archive to cloud
Copying file:///tmp/tmp.FgWEq3f2DJ/diagnostic.tar ...
Uploading   ...23db9-762e-4593-8a5a-f4abd75527e6/diagnostic.tar ...
Diagnostic results saved in:
gs://bucket-name/.../cluster-uuid/.../job-id/diagnostic.tar
    ...
在此示例中,bucket-name 是挂接到您的集群的 Cloud Storage 存储分区,cluster-uuid 是集群的唯一 ID (UUID),job-id 是属于运行 diagnose 命令的系统任务的 UUID。

当您创建 Dataproc 集群时,Dataproc 会创建一个 Cloud Storage 存储分区,并将其挂接到您的集群。diagnose 命令会将归档文件输出到此存储分区。如需确定 Dataproc 创建的存储分区的名称,请使用 Cloud SDK clusters describe 命令。configurationBucket 旁边列出了与您的集群关联的存储分区。

gcloud dataproc clusters describe cluster-name \
    --region=region \
...
  clusterName: cluster-name
  clusterUuid: daa40b3f-5ff5-4e89-9bf1-bcbfec6e0eac
  configuration:
  configurationBucket: dataproc-edc9d85f-...-us
  ...

从主节点运行诊断脚本(可选)

如果集群处于错误状态,并且无法从 Dataproc 服务器接受诊断任务,则 Cloud SDK 诊断命令可能会失败或超时。为避免此问题,您可以通过 SSH 连接到主节点,下载诊断脚本,然后在主节点上从本地运行该脚本:

gcloud compute ssh hostname
gsutil cp gs://dataproc-diagnostic-scripts/diagnostic-script.sh .
sudo bash diagnostic-script.sh

诊断 tar 压缩包将保存到一个临时目录中。如果您愿意,可以按照命令输出中的说明将其上传到 Cloud Storage 存储分区,并与 Google 支持团队共享。

共享 diagnose 命令收集的数据

您可以通过以下两种方式共享 diagnose 命令生成的归档文件:

  1. 从 Cloud Storage 下载文件,然后共享下载的归档文件。
  2. 更改对归档文件的权限,以允许其他 Google Cloud Platform 用户或项目访问该文件。

例如,以下命令会添加对 test-project 中诊断归档文件的读取权限:

gsutil -m acl ch -g test-project:R path-to-archive

diagnose 命令输出中包含的内容

diagnose 命令会将集群的以下配置文件、日志和输出包含在归档文件中。如上所述,归档文件位于与您的 Dataproc 集群关联的 Cloud Storage 存储分区中。

守护程序和服务信息

执行的命令 在归档文件中的位置
yarn node -list -all /system/yarn-nodes.log
hdfs dfsadmin -report -live -decommissioning /system/hdfs-nodes.log
hdfs dfs -du -h /system/hdfs-du.log
service --status-all /system/service.log
systemctl --type service /system/systemd-services.log
curl "http://${HOSTNAME}:8088/jmx" /metrics/resource_manager_jmx
curl "http://${HOSTNAME}:8088/ws/v1/cluster/apps" /metrics/yarn_app_info
curl "http://${HOSTNAME}:8088/ws/v1/cluster/nodes" /metrics/yarn_node_info
curl "http://${HOSTNAME}:9870/jmx" /metrics/namenode_jmx

JVM 信息

执行的命令 在归档文件中的位置
jstack -l "${DATAPROC_AGENT_PID}" jstack/agent_${DATAPROC_AGENT_PID}.jstack
jstack -l "${PRESTO_PID}" jstack/agent_${PRESTO_PID}.jstack
jstack -l "${JOB_DRIVER_PID}" jstack/driver_${JOB_DRIVER_PID}.jstack
jinfo "${DATAPROC_AGENT_PID}" jinfo/agent_${DATAPROC_AGENT_PID}.jstack
jinfo "${PRESTO_PID}" jinfo/agent_${PRESTO_PID}.jstack
jinfo "${JOB_DRIVER_PID}" jinfo/agent_${JOB_DRIVER_PID}.jstack

Linux 系统信息

执行的命令 在归档文件中的位置
df -h /system/df.log
ps aux /system/ps.log
free -m /system/free.log
netstat -anp /system/netstat.log
sysctl -a /system/sysctl.log
uptime /system/uptime.log
cat /proc/sys/fs/file-nr /system/fs-file-nr.log
ping -c 1 /system/cluster-ping.log

日志文件

包含的内容 在归档文件中的位置
/var/log 中所有日志的文件名中都包含以下前缀:
cloud-sql-proxy
dataproc
druid
gcdp
gcs
google
hadoop
hdfs
hive
knox
presto
spark
syslog
yarn
zookeeper
文件位于归档文件的 logs 文件夹中,并保留其原始文件名。
集群中每个节点(主节点和工作器节点)的 Dataproc 节点启动日志。 文件位于归档文件的 node_startup 文件夹中,该文件夹包含集群中每台机器对应的单独子文件夹。
来自 journalctl -u google-dataproc-component-gateway 的组件网关日志 /logs/google-dataproc-component-gateway.log

配置文件

包含的内容 在归档文件中的位置
虚拟机元数据 /conf/dataproc/metadata
/etc/environment 中的环境变量 /conf/dataproc/environment
Dataproc 属性 /conf/dataproc/dataproc.properties
/etc/google-dataproc/ 中的所有文件 /conf/dataproc/
/etc/hadoop/conf/ 中的所有文件 /conf/hadoop/
/etc/hive/conf/ 中的所有文件 /conf/hive/
/etc/hive-hcatalog/conf/ 中的所有文件 /conf/hive-hcatalog/
/etc/knox/conf/ 中的所有文件 /conf/knox/
/etc/pig/conf/ 中的所有文件 /conf/pig/
/etc/presto/conf/ 中的所有文件 /conf/presto/
/etc/spark/conf/ 中的所有文件 /conf/spark/
/etc/tez/conf/ 中的所有文件 /conf/tez/
/etc/zookeeper/conf/ 中的所有文件 /conf/zookeeper/