使用 avro-tools, jq 查看 Apache Avro 序列化文件

栏目: Java · 发布时间: 9年前

内容简介:使用 avro-tools, jq 查看 Apache Avro 序列化文件

Apache Avro 是类似于 Google protobuf 那样的数据交换协议,但 Avro 可以用 JSON 格式来定义 Schema, 所以相比而言更容易上手。它也是 Hadoop, Kafka 所采用的交换格式。对于生成的 avro 序列化文件如果要编写代码来解读其中内容的话就太过于麻烦,Apache 给了我们一个便捷的 工具 来处理 Avro Schema 和数据。

Java 版的 Avro Tools 可点击链接 avro-tools-1.8.2.jar 下载,当前版本 1.8.2(发布于 2017/05/20),执行命令是

java -jar avro-tools-1.8.2.jar ..............

如果是 Mac 平台,还可以通过

brew install avro-tools

来安装,执行命令就只是 avro-tools 了。

在本文中还会用到一个 JSON 格式化高亮显示的工具 jq , 在 Mac 下通过以下命令安装

brew install jq

avro-tools 和 jq 已准备就绪,接下来演示下如何使用它们。

avro-tools 能做什么

➜  avro-tools
Version 1.8.1 of Apache Avro
Copyright 2010-2015 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).
----------------
Available tools:
          cat  extracts samples from files
      compile  Generates Java code for the given schema.
       concat  Concatenates avro files without re-compressing.
   fragtojson  Renders a binary-encoded Avro datum as JSON.
     fromjson  Reads JSON records and writes an Avro data file.
     fromtext  Imports a text file into an avro data file.
      getmeta  Prints out the metadata of an Avro data file.
    getschema  Prints out schema of an Avro data file.
          idl  Generates a JSON schema from an Avro IDL file
 idl2schemata  Extract JSON schemata of the types from an Avro IDL file
       induce  Induce schema/protocol from Java class/interface via reflection.
   jsontofrag  Renders a JSON-encoded Avro datum as binary.
       random  Creates a file with randomly generated instances of a schema.
      recodec  Alters the codec of a data file.
       repair  Recovers data from a corrupt Avro Data file
  rpcprotocol  Output the protocol of a RPC service
   rpcreceive  Opens an RPC Server and listens for one message.
      rpcsend  Sends a single RPC message.
       tether  Run a tethered mapreduce job.
       tojson  Dumps an Avro data file as JSON, record per line or pretty.
       totext  Converts an Avro data file to a text file.
     totrevni  Converts an Avro data file to a Trevni file.
  trevni_meta  Dumps a Trevni file's metadata as JSON.
trevni_random  Create a Trevni file filled with random instances of a schema.
trevni_tojson  Dumps a Trevni file as JSON.

能做的事情很多,可以编译 Schema 为 Java 代码,从 avro 文件中获得元数据,Schema, 生成 JSON 数据,还能合并和修复 avro 文件等等。

定义 Schema 文件

创建一个 Avro Schema 文件 user.avsc, 内容如下

{
  "namespace": "cc.unmi.data",
  "type": "record",
  "name": "User",
  "fields": [
    {"name": "id", "type": "int"},
    {"name": "name", "type": "string"},
    {"name": "address", "type": "string"}
  ]
}

创建 JSON 数据文件

avro-tools 可以通过 Schema 定义和 JSON 数据文件来生成 avro 序列化文件,所以现定义 user.json 内容如下

{"id": 1, "name": "Yanbin", "address": "Chicago"}
{"id": 2, "name": "Someone1", "address": "Shenzhen"}
{"id": 3, "name": "Someone2", "address": "Ji'an"}

注意,这个不是真正意义上的 JSON 文件,每个 {} 表示一条记录,不需要 [], 也不用逗号分隔。

生成 avro 文件

avro-tools fromjson --schema-file user.avsc --code deflate user.json > user.avro

现在生成了一个序列化文件 user.avro , 并选取了压缩方式为 deflate。可用 vi 打它来大致查看下

使用 avro-tools, jq 查看 Apache Avro 序列化文件

是一个 avro 文件上,Schema 内容也在里面,avro.codec 是 deflate, 数据内容看不出来,即使用不压缩的数据用 vi 看得也不明白,所以需要用 avro-tools 来查看记录内容

查看 avro 数据

用 avro-tools 的 tojson 命令

➜ avro-tools tojson user.avro

log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).

log4j:WARN Please initialize the log4j system properly.

log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

{"id":1,"name":"Yanbin","address":"Chicago"}

{"id":2,"name":"Someone1","address":"Shenzhen"}

{"id":3,"name":"Someone2","address":"Ji'an"}

上面蓝色部分即为序列化 user.avro 文件中数据记录,而且从前面我们应该注意到每次执行 avro-tools 命令都会打印 log4j 的告警信息--找不到 appenders, 这是 avro-tools 没处理好的,可以简单用 `2 > /dev/null` 屏蔽掉。后面也会介绍一个办法来消除这个 log4j 告警信息。

➜ avro-tools tojson user.avro 2>/dev/null

{"id":1,"name":"Yanbin","address":"Chicago"}

{"id":2,"name":"Someone1","address":"Shenzhen"}

{"id":3,"name":"Someone2","address":"Ji'an"}

avro-tools getscheme

➜ avro-tools getschema user.avro 2>/dev/null

{

"type" : "record",

"name" : "User",

"namespace" : "cc.unmi.data",

"fields" : [ {

"name" : "id",

"type" : "int"

}, {

"name" : "name",

"type" : "string"

}, {

"name" : "address",

"type" : "string"

} ]

}

avro-tools getmeta

➜ avro-tools getmeta user.avro 2>/dev/null

avro.schema    {"type":"record","name":"User","namespace":"cc.unmi.data","fields":[{"name":"id","type":"int"},{"name":"name","type":"string"},{"name":"address","type":"string"}]}

avro.codec    deflate

avro-tools + jq 高亮格式化显示

格式化并高亮显示,命令 avro-tools tojson user.avro | jq

使用 avro-tools, jq 查看 Apache Avro 序列化文件

紧凑高亮显示,命令 avro-tools tojson user.avro | jq

使用 avro-tools, jq 查看 Apache Avro 序列化文件

一行一记录的显示好处是节约屏幕,并且更方便于用 grep 来查找记录

消除 avro-tools 的 log4j 警告信息

默认情况下我们每次执行 avro-tools 命令都会看到 lo4j 的警告信息

log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).

log4j:WARN Please initialize the log4j system properly.

log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

这对我们是没有用处的,应该是 avro-tools 中 Java 代码是被应用中 Java 项目中,一般都会有可用的日志配置文件,但作为命令来运行就没有 log4j 配置文件。因此消除上面信息的办法就是给它一个 log4j.properties 文件

进到 avro-tools 命令所在的目录,用 brew 安装的话,在 /usr/local/Cellar/avro-tools/1.8.1/bin 目录中,在该目录中创建文件

log4j.properties, 内容如下

log4j.rootLogger = ERROR, nullAppender

log4j.appender.nullAppender=org.apache.log4j.varia.NullAppender

并修改 avro-tools 命令文件如下

#!/bin/bash

exec java -Dlog4j.configuration=file:/usr/local/Cellar/avro-tools/1.8.1/bin/log4j.properties \

-jar /usr/local/Cellar/avro-tools/1.8.1/libexec/avro-tools-1.8.1.jar "$@"

如此,则以后执行 avro-tools 命令就不会看到 log4j:WARN 信息了。如果常见得 NullAppender 太过份了点,可以配置只有 ERROR 级别的信息输出到控制台 ConsoleAppender.

链接:1. Reading and Writing Avro Files From the Command Line


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

网络、群体与市场

网络、群体与市场

大卫·伊斯利(David Esley)、乔恩·克莱因伯格(Jon Kleinberg) / 李晓明、王卫红、杨韫利 / 清华大学出版社 / 2011-10-1 / CNY 69.00

过去十年来,现代社会中复杂的连通性向公众展现出与日俱增的魅力。这种连通性在许多方面都有体现并发挥着强大的作用,包括互联网的快速成长、全球通信的便捷,以及新闻与信息(及传染病与金融危机)以惊人的速度与强度传播的能力。这种现象涉及网络、动机和人们的聚合行为。网络将人们的行为联系起来,使得每个人的决定可能对他人产生微妙的后果。 本书是本科生的入门教材,同时也适合希望进入相关领域的高层次读者。它从交......一起来看看 《网络、群体与市场》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具