从Spark写入HBase:org.apache.spark.SparkException:任务不可序列化

时间:2018-01-29 16:59:04

标签: java apache-spark hbase

我正在为我的大学进行热图项目,我们必须从txt文件(坐标,高度)获取一些数据(212Go),然后将其放入HBase中以使用Express在Web客户端上检索它。

我练习使用144Mo文件,这是有效的:

SparkConf conf = new SparkConf().setAppName("PLE");
JavaSparkContext context = new JavaSparkContext(conf);
JavaRDD<String> data = context.textFile(args[0]);
Connection co = ConnectionFactory.createConnection(getConf());
createTable(co);
Table table = co.getTable(TableName.valueOf(TABLE_NAME));
Put put = new Put(Bytes.toBytes("KEY"));

for (String s : data.collect()) {
    String[] tmp = s.split(",");
    put.addImmutable(FAMILY,
                    Bytes.toBytes(tmp[2]),
                    Bytes.toBytes(tmp[0]+","+tmp[1]));
}

table.put(put);

但是我现在使用212Go文件,我得到了一些内存错误,我猜收集方法收集内存中的所有数据,所以212Go太多了。

所以现在我正在尝试这个:

SparkConf conf = new SparkConf().setAppName("PLE");
JavaSparkContext context = new JavaSparkContext(conf);
JavaRDD<String> data = context.textFile(args[0]);
Connection co = ConnectionFactory.createConnection(getConf());
createTable(co);
Table table = co.getTable(TableName.valueOf(TABLE_NAME));
Put put = new Put(Bytes.toBytes("KEY"));

data.foreach(line ->{
    String[] tmp = line.split(",");
    put.addImmutable(FAMILY,
                    Bytes.toBytes(tmp[2]),
                    Bytes.toBytes(tmp[0]+","+tmp[1]));
});

table.put(put);

我得到了“org.apache.spark.SparkException:任务不可序列化”,我搜索了它并尝试了一些修复,没有成功,我在这里读到的内容:Task not serializable: java.io.NotSerializableException when calling function outside closure only on classes not objects

实际上我并不理解这个主题中的所有内容,我只是一个学生,也许我的问题的答案显而易见,也许不是,不管怎样,提前谢谢!

1 个答案:

答案 0 :(得分:1)

根据经验,序列化数据库连接(任何类型)都没有意义。有没有设计为序列化和反序列化,Spark或不。

为每个分区创建连接:

data.foreachPartition(partition -> {
  Connection co = ConnectionFactory.createConnection(getConf());
  ... // All required setup
  Table table = co.getTable(TableName.valueOf(TABLE_NAME));
  Put put = new Put(Bytes.toBytes("KEY"));
   while (partition.hasNext()) {
     String line = partition.next();
     String[] tmp = line.split(",");
     put.addImmutable(FAMILY,
                Bytes.toBytes(tmp[2]),
                Bytes.toBytes(tmp[0]+","+tmp[1]));
   }
   ... // Clean connections
});

我还建议从官方的Spark Streaming编程指南中阅读Design Patterns for using foreachRDD