Samza 从HDFS文件读取

2018-08-22 18:22 更新

您可以将 Samza 作业配置为从 HDFS 文件中读取。HdfsSystemConsumer 可以从HDFS文件中读取。Avro 编码记录支持开箱即用,易于扩展以支持其他格式(纯文本,csv,json 等)。参见 Event format 下面的部分。

环境

您的工作需要在托管您要消费的 HDFS 的同一个 YARN 群集上运行。

分区

分区工作在单独的 HDFS 文件级别。每个文件被视为流分区,而包含这些文件的目录是流。例如,如果要从包含10个单独文件的 HDFS 路径中读取,则自然会创建10个分区。您最多可以配置10个 Samza 容器来处理这些分区。如果要从单个 HDFS 文件中读取,目前无法分解消耗 - 只能有一个容器来处理该文件。

事件格式

HdfsSystemConsumer 目前支持从 avro 文件读取。收到的 IncomingMessageEnvelope 包含三个重要的字段:

  1. 空的关键
  2. 设置为 avro GenericRecord 的消息
  3. 流分区设置为 HDFS 文件的名称

为了将支持扩展到 avro 文件(例如 json,csv 等)之外,您可以实现接口 SingleFileHdfsReader(以一个示例的形式查看 AvroFileHdfsReader 的实现)。

结束流支持

HDFS 数据和 Kafka 数据之间的一个主要区别是,当 kafka 主题具有无限的消息流时,HDFS 文件是有限的,并且具有 EOF 的概念。

当所有分区都在流结束时,您可以选择实现 EndOfStreamListenerTask 来接收回调。当任务处理的所有分区都处于流结束(即所有文件都已达到 EOF)时,Samza 作业将自动退出。

基本配置

以下是设置 HdfsSystemConsumer 的几个基本配置:

# The HDFS system consumer is implemented under the org.apache.samza.system.hdfs package,
# so use HdfsSystemFactory as the system factory for your system
systems.hdfs-clickstream.samza.factory=org.apache.samza.system.hdfs.HdfsSystemFactory

# You need to specify the path of files you want to consume in task.inputs
task.inputs=hdfs-clickstream.hdfs:/data/clickstream/2016/09/11

# You can specify a white list of files you want your job to process (in Java Pattern style)
systems.hdfs-clickstream.partitioner.defaultPartitioner.whitelist=.*avro

# You can specify a black list of files you don't want your job to process (in Java Pattern style),
# by default it's empty.
# Note that you can have both white list and black list, in which case both will be applied.
systems.hdfs-clickstream.partitioner.defaultPartitioner.blacklist=somefile.avro

安全配置

访问启用了 kerberos的HDFS 群集时,需要以下附加配置:

# Use the SamzaYarnSecurityManagerFactory, which fetches and renews the Kerberos delegation tokens when the job is running in a secure environment.
job.security.manager.factory=org.apache.samza.job.yarn.SamzaYarnSecurityManagerFactory

# Kerberos principal
yarn.kerberos.principal=your-principal-name

# Path of the keytab file (local path)
yarn.kerberos.keytab=/tmp/keytab

高级配置

您可能需要设置的一些高级配置:

# Specify the group pattern for advanced partitioning.
systems.hdfs-clickstream.partitioner.defaultPartitioner.groupPattern=part-[id]-.*

高级分区超出了每个文件是分区的基本假设。使用高级分区,您可以任意地将文件分组到分区。例如,如果您有一组文件为 [part-01-a.avro,part-01-b.avro,part-02-a.avro,part-02-b.avro,part-03-a.avo] 你想组织成三个分区(part-01-a.avro,part-01-b.avro),(part-02-a.avro,part-02-b.avro),(part- 03-a.avro),其中中间的数字作为“组标识符”,您可以将此属性设置为 “part- [id] - “(请注意,* [id] ** 是这里的保留期限,即您必须将其字面意思放在 [id])。分区器将该模式应用于所有文件名,并提取模式中的“组标识符”(“[id]”),然后使用“组标识符”将文件分组到分区。

# Specify the type of files your job want to process (support avro only for now)
systems.hdfs-clickstream.consumer.reader=avro

# Max number of retries (per-partition) before the container fails.
system.hdfs-clickstream.consumer.numMaxRetries=10

更多信息

HdfsSystemConsumer设计文档

Samza 安全  »

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号