使用HDFS接收器连接器配置问题将Kafka主题数据转换为HDFS Parquet文件

时间:2019-02-17 12:06:04

标签: json apache-kafka hdfs parquet apache-kafka-connect

我需要有关我想以镶木地板格式(带有每日分区器)放入HDFS的kafka主题的帮助。

我在kafka主题中有很多数据,基本上都是这样的json数据:

{"title":"Die Hard","year":1988,"cast":["Bruce Willis","Alan Rickman","Bonnie Bedelia","William Atherton","Paul Gleason","Reginald VelJohnson","Alexander Godunov"],"genres":["Action"]}
{"title":"Toy Story","year":1995,"cast":["Tim Allen","Tom Hanks","(voices)"],"genres":["Animated"]}
{"title":"Jurassic Park","year":1993,"cast":["Sam Neill","Laura Dern","Jeff Goldblum","Richard Attenborough"],"genres":["Adventure"]}
{"title":"The Lord of the Rings: The Fellowship of the Ring","year":2001,"cast":["Elijah Wood","Ian McKellen","Liv Tyler","Sean Astin","Viggo Mortensen","Orlando Bloom","Sean Bean","Hugo Weaving","Ian Holm"],"genres":["Fantasy »]}
{"title":"The Matrix","year":1999,"cast":["Keanu Reeves","Laurence Fishburne","Carrie-Anne Moss","Hugo Weaving","Joe Pantoliano"],"genres":["Science Fiction"]}

该主题的名称是:test

我想将这些数据以拼花格式放入我的HDFS群集中。 但是我在接收器连接器配置上遇到了麻烦。 我为此使用融合的hdfs-sink-connector。

这是我到目前为止要做的:

{
  "name": "hdfs-sink",
  "config": {
    "name": "hdfs-sink",
    "connector.class": "io.confluent.connect.hdfs.HdfsSinkConnector",
    "tasks.max": "1",
    "topics": "test",
    "hdfs.url": "hdfs://hdfs-IP:8020",
    "hadoop.home": "/user/test-user/TEST",
    "flush.size": "3",
    "locale": "fr-fr",
    "timezone": "UTC",
    "format.class": "io.confluent.connect.hdfs.parquet.ParquetFormat",
    "partitioner.class": "io.confluent.connect.hdfs.partitioner.DailyPartitioner",
    "consumer.auto.offset.reset": "earliest",
    "value.converter":  "org.apache.kafka.connect.json.JsonConverter",
    "key.converter": "org.apache.kafka.connect.json.JsonConverter",
    "key.converter.schemas.enable": "true",
    "value.converter.schemas.enable": "true"

  }
}

一些关于为什么我如此配置连接器的解释:

  • 我每天都有很多这些数据填充我的主题
  • 最终目标是每天在我的HDFS中有一个关于此主题的实木复合地板文件

我知道,也许我必须使用纲要注册表将数据格式化为镶木地板,但是我不知道该怎么做。并且有必要吗?

您能帮我吗?

谢谢

1 个答案:

答案 0 :(得分:1)

我还没有亲自使用ParquetFormat,但是

  1. 必须来自Avro数据(由于本地Parquet-Avro项目)。因此,必须改为设置AvroConverter,并添加value.converter.schema.registry.url属性,这要求您必须运行并安装Confluent Schema Registry,是的。
  2. You must use Kafka Connect's special JSON format that includes a schema within your records。它不能是“纯JSON”。即您当前有"value.converter.schemas.enable": "true",并且我猜您的连接器无法正常工作,因为您的记录不是上述格式。

基本上,没有模式,JSON解析器将无法知道Parquet需要编写哪些“列”。


Daily Partitioner每天不创建一个文件,仅创建一个目录。每个flush.size您将获得一个文件,并且还为刷新文件的预定轮换间隔进行了配置。此外,每个Kafka分区将只有一个文件。


此外,"consumer.auto.offset.reset": "earliest",仅在connect-distribtued.properties文件中有效,而不适用于基于每个连接器的AFAIK。


由于我个人没有使用过ParquetFormat,所以我可以提供所有建议,但是我使用other tools like NiFi来达到类似的目标,这将使您不必更改现有的Kafka生产者代码。


或者,使用JSONFormat代替,但是,Hive集成不会自动运行,并且表必须是预定义的(无论如何,这都将需要您的主题有一个架构)。


另一个选择是configure Hive to read from Kafka directly