SparkWriteToHFile
1. HFile的LoadIncrement卡住
发生了问题点其实是在truncate table上面,truncate的本质其实是删除表后重建,删除的表内容其实是放在了/hbase/.tmp/data/default/下面;
权限问题是这样的,如果开始使用hdfs权限创建的HFile,拷贝到了hbase的目录下(/hbase/data/default/下面),此时文件权限是"rwxr-xr-x hdfs:hbase",hbase组只有读取和执行权限;在删除HFile的时候,会把HFile文件拷贝到/hbase/.tmp文件夹下,归档(Archieve)就会面临权限问题,因为删除的用户是hbase(在hbase组中),文件权限是hdfs,所以会有问题。
如何泛泛的遍历6.row获取值和列名
开始的处理方式:
var data = new ListBuffer[(String, String, String)]
val rddSchema = df.schema.fieldNames df.rdd.foreach(row => {
var rowkey: String = row.getAs[String]("CUSTID")
for (fieldName: String <- row.schema.fieldNames) {
val value: String = row.getAs[String](fieldName)
data.append((rowkey, fieldName, row.getAs[String](fieldName)))
}
}
这种方式碰到了一个异常:碰到了个异常:java.math.BigDecimal cannot be cast to java.lang.String。这是因为如果非String类型的,getAs[String]将会报错
改变了处理方式:
var data = new ListBuffer[(String, String, String)]
val rddSchema = df.schema.fieldNames
// TODO rowkey need read from config
// TODO best can get data by map but not foreach
df.rdd.foreach(row => {
var rowkey: String = row.getAs[String]("CUSTID")
for (i <- 1 until row.length) {
val fieldName = rddSchema(i).toString
val value = row(i).toString()
data.append((rowkey, fieldName, value))
}
}
row(i).toString没有类型转换问题。
7. 查看日志
对于提交到YARN上面的任务,想要看代码中println的内容,可以在Resource Web UI上面,点击最有一列Trace UI,在跳转的页面中点击上面的"Executors",在Executors列表中,你将会看到Logs一列,里面的stdout链接,在stdout最下面即为用户程序输出日志。注意这个是executor的日志;driver的日志可以通过控制台直接看到。另外Standalone模式,对应的日志输出在NodeManager节点的 spark安装目录/work/。
yarn.log-aggregation-enable,yarn的executor日志是聚合日志,是在任务完成后,汇聚个台机器的日志而成
8. 序列化异常
java.io.NotSerializableException: org.apache.hadoop.hbase.io.ImmutableBytesWritable
指定序列化类,问题解决:
val sc = new SparkContext(new
SparkConf().setAppName("aaa").setMaster("local[*]").set("spark.serializer", "org.apache.spark.serializer.KryoSerializer"))
又爆异常:
java.io.IOException: com.esotericsoftware.kryo.KryoException: java.lang.IndexOutOfBoundsException: Index: 108, Size: 10
Serialization trace:familyMap (org.apache.hadoop.hbase.client.Put)
这类问题,处理方式尽量保证你的代码处理上面,map内部不要引用本类中函数。
8. sparkContext必须要指定名称
val sc = new SparkContext(new SparkConf().setMaster("local[*]"))报错:
An application name must be set in your configuration
指定appName之后问题解决,因为这个name是要在YARN的管理页面做现实(见上面的“查看日志”),用于跟踪所执行任务执行的情况。
val sc = new SparkContext(new SparkConf().setAppName("aaa").setMaster("local[*]"))
9. .size导致指针到迭代器尾部
putValues.repartitionAndSortWithinPartitions(regionSplitPartitioner).foreachPartition(part => {
try {
println("*******************get in the partition part size: " + part.size + "***************")
while (part.hasNext) {... ...}
part.size就会导致一次遍历到尾部,导致part.haseNext为false
10. 内存溢出
...
...
Caused by: java.io.NotSerializableException: com.cmiot.bulkload.HBaseBulkLoader
Serialization stack:
- object not serializable (class: com.cmiot.bulkload.HBaseBulkLoader, value: com.cmiot.bulkload.HBaseBulkLoader@38588dea)
- field (class: com.cmiot.bulkload.HBaseBulkLoader$$anonfun$bulkLoad$2, name: $outer, type: class com.cmiot.bulkload.HBaseBulkLoader)
这个问题的异常是因为map中的代码中引用了不可序列化的内容;我的代码爆了这个错误是因为用了几个org.apache.haddop.conf.Configuration等类;解决方法就是把这些内容统统放在map的匿名函数中进行处理,不要再外部搞。
12. zookeeper的获取HBase配置异常: Connection refused
17/10/11 14:50:32 INFO zookeeper.ClientCnxn: Opening socket connection to server localhost/0:0:0:0:0:0:0:1:2181. Will not attempt to authenticate using SASL (unknown error)
17/10/11 14:50:32 WARN zookeeper.ClientCnxn: Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
java.net.ConnectException: Connection refused
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
这个是因为通过zookeeper获取HBase信息的时候发生异常,地址不对;这是因为上面的那个异常导致了我把所有的配置都放到了map匿名函数中,但是没有做初始化。增加了初始化内容后,获取了正确的配置信息即可:
val hbaseConfig = ConfigFactory.load("hbase.properties")
val prod = hbaseConfig.getString("hbase.zookeeper.property.clientPort")
val parent = hbaseConfig.getString("zookeeper.znode.parent")
val quorum = hbaseConfig.getString("hbase.zookeeper.quorum")
rdd.flatMap(r => flatMap(r)).repartitionAndSortWithinPartitions(regionSplitPartitioner).foreachPartition { part =>
val config = HBaseConfiguration.create()
config.set("hbase.zookeeper.property.clientPort", prod)
config.set("zookeeper.znode.parent", parent)
config.set("hbase.zookeeper.quorum", quorum)
val fs = HFileSystem.get(conf)
粗体倾斜部分之前就是一句话:val config = new Configuration();另外注意ConfigFactory.load不能放在map/foreahPartition里面,因为需要加载本地文件。
但是后来发现这样写也不行,因为编译之后map函数里面的prod等变量都变成了BulkLoader.this.prod的形式,BulkLoader还是会出现;于是我让这个类继承了Serializable,因为构造参数中还有一个Confguration,添加了@transient,进行了屏蔽。
class HBaseBulkLoader(@transient conf: Configuration) extends Serializable{... ... }
粗体倾斜部分之前就是一句话:val config = new Configuration();另外注意ConfigFactory.load不能放在map/foreahPartition里面,因为需要加载本地文件。
但是后来发现这样写也不行,因为编译之后map函数里面的prod等变量都变成了BulkLoader.this.prod的形式,BulkLoader还是会出现;于是我让这个类继承了Serializable,因为构造参数中还有一个Confguration,添加了@transient,进行了屏蔽。
class HBaseBulkLoader(@transient conf: Configuration) extends Serializable{... ... }
SparkWriteToHFile的更多相关文章
随机推荐
- nginx学习之进程控制篇(三)
1. 进程 nginx有一个master进程和一个或多个工作进程. master process worker process or master process worker process wor ...
- 我的Java开发学习之旅------>Base64的编码思想以及Java实现
Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的 ...
- Office 2013“永久激活信息”备份
Office 2013“永久激活信息”备份还原简明教程及成功恢复的注意事项Office 2013永久激活后及时备份激活信息可以保证重装后快速激活.网上也有流行的各种备份工具,虽然操作简单,但是如果不理 ...
- SMARTFORMS自定义打印格式
[转自 http://lz357502668.blog.163.com/blog/static/16496743201272155135570/] 在sap的打印开发中经常需要自定义纸张,具体步骤如下 ...
- 【Mybatis】Insert批量操作
话不多说,直接上代码. <insert id="pesistRT" parameterType="com.test.model.RTSummarizer" ...
- rails 命名
1.model rails g model wordSetting model:WordSetting has_many: word_settings table: word_settings vie ...
- Linux通过Shell对文件自动进行远程拷贝备份
在执行计划任务拷贝文件的时候,用scp命令需要输入密码,这里用公共密钥的方式实现密码的自动输入. 具体操作: 要求:把192.168.0.2机上的test.tar拷贝到192.168.0.3机器的上 ...
- 深入浅出聊聊企业级API网关
http://architect.dataguru.cn/article-11431-1.html API Gateway(API GW / API 网关),顾名思义,是出现在系统边界上的一个面向 A ...
- 每天一个Linux命令(31)diff命令
diff命令在最简单的情况下,比较给定的两个文件的不同.如果使用“-”代替“文件”参数,则要比较的内容将来自标准输入.diff命令是以逐行的方式,比较文本文件的异同处.如果该命令指定进行目录的比较,则 ...
- 20145210姚思羽《网络对抗技术》逆向及Bof基础实践
20145210姚思羽<网络对抗技术>逆向及Bof基础实践 实践目标 1.本次实践的对象是一个名为pwn1的linux可执行文件. 2.该程序正常执行流程是:main调用foo函数,foo ...