Avro 数据格式和命令行

  • 支持的原始类型:null,boolean,int,long,float,double,bytes,string
  • 支持的复杂类型有:

records

  • 必须:"type":"record"
  • 必须:"name":"记录名"
  • "namespace":"包名"
  • "doc":"为schema提供文档"
  • "aliases":"json的一个string数组,为这条记录提供别名"
  • 必须:"fields":"json数组,列举所有属性,每个fields都是一个json对象并包含如下属性"

    • 必须:"name":"属性名"
    • 必须:"type":"属性类型"
    • "doc":"属性文档"
    • "order":"默认升序"
    • "default":"属性默认值"

    markdown_img_paste_20181103110442275

  • 案例

    {
    "namespace": "example.avro",
    "type": "record",
    "name": "User",
    "fields": [
         {"name": "name", "type": "string"},
         {"name": "favorite_number",  "type": ["int", "null"]},
         {"name": "favorite_color", "type": ["string", "null"]}
    ]
    }

enums

  • 必须:"type":"enum"
  • 必须:"name":"enum名"
  • "namespace":"限定和修饰name属性,包名"
  • 必须:"symbols":"string数组,列举所有枚举"
  • "aliases":"string数组,为enum提供别名"
  • "doc":"为此schema提供文档"

    {
        "type": "enum",
        "name": "Suit",
        "symbols": [
            "SPADES",
            "HEARTS",
            "DIAMONDS",
            "CLUBS"
        ]
    }

arrays

  • 必须:"items":"array中元素的Schema"

    {
      "type": "record",
      "name": "ArrAvro",
      "fields" : [
        {"name": "arr", "type": ["null",{"type":"array", "items":"string"}]}
      ]
    }
    编译后是:  @Deprecated public java.util.List<java.lang.CharSequence> arr;

maps

  • 必须:"values":"定义map的值的Schema,Maps的key都是string"
  • Map定义为

    {
        "type": "record",
        "name": "MapAvro",
        "fields": [
            {
                "name": "map",
                "type": [
                    "null",
                    {
                        "type": "map",
                        "values": "long"
                    }
                ]
            }
        ]
    }
    编译后:  @Deprecated public java.util.Map<java.lang.CharSequence,java.lang.Long> map

unions

  • Unions就像JSON的数组表示:["string", "null"],声明了一个union的Schema,其元素即可以是string,也可以是null。
  • Unions不能包含多个相同类型的Schema,除非是命名的record类型、命名的fixed类型和命名的enum类型。比如,如果unions中包含两个array类型,或者包含两个map类型都不允许;但是两个具有不同name的相同类型却可以。由此可见,union是通过Schema的name来区分元素Schema的,因为array和map没有name属性,当然只能存在一个array或者map。(使用name作为解析的原因是这样做会使得读写unions更加高效)。unions不能紧接着包含其他的union。
  • 组合类型,表示各种类型的组合,使用数组进行组合。比如[“null”, “string”]表示类型可以为null或者string。
  • 组合类型的默认值是看组合类型的第一个元素,因此如果一个组合类型包括null类型,那么null类型一般都会放在第一个位置,这样子的话这个组合类型的默认值就是null。
  • 组合类型中不允许同一种类型的元素的个数不会超过1个,除了record,fixed和enum。比如组合类中有2个array类型或者2个map类型,这是不允许的。
  • 组合类型不允许嵌套组合类型。

fixed.

  • 必须:"name":"名字"
  • "namespace":"包名"
  • "aliases":"别名"
  • 必须:"size":"一个整数,表示每个值的字节数"
  • 比如16字节的fixed可以声明为:{"type": "fixed", "size": 16, "name": "md5"}

avro命令

  • 使用avro工具将json文件转换成avro文件:java -jar avro-tools-1.8.0.jar fromjson --schema-file user.avsc user.json > user.avro
  • 可以设置压缩格式:java -jar avro-tools-1.8.0.jar fromjson --codec snappy --schema-file user.avsc user.json > user2.avro
  • 将avro文件反转换成json文件:
java -jar avro-tools-1.8.0.jar tojson user.avro
java -jar avro-tools-1.8.0.jar --pretty tojson user.avro
  • 得到avro文件的meta:java -jar avro-tools-1.8.0.jar getmeta user.avro

    • 输出:
    avro.codec    null
    avro.schema    {"type":"record","name":"User","namespace":"example.avro","fields":[{"name":"name","type":"string"},{"name":"favorite_number","type":"int"},{"name":"favorite_color","type":"string"}]}
  • 得到avro文件的schema:java -jar avro-tools-1.8.0.jar getschema user.avro
  • 将文本文件转换成avro文件:java -jar avro-tools-1.8.0.jar fromtext user.txt usertxt.avro
Flume 是一个分布式的、可靠的、高可用的海量日志采集、聚合和传输的系统,它可以帮助我们快速地将大量的日志数据从不同的源头采集到 Hadoop 生态系统中。其中,Avro 是一种数据交换格式,它支持动态的数据类型定义,数据压缩和二进制编码,使得数据传输更加高效和灵活。下面是使用 Avro 数据源测试 Flume 的实验原理: 1. 准备环境:安装 JDK、Flume 和 Avro 工具包,并在本地或者远程服务器上启动 Flume 的 Agent。 2. 配置 Flume Agent:在 Flume Agent 的配置文件中,设置 Avro Source 和其他必要的组件,如 Channel 和 Sink。同时,指定数据源的 IP 地址和端口号,以便 Flume Agent 可以从该数据源中获取数据。 3. 启动 Avro 数据源:使用 Avro 工具包中的命令行工具,启动 Avro 数据源,并将其绑定到指定的 IP 地址和端口号上。此时,Avro 数据源会监听这个端口,并等待 Flume Agent 的连接请求。 4. 模拟数据生成:使用自定义的 Python 脚本或其他工具,模拟数据生成并发送到 Avro 数据源的监听端口。这些数据可以是结构化的、半结构化的或非结构化的,如 JSON、XML、CSV 和文本等格式。 5. 数据采集和传输:Flume Agent 会从 Avro 数据源中获取数据,并将其写入到指定的 Channel 中。同时,Flume Agent 会根据配置文件中定义的 Sink,将数据传输到指定的目的地,如 HDFS、Kafka 和 Elasticsearch 等。 6. 数据处理和分析:在数据传输完成后,我们可以使用 Hive、Spark、Pig 和 Impala 等工具,对数据进行处理、分析和可视化。这些工具可以帮助我们深入了解数据的特征和规律,为业务决策提供有力的支持。 总之,使用 Avro 数据源测试 Flume 的实验原理是基于 Flume 的强大功能和 Avro 的高效性能,实现数据的快速、准确和可靠的采集和传输,为大数据应用的开发和部署提供了有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值