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的更多相关文章
随机推荐
- 【BZOJ3270】博物馆 期望DP+高斯消元
[BZOJ3270]博物馆 Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆.这座博物馆有着特别的样式.它包含由m条走廊连接的n ...
- 我的Android进阶之旅------>如何获取系统中定义了那些权限
在Window控制台中输入如下命令可以看到Android系统中列出的所有权限(如果自定义权限注册成功,在这里也会找到这些自定义的权限) adb shell pm list permissions C: ...
- centos7 使用 maven
http://www.cnblogs.com/jackluo/archive/2013/02/06/2901816.html
- 基于Linux Shell的开机启动服务
CentOS重启后,很多服务需要手动启动,很是麻烦,今天把需要开机启动或关闭的服务整理了一下,放入Linux Shell中,再将该Shell加入/etc/rc.local中,即可实现存储的自动挂载.S ...
- PHP常用正则验证
手机号,身份证,ip验证 //正则验证手机号 正确返回 true function preg_mobile($mobile) { if(preg_match("/^1[34578]\d{9} ...
- F5与Ctrl+F5及地址栏输入地址回车
按F5等同于点击页面地址栏的刷新图标. 地址栏输入地址然后回车: 根据缓存内容是否过期决定是否发送请求给服务端 F5: 浏览器无论如何都得发送请求给服务端,包含If-Modified-Since/If ...
- nginx rewrite标签配置以及用户认证配置
一.nginx rewrite标签 rewrite 实现URL的改写主要是实现伪静态 1. rewrite指令语法 指令语法:rewrite regex replacement[flag] 默认值 ...
- DEDE 列表页调用如 标题,时间,简介等
以下是直接从板子中复制出来的,CSS自已根据需要写下就行.在调时简介长度不知道怎么控制,现在说下方法1. infolen='30' 这个可以2. 系统设置 >其它设置 >内容简介长度填下就 ...
- 剑指offer之 栈的压入、弹出序列
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出序列.假设压入栈的所有数字均不相等.例如序列1/2/3/4/5是某栈的压栈序列,序列4/5/3/2/1是该压栈序 ...
- Struts2 内核之我见
Struts2 内核之我见 完整分析 Struts2 内核中文文档 本文首先探讨了 Struts2 核心控制器的源码,以帮助解读 Struts2 的工作流程.接着讲解相关外围类.最后对 Struts ...