Samza 从HDFS文件读取
您可以将 Samza 作业配置为从 HDFS 文件中读取。HdfsSystemConsumer 可以从HDFS文件中读取。Avro 编码记录支持开箱即用,易于扩展以支持其他格式(纯文本,csv,json 等)。参见 Event format 下面的部分。
环境
您的工作需要在托管您要消费的 HDFS 的同一个 YARN 群集上运行。
分区
分区工作在单独的 HDFS 文件级别。每个文件被视为流分区,而包含这些文件的目录是流。例如,如果要从包含10个单独文件的 HDFS 路径中读取,则自然会创建10个分区。您最多可以配置10个 Samza 容器来处理这些分区。如果要从单个 HDFS 文件中读取,目前无法分解消耗 - 只能有一个容器来处理该文件。
事件格式
HdfsSystemConsumer 目前支持从 avro 文件读取。收到的 IncomingMessageEnvelope 包含三个重要的字段:
为了将支持扩展到 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
更多建议: