a) 内存溢出,通过set("spark.executor.memory", "8g")解决
b) 各种各样的NonSerializableException,通过set("spark.serializer","org.apache.spark.serializer.KryoSerializer")解决
c) 实现multipleOutput
Spark和Avro的结合并不好,没有类似avro-mapred的库。无法直接实现AvroMultipleOutput
通过自己写partitionBy,以及foreachPartion(writeAvro)解决
1. 如何添加HBase依赖。
这个经过在社区提问得到解决:
exportSPARK_CLASSPATH="/usr/lib/hbase/conf/:/usr/lib/hbase/hbase-common.jar:/usr/lib/hbase/hbase-client.jar:/usr/lib/hbase/hbase-protocol.jar:/usr/lib/hbase/lib/htrace-core.jar"
只需要添加hbase-common,hbase-client, hbase-protocol, htrace-core四个jar包,以及hbase/conf目录;
而不需要添加整个`hbase classpath`——这样会导致依赖冲突
2. HBase conf, connection, table的重用问题
val HBASE_CONF = HBaseConfiguration.create
val CONNECTION =HConnectionManager.createConnection(HBASE_CONF)
val table =CONNECTION.getTable(SessionUtils.TABLE_NAME)
其中HBASE_CONF,CONNECTION可以重用,放在object中。table不是线程安全的,需要每个map单独创建。
最后采用mapPartition替代flatMap,每个partition只创建一个table。