我已经开始测试适用于 Hadoop 的 Google Cloud Storage 连接器。我发现针对它运行的蜂巢查询非常慢。
似乎单个客户端必须在开始作业之前扫描整个文件系统,1000 个文件中的 10 个,这需要 10 分钟。一旦作业实际运行,它就会运行良好。
这是配置问题还是 hive/gcs 的性质?可以做些什么来提高性能。
在 GCE 中运行 CDH 5.3.0-1
我已经开始测试适用于 Hadoop 的 Google Cloud Storage 连接器。我发现针对它运行的蜂巢查询非常慢。
似乎单个客户端必须在开始作业之前扫描整个文件系统,1000 个文件中的 10 个,这需要 10 分钟。一旦作业实际运行,它就会运行良好。
这是配置问题还是 hive/gcs 的性质?可以做些什么来提高性能。
在 GCE 中运行 CDH 5.3.0-1
我不会说这一定是 MapReduce 与 Hive 的区别,尽管有可能的原因是使用 Hive 遇到这种类型的缓慢可能更常见。
确实,像“stat/getFileStatus”这样的元数据操作在 GCS 上的往返延迟比本地 HDFS 慢,大约为 30-70 毫秒,而不是个位数毫秒。
但是,这并不意味着在 10,000 个文件上启动作业需要超过 10 分钟。最佳实践是允许连接器尽可能“批量”请求,允许在单次往返中检索多达 1000 个文件信息。
关键是,如果我有一个目录:
gs://foobar/allmydata/foo-0000.txt
....<lots of files following this pattern>...
gs://foobar/allmydata/foo-9998.txt
gs://foobar/allmydata/foo-9999.txt
如果我有我的 Hive“位置”=gs://foobar/allmydata
它实际上应该非常快,因为它一次会获取 1000 个文件。如果我这样做hadoop fs -ls gs://foobar/allmydata
了,它应该会在 <5 秒内返回。
但是,如果我有很多小子目录:
gs://foobar/allmydata/dir-0000/foo-0000.txt
....<lots of files following this pattern>...
gs://foobar/allmydata/dir-9998/foo-9998.txt
gs://foobar/allmydata/dir-9999/foo-9999.txt
那么这可能会出错。Hadoop子系统有点幼稚,所以如果你只是hadoop fs -ls -R gs://foobar/allmydata
在这种情况下这样做,它确实会首先找到表单的10000个目录gs://foobar/allmydata/dir-####
,然后对它们运行一个for循环,一个一个地列出下面的单个文件每个目录。这个 for 循环很容易花费 > 1000 秒。
这就是为什么我们实施了一个钩子来拦截至少完全指定的 glob 表达式,该表达式于去年 5 月发布:
https://groups.google.com/forum/#!topic/gcp-hadoop-announce/MbWx1KqY2Q4
7. Implemented new version of globStatus which initially performs a flat
listing before performing the recursive glob logic in-memory to
dramatically speed up globs with lots of directories; the new behavior is
default, but can disabled by setting fs.gs.glob.flatlist.enable = false.
在这种情况下,如果存在子目录布局,用户可以选择改为执行hadoop fs -ls gs://foobar/allmydata/dir-*/foo*.txt
. Hadoop 允许我们覆盖“globStatus”,因此通过使用这个 glob 表达式,我们可以正确地截取整个列表,而无需让 Hadoop 执行其幼稚的 for 循环。然后我们高效地对其进行批处理,这样我们将在 <5 秒内再次检索所有 10,000 个文件信息。
如果 Hive 不允许免费使用 glob 表达式,这可能会更复杂一些。
最坏的情况是,如果您可以将这些文件移动到平面目录结构中,那么 Hive 应该能够有效地使用该平面目录。
这是几年前的一个相关 JIRA,描述了 Hive 如何处理 S3 中的文件的类似问题,但仍未正式解决:https ://issues.apache.org/jira/browse/HIVE-951
如果不清楚 Hive 客户端如何/为什么执行慢速 for 循环,您可以添加log4j.logger.com.google=DEBUG
并log4j.properties
重新运行 Hive 客户端以查看有关 GCS 连接器在后台执行的操作的详细信息。