0

我想将数据从 flume-ng 写入 Google Cloud Storage。这有点复杂,因为我观察到一个非常奇怪的行为。让我解释:

介绍

我已经在谷歌云上启动了一个 hadoop 集群(单击),设置为使用存储桶。

当我在 master 上 ssh 并使用命令添加文件时hdfs,我可以立即在我的存储桶中看到它

$ hadoop fs -ls /
14/11/27 15:01:41 INFO gcs.GoogleHadoopFileSystemBase: GHFS version: 1.2.9-hadoop2
Found 1 items
-rwx------   3 hadoop hadoop         40 2014-11-27 13:45 /test.txt

但是当我尝试添加然后从我的计算机中读取时,它似乎使用了其他一些 HDFS。在这里我添加了一个名为 的文件jp.txt,它没有显示我以前的文件test.txt

$ hadoop fs -ls hdfs://ip.to.my.cluster/
Found 1 items
-rw-r--r--   3 jp supergroup          0 2014-11-27 14:57 hdfs://ip.to.my.cluster/jp.txt

这也是我在探索 HDFS 时看到的唯一文件http://ip.to.my.cluster:50070/explorer.html#/

当我使用 Web 控制台 ( https://console.developers.google.com/project/my-project-id/storage/my-bucket/ ) 列出存储桶中的文件时,我只能看到test.txt而不是jp.txt.

我读到Hadoop 无法连接到 Google Cloud Storage并且我相应地配置了我的 hadoop 客户端(相当困难的东西),现在我可以看到我的存储桶中的项目。但为此,我需要使用gs://URI

$ hadoop fs -ls gs://my-bucket/
14/11/27 15:57:46 INFO gcs.GoogleHadoopFileSystemBase: GHFS version: 1.3.0-hadoop2
Found 1 items
-rwx------   3 jp jp         40 2014-11-27 14:45 gs://my-bucket/test.txt

观察/中间结论

因此,在同一个集群中似乎有 2 个不同的存储引擎:“传统 HDFS”(以 开头hdfs://)和 Google 存储桶(以 开头gs://)。

用户和权限不同,具体取决于您列出文件的位置。

问题)

主要问题是:使用 flume 在 Google Cloud Storage 上写入 HDFS/GS 所需的最小设置是什么?

相关问题

  • 我是否需要在 Google Cloud 上启动 Hadoop 集群才能实现我的目标?
  • 是否可以直接写入 Google Cloud Storage Bucket ?如果是,我该如何配置水槽?(添加罐子,重新定义类路径......)
  • 同一个集群怎么会有2个存储引擎(经典HDFS/GS bucket)

我的水槽配置

a1.sources = http
a1.sinks = hdfs_sink
a1.channels = mem

# Describe/configure the source
a1.sources.http.type =  org.apache.flume.source.http.HTTPSource
a1.sources.http.port = 9000

# Describe the sink
a1.sinks.hdfs_sink.type = hdfs
a1.sinks.hdfs_sink.hdfs.path = hdfs://ip.to.my.cluster:8020/%{env}/%{tenant}/%{type}/%y-%m-%d
a1.sinks.hdfs_sink.hdfs.filePrefix = %H-%M-%S_
a1.sinks.hdfs_sink.hdfs.fileSuffix = .json
a1.sinks.hdfs_sink.hdfs.round = true
a1.sinks.hdfs_sink.hdfs.roundValue = 10
a1.sinks.hdfs_sink.hdfs.roundUnit = minute

# Use a channel which buffers events in memory
a1.channels.mem.type = memory
a1.channels.mem.capacity = 1000
a1.channels.mem.transactionCapacity = 100

# Bind the source and sink to the channel
a1.sources.http.channels = mem
a1.sinks.hdfs_sink.channel = mem

a1.sinks.hdfs_sink.hdfs.path 行是否接受gs://路径?

在这种情况下需要什么设置(额外的罐子,类路径)?

谢谢

4

1 回答 1

2

正如您所观察到的,能够从同一个 Hadoop 集群访问不同的存储系统实际上是相当普遍的,这取决于scheme://您使用的 URI 的hadoop fs. 您在 Google Compute Engine 上部署的集群也有两个文件系统可用,只是恰好将“默认”设置为gs://your-configbucket.

您必须在本地集群中包含gs://configbucket/file而不是简单的原因/file是,在您的一键部署中,我们还在您的 Hadoop 中添加了一个键core-site.xml,设置fs.default.name为 be gs://configbucket/。您可以在本地集群上实现相同的效果,使其对所有无方案路径使用 GCS;在您的一键式集群中,查看/home/hadoop/hadoop-install/core-site.xml您可能会转移到本地设置的参考资料。

稍微解释一下 Hadoop 的内部结构,hdfs://路径正常工作的原因实际上是因为理论上可以在 Hadoop 的core-site.xml文件中覆盖一个配置键,默认情况下设置:

<property>
  <name>fs.hdfs.impl</name>
  <value>org.apache.hadoop.hdfs.DistributedFileSystem</value>
  <description>The FileSystem for hdfs: uris.</description>
</property>

同样,您可能已经注意到要gs://在本地集群上工作,您提供了fs.gs.impl. 这是因为 DistribtedFileSystem 和 GoogleHadoopFileSystem 都实现了相同的 Hadoop Java 接口FileSystem,并且 Hadoop 被构建为不知道实现选择如何实际实现 FileSystem 方法。这也意味着在最基本的层面上,您可以正常使用的任何地方都hdfs://应该能够使用gs://.

所以,回答你的问题:

  1. 您用于让 Flume 与典型的基于 HDFS 的设置一起使用的最小设置应该适用于将 GCS 用作接收器。
  2. 您不需要在 Google Compute Engine 上启动集群,但它会更容易,因为您在本地设置中使用 GCS 连接器的手动说明更加困难。但是,由于您已经运行了本地设置,因此您可以自行决定 Google Compute Engine 是否会更容易地运行您的 Hadoop/Flume 集群。
  3. 是的,如上所述,您应该尝试用路径替换hdfs://路径gs://,和/或设置fs.default.name为您的根gs://configbucket路径。
  4. 拥有两个存储引擎可以让您在不兼容的情况下更轻松地在两者之间切换。支持的功能有一些细微差别,例如 GCS 不会拥有与 HDFS 中相同的 posix 样式权限。此外,它不支持appends现有文件或符号链接。
于 2014-11-28T17:43:50.043 回答