- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Spark 1.0 在 HBase (0.96.0-hadoop2) 中写入一些简单的数据,但我不断遇到序列化问题。相关代码如下:
import org.apache.hadoop.hbase.client._
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.util.Bytes
import org.apache.spark.rdd.NewHadoopRDD
import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.mapred.JobConf
import org.apache.spark.SparkContext
import java.util.Properties
import java.io.FileInputStream
import org.apache.hadoop.hbase.client.Put
object PutRawDataIntoHbase{
def main(args: Array[String]): Unit = {
var propFileName = "hbaseConfig.properties"
if(args.size > 0){
propFileName = args(0)
}
/** Load properties here **/
val theData = sc.textFile(prop.getProperty("hbase.input.filename"))
.map(l => l.split("\t"))
.map(a => Array("%010d".format(a(9).toInt)+ "-" + a(0) , a(1)))
val tableName = prop.getProperty("hbase.table.name")
val hbaseConf = HBaseConfiguration.create()
hbaseConf.set("hbase.rootdir", prop.getProperty("hbase.rootdir"))
hbaseConf.addResource(prop.getProperty("hbase.site.xml"))
val myTable = new HTable(hbaseConf, tableName)
theData.foreach(a=>{
var p = new Put(Bytes.toBytes(a(0)))
p.add(Bytes.toBytes(hbaseColFamily), Bytes.toBytes("col"), Bytes.toBytes(a(1)))
myTable.put(p)
})
}
}
运行代码结果:
Failed to run foreach at putDataIntoHBase.scala:79
Exception in thread "main" org.apache.spark.SparkException: Job aborted due to stage failure: Task not serializable: java.io.NotSerializableException:org.apache.hadoop.hbase.client.HTable
用map替换foreach不会崩溃,但我也不写。任何帮助将不胜感激。
最佳答案
HBaseConfiguration
类表示与 HBase 服务器的连接池。显然,它无法被序列化并发送到工作节点。由于 HTable
使用此池与 HBase 服务器通信,因此它也无法序列化。
基本上,可以通过三种方法来处理这个问题:
注意foreachPartition
方法的使用:
val tableName = prop.getProperty("hbase.table.name")
<......>
theData.foreachPartition { iter =>
val hbaseConf = HBaseConfiguration.create()
<... configure HBase ...>
val myTable = new HTable(hbaseConf, tableName)
iter.foreach { a =>
var p = new Put(Bytes.toBytes(a(0)))
p.add(Bytes.toBytes(hbaseColFamily), Bytes.toBytes("col"), Bytes.toBytes(a(1)))
myTable.put(p)
}
}
请注意,每个工作节点都必须有权访问 HBase 服务器,并且必须预先安装或通过 ADD_JARS
提供所需的 jar。
另请注意,由于如果为每个分区打开连接池,因此最好将分区数量大致减少到工作节点的数量(使用合并功能)。也可以在每个工作节点上共享一个 HTable
实例,但这并不是那么简单。
可以用一台计算机写入 RDD 中的所有数据,即使数据不适合内存。详细信息在此答案中进行了解释:Spark: Best practice for retrieving big data from RDD to local machine
当然,它会比分布式写入慢,但它很简单,不会带来痛苦的序列化问题,如果数据大小合理,可能是最好的方法。
可以为 HBase 创建自定义 HadoopOutputFormat 或使用现有格式。我不确定是否有适合您需求的东西,但 Google 应该可以提供帮助。
P.S. 顺便说一下,map
调用不会崩溃,因为它不会被求值:RDD 不会被求值,直到你用 side- 调用一个函数。影响。例如,如果您调用 theData.map(....).persist
,它也会崩溃。
关于scala - 通过Spark写入HBase : Task not serializable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25250774/
实现了Serializable接口(interface)的类的子类是否也实现了Serializable?也就是说子类的实例也可以序列化吗? 最佳答案 I wanted to ask whether t
当对象可序列化或不可序列化时,将数据对象保存到数据库有什么不同。 例如:我有一个名为 Book 的域类 class Book implements Serializable{ private int
我的理解是conflict serializable 隐含serializable。我不确定这如何让他们与众不同。可序列化是否意味着冲突可序列化? 最佳答案 冲突可序列化是可序列化的一个子集,因此仅仅
我正在阅读接口(interface) Serializable 的文档,我在其中找到以下几行: To allow subtypes of non-serializable classes to be
scala @Serializable 的 Action 方式与Java Serializable 不同吗? 我的意思是序列化对象的方式还是两者都使用相同的标准序列化? 最佳答案 Scala 可以编译
我遇到过使用这两种表示法中的任何一种的例子。我找不到关于它的任何信息,说明哪一个是常见的,为什么允许使用 2 个符号,以及两者之间是否存在任何细微差别。 有人有想法吗? 最佳答案 不,没有功能差异。
“可序列化”类中的字段应该是 transient 的或可序列化的,可以修复在另一个类中使用的任何实体/类,但当在甚至无法创建的 dto 类中声明 List/Map 时,就会发生这种情况也一样短暂。请让
我面临任务不可序列化的问题,我检查了其他答案并使我的调用和调用类可序列化。我的代码就像 - public class MultiClassification implements Serializab
我到处都读到 Java Serializable 比 Parcelable 慢得多。 Kotlin Serializable 也是这样吗?或者 Kotlin Serializable 和 Kotlin
描述: 我有一个 ArrayList,它接受任何实现 Serializable 的类。我什至可以将实现 Serializable 的类的实例添加到这个数组列表中,而不会出现任何编译错误。 Java 泛
我正在实现一个可序列化的类(因此它是一个使用 RMI 的值对象)。但我需要测试它。有没有办法轻松做到这一点? 澄清:我正在实现这个类,所以在类定义中粘贴 Serializable 很简单。我需要手动对
我尝试执行以下简单代码。 System.out.println() 不打印单词“Serialized:”。输出为true。 ArrayList arrayList = new ArrayList();
伙计们,我有一个最简单的类,我想成为 Parcelable。我正在按照以下方式进行: public class MyField implements Serializable, Parcelable
我的问题与this 非常相似除了这个问题我在 SonarLint V3 (squid:S1948) 中遇到过。 我的代码是: public class Page implements Serializ
考虑下面的类(class)。如果我对它运行 Findbugs,它会在第 5 行但不在第 7 行给我一个错误(“可序列化类中的非 transient 非可序列化实例字段”)。 1 public clas
当我在 Spark(由 java 编写)应用程序中使用 UDF 函数时,出现此错误。 org.apache.spark.SparkException:任务不可序列化 在 org.apache.spar
我正在使用KTOR框架在我的Android应用程序中发出http请求。我在运行项目时遇到错误。。插件:。依赖关系:。模型类:。接口调用:。我花了几个小时寻找解决方案。我遵循了许多线索,但都没有奏效。我
我发现有人回答了可线性化和可串行化之间的差异,但我没有发现有人说可串行化与顺序一致性相同或不同。 此外,我在不同的文章、书籍和网页中对上述术语的不同定义感到震惊,我把这一切都搞糊涂了。 有人可以解释可
我读过几个相关的问题,但没有一个是更有趣的情况。 这是我的问题,假设我有课 class A implements Serializable { private int a; priva
我注意到在 Spring-boot 中很多人创建模型/实体并实现 Serialiazable 接口(interface)。 public class ModelBase implements Seri
我是一名优秀的程序员,十分优秀!