Spark设置自定义的InputFormat读取HDFS文件
本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/problem_spark_reading_hdfs_serializable
Spark提供了HDFS上一般的文件文件读取接口 sc.textFile(),但在某些情况下HDFS中需要存储自定义格式的文件,需要更加灵活的读取方式。
使用KeyValueTextInputFormat
Hadoop的MapReduce框架下提供了一些InputFormat的实现,其中MapReduce2的接口(org.apache.hadoop.mapreduce下)与先前MapReduce1(org.apache.hadoop.mapred下)有区别,对应于newAPIHadoopFile函数。
使用KeyValueTextInputFormat的文件读取如下
import org.apache.hadoop.mapreduce.lib.input.KeyValueTextInputFormat
import org.apache.hadoop.io.Text
val hFile = sc.newAPIHadoopFile("hdfs://hadoopmaster:9000/user/sparkl/README.md",
classOf[KeyValueTextInputFormat], classOf[Text], classOf[Text])
hFile.collect
使用自定义InputFormat
InputFormat是MapReduce框架下将输入的文件解析成字符串的组件,Spark对HDFS中的文件实现自定义读写需要通过InputFormat的子类实现。下面只写简单的思路,具体的可以参考InputFormat和MapReduce相关资料。
InputFormat的修改可以参考TextInputFormat,继承FileInputFormat后,重载createRecordReader返回一个新的继承RecordReader的类,通过新的RecordReader读取数据返回键值对。
打包后注意上传时将jar包一起上传:
`./spark-shell –jars newInputFormat.jar
运行的代码和上面差不多,import相关的包后
val hFile = sc.newAPIHadoopFile("hdfs://hadoopmaster:9000/user/sparkl/README.md",
classOf[NewTextInputFormat], classOf[Text], classOf[Text])
一些坑
序列化问题
在读取文件后使用first或者collect时,出现下面的错误
ERROR scheduler.TaskSetManager: Task 0.0 in stage 2.0 (TID 18) had a not serializable result: org.apache.hadoop.io.IntWritable
Serialization stack:
- object not serializable (class: org.apache.hadoop.io.IntWritable, value: 35)
- element of array (index: 0)
- array (class [Lorg.apache.hadoop.io.IntWritable;, size 1); not retrying
18/12/15 10:40:10 ERROR scheduler.TaskSetManager: Task 2.0 in stage 2.0 (TID 21) had a not serializable result: org.apache.hadoop.io.IntWritable
Serialization stack:
- object not serializable (class: org.apache.hadoop.io.IntWritable, value: 35)
- element of array (index: 0)
- array (class [Lorg.apache.hadoop.io.IntWritable;, size 1); not retrying
当键值对是其它的类型时,还可能出现类似的:
ERROR scheduler.TaskSetManager: Task 0.0 in stage 2.0 (TID 18) had a not serializable result: org.apache.hadoop.io.LongWritable
ERROR scheduler.TaskSetManager: Task 0.0 in stage 2.0 (TID 18) had a not serializable result: org.apache.hadoop.io.Text
此问题略奇怪,都实现了Hadoop的Writable接口,却不能被序列化。某些地方提到Hadoop与Spark没有使用同一套序列化机制,需要在Spark的序列化框架下注册才能使用。
一般更建议在drive程序上收集信息时,首先转换成基本的数据类型:
hFile.filter(k => k._1.toString.contains(“a”)).collect
java.lang.IllegalStateException: unread block data
ERROR executor.Executor: Exception in task 0.3 in stage 0.0 (TID 3)
java.lang.IllegalStateException: unread block data
at java.io.ObjectInputStream$BlockDataInputStream.setBlockDataMode(ObjectInputStream.java:2781)
一个很坑的错误,spark-shell下只出现这个,并未表明真正的错误在哪。在spark的webUI上能够看到相关的运行日志,上面的异常前还有一个异常写的是我重写的InputSplit没有实现Writable接口。此处的坑,InputFormat中用的InputSplit如果需要重写需要实现Writable接口,在MapReduce下使用貌似没有这一要求。
补上之后上传到集群的nodemanager即可。注意,当nodemanager和spark-shell上传的jar包中有相同的类时,nodemanager优先使用了自身的类。
Spark设置自定义的InputFormat读取HDFS文件的更多相关文章
- pig 自定义udf中读取hdfs 文件
最近几天,在研究怎么样把日志中的IP地址转化成具体省份城市. 希望写一个pig udf IP数据库采用的纯真IP数据库文件qqwry.dat,可以从http://www.cz88.net/下载. 这里 ...
- Spark读取HDFS文件,文件格式为GB2312,转换为UTF-8
package iie.udps.example.operator.spark; import scala.Tuple2; import org.apache.hadoop.conf.Configur ...
- Spark读取HDFS文件,任务本地化(NODE_LOCAL)
Spark也有数据本地化的概念(Data Locality),这和MapReduce的Local Task差不多,如果读取HDFS文件,Spark则会根据数据的存储位置,分配离数据存储最近的Execu ...
- 记录一次读取hdfs文件时出现的问题java.net.ConnectException: Connection refused
公司的hadoop集群是之前的同事搭建的,我(小白一个)在spark shell中读取hdfs上的文件时,执行以下指令 >>> word=sc.textFile("hdfs ...
- 问题记录:spark读取hdfs文件出错
错误信息: scala> val file = sc.textFile("hdfs://kit-b5:9000/input/README.txt") 13/10/29 16: ...
- 读取hdfs文件之后repartition 避免数据倾斜
场景一: api: textFile("hfds://....").map((key,value)).reduceByKey(...).map(实际的业务计算逻辑) 场景:hdf ...
- java Api 读取HDFS文件内容
package dao; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import java ...
- 读取hdfs文件内容
基础环境: cdh2.71 需要注意: url地址参照 <property> <name>dfs.namenode.servicerpc-address</name> ...
- 用java api读取HDFS文件
import java.io.IOException; import java.io.InputStream; import java.security.PrivilegedExceptionActi ...
随机推荐
- java 使用GraphQL-关联对象
GraphQL并不会实现关联查询,数据关联需要程序自己实现 官网首页有介绍获取多个资源只需要一个请求,如想获取用户信息和身份证信息,原来需要先查用户信息,再通过用户id查询身份证信息,而在GraphQ ...
- jmeter中assertion的使用
用于检查测试中得到的响应数据等是否符合预期,用以保证性能测试过程中的数据交互与预期一致. 最新版本的3.0jmeter中有13种不同的断言: 1)BeanShell断言:针对sampler中的Bean ...
- Fortify漏洞之Denial of Service: Regular Expression
继续对Fortify的漏洞进行总结,本篇主要针对 Denial of Service: Regular Expression 漏洞进行总结,如下: 1.Denial of Service: Reg ...
- uboot使用脚本
使用mkimage命令 # mkimage -A ARM -O linux -T script -C none -n "script" -d *.sh *.img # tftp x ...
- ANE打包工具使用视频教程 -- 梦宇技术 @极客学院
来源:http://xtiqin.blog.163.com/blog/static/17017217920133584934827/ ANE打包工具使用视频教程 2013-04-05 08:49:34 ...
- MySQL 5.7主从复制实战篇
MySQL 5.7主从复制实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装MySQL数据库并启动 1>.在MySQL官方下载相应的安装包(https://dev ...
- 文本编辑器Vim/Neovim任意代码执行漏洞(CVE-2019-12735)
受影响版本: Vim < 8.1.1365, Neovim < 0.3.6 前提:开启modeline 0x01 开启modeline 在你的home下的.vimrc文件中增加一行: se ...
- 用js刷剑指offer(从1到n整数中1出现的次数)
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- SOA=SOME/IP?你低估了这件事 | 第二弹
哈喽,大家好,第二弹的时间到~上文书说到v-SOA可以通过SOC.SORS和SOS来分解落地,第一弹中已经聊了SOC的实现,这部分也是国内各大OEM正在经历的阶段,第二弹,我们继续聊 ...
- PAT_A1059
这是一道素数因子分解的问题: 1.先打印素数表出来,以便后期使用,素数表的大小就是10^5级别就可以,因为输入的数是long int(即就是int而已),大小最大21亿(10^10量级的),我们这里素 ...