spark使用scala读取Avro数据(转)

这是一篇翻译,原文来自:How to load some Avro data into Spark

首先,为什么使用 Avro ?

最基本的格式是 CSV ,其廉价并且不需要顶一个一个 schema 和数据关联。

随后流行起来的一个通用的格式是 XML,其有一个 schema 和 数据关联,XML 广泛的使用于 Web Services 和 SOA 架构中。不幸的是,其非常冗长,并且解析 XML 需要消耗内存。

另外一种格式是 JSON,其非常流行易于使用因为它非常方便易于理解。

这些格式在 Big Data 环境中都是不可拆分的,这使得他们难于使用。在他们之上使用一个压缩机制(Snappy,Gzip)并不能解决这个问题。

因此不同的数据格式出现了。Avro 作为一种序列化平台被广泛使用,因为它能跨语言,提供了一个小巧紧凑的快速的二进制格式,支持动态 schema 发现(通过它的泛型)和 schema 演变,并且是可压缩和拆分的。它还提供了复杂的数据结构,例如嵌套类型。

例子

让我们来看一个例子,创建一个 Avro schema 并生成一些数据。在一个真实案例的例子中,组织机构通常有一些更加普通的格式,例如 XML,的数据,并且他们需要通过一些工具例如 JAXB 将他们的数据转换成 Avro。我们来使用这个例子,其中 twitter.avsc 如下:

{
   "type" : "record",
   "name" : "twitter_schema",
   "namespace" : "com.miguno.avro",
   "fields" : [
        {     "name" : "username",
               "type" : "string",
              "doc"  : "Name of the user account on Twitter.com"   },
         {
             "name" : "tweet",
             "type" : "string",
             "doc"  : "The content of the user‘s Twitter message"   },
         {
             "name" : "timestamp",
             "type" : "long",
             "doc"  : "Unix epoch time in seconds"   }
    ],
   "doc:" : "A basic schema for storing Twitter messages"
}

twitter.json 中有一些数据:

{"username":"miguno","tweet":"Rock: Nerf paper, scissors is fine.","timestamp": 1366150681 }
{"username":"BlizzardCS","tweet":"Works as intended.  Terran is IMBA.","timestamp": 1366154481 }

我们将这些数据转换成二进制的 Avro 格式:

$ java -jar ~/avro-tools-1.7.7.jar fromjson --schema-file twitter.avsc twitter.json > twitter.avro

然后,我们将 Avro 数据转换为 Java:

$ java -jar /app/avro/avro-tools-1.7.7.jar compile schema /app/avro/data/twitter.avsc /app/avro/data/

现在,我们编译这些类并将其打包:

$ CLASSPATH=/app/avro/avro-1.7.7-javadoc.jar:/app/avro/avro-mapred-1.7.7-hadoop1.jar:/app/avro/avro-tools-1.7.7.jar
$ javac -classpath $CLASSPATH /app/avro/data/com/miguno/avro/twitter_schema.java
$ jar cvf Twitter.jar com/miguno/avro/*.class

我们启动 Spark,并将上面创建的 Jar 和一些需要的库(Hadoop 和 Avro)传递给 Spark 程序:

$ ./bin/spark-shell --jars /app/avro/avro-mapred-1.7.7-hadoop1.jar,/avro/avro-1.7.7.jar,/app/avro/data/Twitter.jar

在 REPL 中,我们获取数据并创建一个 RDD:

scala>
import com.miguno.avro.twitter_schema
import org.apache.avro.file.DataFileReader;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.avro.mapreduce.AvroKeyInputFormat
import org.apache.avro.mapred.AvroKey
import org.apache.hadoop.io.NullWritable
import org.apache.avro.mapred.AvroInputFormat
import org.apache.avro.mapred.AvroWrapper
import org.apache.avro.generic.GenericRecord
import org.apache.avro.mapred.{AvroInputFormat, AvroWrapper}
import org.apache.hadoop.io.NullWritable

val path = "/app/avro/data/twitter.avro"
val avroRDD = sc.hadoopFile[AvroWrapper[GenericRecord], NullWritable, AvroInputFormat[GenericRecord]](path)
avroRDD.map(l => new String(l._1.datum.get("username").toString() ) ).first

返回结果:

res2: String = miguno

一些注意事项:

翻译结束。



接下来,我将上述过程在 CDH 5.3 集群中测试一遍。

验证

首先,在集群一个节点创建 twitter.avsc 和 twitter.json 两个文件。

然后,使用 avro-tools 将这些数据转换成二进制的 Avro 格式:

$ java -jar /usr/lib/avro/avro-tools.jar fromjson --schema-file twitter.avsc twitter.json > twitter.avro

这时候会生成 avro 文件:

$ ll
总用量 12
-rw-r--r-- 1 root root 543  3月 25 15:13 twitter.avro
-rw-r--r-- 1 root root 590  3月 25 15:12 twitter.avsc
-rw-r--r-- 1 root root 191  3月 25 15:12 twitter.json

将 Avro 数据转换为 Java:

$ java -jar /usr/lib/avro/avro-tools.jar compile schema twitter.avsc .

这时候会生成 twitter_schema.java 文件:

$ tree
.
├── com
│   └── miguno
│       └── avro
│           └── twitter_schema.java
├── twitter.avro
├── twitter.avsc
└── twitter.json

这时候会生成一个 Twitter.jar 的 jar 包。

编译这些类并将其打包:

$ CLASSPATH=/usr/lib/avro/avro-mapred-hadoop2.jar:/usr/lib/avro/avro-tools.jar
$ javac -classpath $CLASSPATH com/miguno/avro/twitter_schema.java
$ jar cvf Twitter.jar com/miguno/avro/*.class

在当前目录,运行 spark-shell:

spark-shell --jars /usr/lib/avro/avro-mapred-hadoop2.jar,/usr/lib/avro/avro.jar,Twitter.jar

将 twitter.avro 上传到 hdfs:

hadoop fs -put twitter.avro

在 REPL 中,我们创建一个 RDD 并查看结果是否和上面一致:

scala>
import com.miguno.avro.twitter_schema;
import org.apache.avro.file.DataFileReader;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.avro.mapreduce.AvroKeyInputFormat
import org.apache.avro.mapred.AvroKey
import org.apache.hadoop.io.NullWritable
import org.apache.avro.mapred.AvroInputFormat
import org.apache.avro.mapred.AvroWrapper
import org.apache.avro.generic.GenericRecord
import org.apache.avro.mapred.{AvroInputFormat, AvroWrapper}
import org.apache.hadoop.io.NullWritable

val path = "twitter.avro"
val avroRDD = sc.hadoopFile[AvroWrapper[GenericRecord], NullWritable, AvroInputFormat[GenericRecord]](path)
avroRDD.map(l => new String(l._1.datum.get("username").toString() ) ).first

更多的 Avro Tools 用法,可以参考 Avro 介绍

时间: 2024-08-25 06:00:59

spark使用scala读取Avro数据(转)的相关文章

0016-Avro序列化&反序列化和Spark读取Avro数据

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看. 1.简介 本篇文章主要讲如何使用java生成Avro格式数据以及如何通过spark将Avro数据文件转换成DataSet和DataFrame进行操作. 1.1Apache Arvo是什么? Apache Avro 是一个数据序列化系统,Avro提供Java.Python.C.C++.C#等语言API接口,下面我们通过java的一个实例来说明Avro序列化和反序列化数据. 支持丰富的数据结构 快速可压缩的二进制数据格式 存储持久数据的

Spark学习笔记4:数据读取与保存

Spark对很多种文件格式的读取和保存方式都很简单.Spark会根据文件扩展名选择对应的处理方式. Spark支持的一些常见文件格式如下: 1.文本文件 使用文件路径作为参数调用SparkContext中的textFile()函数,就可以读取一个文本文件.也可以指定minPartitions控制分区数.传递目录作为参数,会把目录中的各部分都读取到RDD中.例如: val input = sc.textFile("E:\\share\\new\\chapter5") input.fore

scala实现读取Oracle数据

用scala实现读取oracle数据 增加oralce的jar包后 package cn.bigdata.scala.oracle import java.sql.{DriverManager, Connection, ResultSet} object ConnectOracle { val user="youname" val password = "youpwd" val conn_str = "jdbc:oracle:thin:@ip:1521:d

学习Scala 进击大数据Spark生态圈

第1章 初识Scala 了解Scala是什么,学习Scala的意义何在, Scala安装,快速入门,Scala与Java开发对比 第2章 Scala入门 掌握Scala变量与常量,数据类型,lazy的使用,Scala开发IDEA选择以及使用IDEA整合Maven搭建Scala应用程序开发环境 第3章 Scala函数 掌握函数在Scala中的定义以及使用的注意实现,条件以及循环表达式在Scala中的使用 第4章 Scala对象 这是Scala中的重中之重,务必要掌握,涉及到的内容有:类.构造器.继

IDEA下Spark的开发(DT大数据梦工厂)

IDEA越使用效果越好,快捷键方便,阅读源码方便 一般阅读Spark或者Scala的源码都采用IDEA使用 下载IDEA最新版本的社区版本即可, 安装的时候必须安装Scala,这个过程是IDEA自动化的插件管理,所以点击后会自动下载(跳过在setting plugins里面也可以安装) 本地JAVA8和Scala2.10.4软件套件的安装和Eclipse不同 打开 打开之后点击File->Project Structure来设置工程的Libraries 核心是添加Spark的jar依赖 代码拷贝

Spark使用Scala语言进行实现,它是一种面向对象

Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架.Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处,Spark以其先进的设计理念,迅速成为社区的热门项目,围绕着Spark推出了Spark SQL.Spark Streaming.MLLib和GraphX等组件,也就是BDAS(伯克利数据分析栈),这些组件逐渐形成大数据处理一站式解决平台.从各方

Spark 2.x企业级大数据项目实战(实时统计、离线分析和实时ETL)

Spark 2.x企业级大数据项目实战(实时统计.离线分析和实时ETL)全套课程下载:https://pan.baidu.com/s/1mje6bAoLLPrxUIrM-C2VMg 提取码: 9n1x 本门课程来源于一线生产项目, 所有代码都是在现网大数据集群上稳定运行, 拒绝Demo.课程涵盖了离线分析.实时分析绝大部分的场景,通过三个实际生产项目教授如何优雅地集成Hadoop.Spark.HBase.Kafka.Redis.MySQL等相关大数据技术,并实际落地 . 本门课程全程实操,不用担

毕设三 spark与phoenix集成插入数据/解析json数组

需求:将前些日子采集的评论存储到hbase中 思路: 先用fastjson解析评论,然后构造rdd,最后使用spark与phoenix交互,把数据存储到hbase中 部分数据: 1 [ 2 { 3 "referenceName": "Apple iPhone XR 64GB 黑色 移动联通电信4G全网通手机 双卡双待", 4 "creationTime": "2019-04-08 01:13:42", 5 "cont

18小时内掌握Spark:把云计算大数据速度提高100倍以上

如何把云计算大数据处理速度提高100倍以上?Spark给出了答案. Spark是可以革命Hadoop的目前唯一替代者,能够做Hadoop做的一切事情,同时速度比Hadoop快了100倍以上,下图来自Spark的官方网站: Logistic regression in Hadoop and Spark 可以看出在Spark特别擅长的领域其速度比Hadoop快120倍以上! Spark是基于内存,是云计算领域的继Hadoop之后的下一代的最热门的通用的并行计算框架开源项目,尤其出色的支持Intera