skip to Main Content

The DataOps Blog

Where Change Is Welcome

Generate your Avro Schema – Automatically!

By Posted in Engineering December 8, 2017

Avro LogoUpdated November 29, 2021

In a previous blog post, I explained how 电子游戏厅 Data Collector Engine (SDC) can work with Apache Kafka and Confluent Schema Registry to handle data drift via Avro schema evolution. In that blog post, I mentioned SDC’s Schema Generator processor; today I’ll explain how you can use the Schema Generator to automatically create Avro schemas.

We’ll use our old friend the Taxi tutorial 管道作为基础,修改它以写入avro格式的数据,而不是带分隔符的数据格式. 电子游戏网址大全将研究一个初始的本机实现,只需将Schema Generator放入 data pipeline,然后看看如何,再多做一点,电子游戏网址大全得到一个更好的结果.

Creating an Avro Schema

I’m starting with the basic Taxi tutorial pipeline. If you have not yet completed the tutorial, 我敦促你们这样做——这确实是最快的, easiest way to get up to speed creating smart data pipelines.

For simplicity, let’s swap the Hadoop FS destination for Local FS, and set the data format to Avro. 你会注意到电子游戏网址大全需要以某种方式指定Avro模式:

Taxi Transactions To Local FS

Let’s insert the Schema Generator 处理器在Local FS目的地之前,并为模式提供一个合适的名称:zon

Add Schema Generator

注意,架构生成器处理程序将架构放在名为的头属性中 avroSchema. 电子游戏网址大全现在可以配置本地FS目标来使用这个生成的模式:

Set Schema Location in data pipeline

电子游戏网址大全可以使用预览来了解管道运行时会发生什么. 预览将读取来自源的前几个记录, process them in the pipeline, but not, by default, write them to the destination. 并且启用“Show Record/Field Header”将允许电子游戏网址大全看到Avro模式.

预览是一个很好的特性,因为在处理不同的结构化集合时, 半结构化和非结构化数据源, 您必须真正了解每个阶段的数据转换. 不仅是为了确保数据完整性和数据质量,也是为了调试目的. So phrases like “Garbage in, Garbage out”, “Fail fast, “经常失败”和“敏捷和迭代开发”也适用于创建智能数据管道.

Preview Dialog in data pipeline

选择Schema Generator并钻取第一条记录,电子游戏网址大全可以看到Avro模式:

Preview Avro Schema in data pipeline

电子游戏网址大全重新格式化Avro模式,使其更具可读性. 我删除了大部分字段,这样电子游戏网址大全就可以专注于关键点:

{
  "type": "record",
  "name": "taxi",
  "doc": "",
  "fields": [
    {
      "name": "medallion",
      "type": "string"
    },
    ...
    {
      "name": "fare_amount",
      "type": "string"
    },
    ...
    {
      "name": "pickup_datetime",
      "type": "string"
    },
    ...
    {
      "name": "passenger_count",
      "type": "string"
    },
    ...
    {
      "name": "dropoff_latitude",
      "type": "string"
    },
    ...
  ]
}

manage-smart-data-pipelines

电子游戏厅使数据工程师能够构建端到端智能数据管道. 把你的时间花在构建、实现和创新上,而不是维护、重写和修复.

Converting Field Types

Schema Generator创建了一个Avro模式,但它可能不是很有用. Delimited input data (for example, 数据从CSV文件)没有任何类型信息, so all the fields are strings. 将这些日期时间作为相应的类型会更有用, 以小数形式表示的量和坐标域, and it looks like trip_time_in_secs and passenger_count can be integers.

电子游戏网址大全可以使用Field Type Converter处理器来完成这项工作:

Field Type Converter in Data Pipeline

再次预览,模式看起来好多了,但电子游戏网址大全还有一些工作要做. Notice that the Field Type Converter “猜测”十进制字段的精度,基于每个记录中的值:

{
  "type": "record",
  "name": "taxi",
  "doc": "",
  "fields": [
    {
      "name": "medallion",
      "type": "string"
    },
    ...
    {
      "name": "fare_amount",
      "type": {
        "type": "bytes",
        "logicalType": "decimal",
        "precision": 4,
        "scale": 2
      }
    },
    ...
    {
      "name": "pickup_datetime",
      "type": {
        "type": "long",
        "logicalType": "timestamp-millis"
      }
    },
    ...
    {
      "name": "passenger_count",
      "type": "int"
    },
    ...
    {
      "name": "dropoff_latitude",
      "type": {
        "type": "bytes",
        "logicalType": "decimal",
        "precision": 8,
        "scale": 6
      }
    },
    ...
  ]
}

The precision 所生成模式的属性会因记录而异, 但是模式需要在所有数据上是统一的. We can use an Expression Evaluator 将字段标头设置为覆盖生成的 precision 属性,带有整个数据集的可感知值:

Field Headers in Data Pipeline

最后预览一下,电子游戏网址大全可以看到模式状态良好!

{
  "type": "record",
  "name": "taxi",
  "doc": "",
  "fields": [
    {
      "name": "medallion",
      "type": "string"
    },
    ...
    {
      "name": "fare_amount",
      "type": {
        "type": "bytes",
        "logicalType": "decimal",
        "precision": 6,
        "scale": 2
      }
    },
    ...
    {
      "name": "pickup_datetime",
      "type": {
        "type": "long",
        "logicalType": "timestamp-millis"
      }
    },
    ...
    {
      "name": "passenger_count",
      "type": "int"
    },
    ...
    {
      "name": "dropoff_latitude",
      "type": {
        "type": "bytes",
        "logicalType": "decimal",
        "precision": 10,
        "scale": 6
      }
    },
    ...
  ]
}

电子游戏网址大全运行管道并查看输出. 我使用Avro Tools从命令行验证输出文件中的模式和记录(这里有一个 useful primer on Avro Tools).

$ java -jar ~/Downloads/avro-tools-1.8.2.jar getschema / tmp / / 2017-12-08-02 /署- 24 - e75fba bd00 - 42 - fd - 80 - c3 - 1 - f591e200ca6_ec7d44fe - 1 -变频器- 4 - c34 - 932 f - ce375ae19348 
日志程序(org . log)没有找到追加器.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN请正确初始化log4j系统.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
{
  "type" : "record",
  "name" : "taxi",
  "doc" : "",
  "fields" : [ {
    "name" : "medallion",
    "type" : "string"
  }, ... {
    "name" : "fare_amount",
    "type" : {
      "type" : "bytes",
      "logicalType" : "decimal",
      "precision" : 6,
      "scale" : 2
    }
  }, ... {
    "name" : "pickup_datetime",
    "type" : {
      "type" : "long",
      "logicalType" : "timestamp-millis"
    }
  }, ... {
    "name" : "passenger_count",
    "type" : "int"
  }, ... {
    "name" : "dropoff_latitude",
    "type" : {
      "type" : "bytes",
      "logicalType" : "decimal",
      "precision" : 10,
      "scale" : 6
    }
  }, ... ]
}

正如预期的那样,这与电子游戏网址大全在管道预览中看到的内容相匹配. Let’s take a look at the data:

$ java -jar avro-tools-1.8.2.Jar tojson—pretty /tmp/out/2017-12-08-02/sdc-24e75fba-bd00-42fd-80c3-1f591e200ca6_ec7d44fe-1afd-4c34-932f-ce375ae19348
日志程序(org . log)没有找到追加器.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN请正确初始化log4j系统.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
{
  “大奖章”:“F6F7D02179BE915B23EF2DB57836442D”,
  “hack_license”:“088879 b44b80cc9ed43724776c539370”,
  "vendor_id" : "VTS",
  "payment_type" : "CRD",
  "fare_amount" : "\u0004°",
  "surcharge" : "2",
  "mta_tax" : "2",
  "tip_amount" : "\u0000¯",
  "tolls_amount" : "\u0000",
  "total_amount" : "\u0005Ã",
  "rate_code" : "1",
  "pickup_datetime" : 1358080561000,
  "dropoff_datetime" : 1358081162000,
  "passenger_count" : 5,
  "trip_time_in_secs" : 600,
  "trip_distance" : "\u00018",
  "pickup_longitude" : "û–å{",
  "pickup_latitude" : "\u0002mV·",
  "dropoff_longitude" : "û–ò¶",
  "dropoff_latitude" : "\u0002lí3",
  "credit_card" : "xxxxxxxxxxxx2922",
  "credit_card_type" : "Visa"
}
...

字符串和整数看起来很好,但是 datetime and amount fields? Avro defines Logical Types for timestamp-millis, decimal and other derived types, 指定序列化的基础Avro类型和其他属性. 时间戳表示为从unix时代起的一长串毫秒数, 1 January 1970 00:00:00.000 UTC,而小数被编码为包含 two’s-complement representation of the unscaled integer value in big-endian byte order. 十进制字段在JSON表示中看起来特别奇怪, 但请放心,数据在实际的Avro编码中是完全保真的!

Conclusion

Schema Generator处理器是一个方便的工具,可以避免电子游戏网址大全手工编写Avro模式, and a key component of the 电子游戏厅 Apache Sqoop Import Tool, but there is one caveat. The processor has no persistent state, 因此,它不能跟踪管道重启之间的模式,以确保进化的模式遵循Avro的模式进化规则. For this reason, 您不应该将架构生成器与漂移数据一起使用——也就是说, 当传入的记录结构可能随时间变化时.

如果汽车可以自动驾驶,手表可以在你的血压上升时通知你的医生, 为什么还在指定模式和重新构建管道? A smart data pipeline 是否有内置智能的数据管道来抽象细节并尽可能实现自动化, 因此,它很容易设置和连续操作,很少干预.  Try 电子游戏厅 DataOps Platform.

Back To Top

电子游戏网址大全使用cookie来改善您对电子游戏网址大全网站的体验. 单击“允许所有人同意”并继续访问电子游戏网址大全的网站. Privacy Policy