关于一些技术点的随笔记录(二)
1.Hive建表时开启事务机制导致insert失败
create table A (
table_code string,
data_dt string,
update_dt string)
clustered by (table_code) into 1 buckets
row format delimited fields terminated by '\033'
stored as orc -- orc格式
tablproperties('transactional'='true');
insert into table A values('1','2','3');
FAILED: SemanticException [Error 10265]: This command is not allowed on an ACID table default.a with a non-ACID transaction manager. Failed command: null
Hive建表语句指定tblproperties('transactional'='true'),则执行插入操作时,不能直接使用insert..values语句,原因是开启了事务机制。建议使用insert..select方式。
2.Scala模式匹配中 @ 的含义
val list = List(1, 2, 3, 4, 5, 6)
list match {
//right其实就代表了一个集合,元素为3,4,5,6
case List(_, _, right@_*) => println(right)
case _ =>
}
list match {
//这种写法错误
//case l:List(_, _, _*) => println(right)
//正确写法,下面两种输出结果一致
case list@ List(_,_, _*) => println(list)
case list: List[_] => println(list)
}
3.监控Yarn上Spark任务
可以通过要监控的任务列表,对比存活的Spark任务,不存在的可以通过短信或邮件的方式预警。获取Spark还在运行状态任务的示例代码:
private def yarn(): Unit = {
val yarnConf = new YarnConfiguration()
val yarnClient = YarnClient.createYarnClient()
yarnClient.init(yarnConf)
yarnClient.start()
try {
import scala.collection.JavaConversions._
//YarnApplicationState有应用不同的运行状态,如RUNNING、FINISHED
val applicationReports = yarnClient.getApplications(util.EnumSet.of(YarnApplicationState.RUNNING))
applicationReports.foreach { ar =>
//应用ID,spark.app.id
println(s"appId ==> ${ar.getApplicationId}")
//应用名字,spark.app.name
println(s"name ==> ${ar.getName}")
//应用所处队列,spark.yarn.queue
println(s"queue ==> ${ar.getQueue}")
//应用的用户
println(s"user ==> ${ar.getUser}")
}
} catch {
case e: Exception => e.printStackTrace()
}
yarnClient.stop()
}
1)HBase字段本身做优化,比如手机号码倒置
2)针对row key进行哈希散列取前几位作为预分区前缀,最常见的就是通过MD5处理
3)查询场景不是全表scan或者get,而是范围scan,可以给row key加上固定的预分区前缀。写入数据时采用轮询方式,写入这些范围前缀。假如scan指定范围的话就需要一个scan转化为n多个范围scan,这个可以实现针对单个key过大的优化,相当于均分了n份。
5.newInstance和new
使用newInstance()方法的时候,必须保证:
2.这个类已经连接了
new: 强类型、相对高效,能调用任何public构造。从JVM的角度看,我们使用new的时候,这个要new的类可以没有加载。
newInstance是实现IOC、反射、面向接口编程和依赖倒置等技术方法的必然选择,new是实现具体类的实例化,不适合于接口编程。
6.session共享
1)cookie加密的方式保存在客户端
优点:减轻服务器端压力
如使用redis取代session保存用户信息,这种方式比较常用
推荐文章:
关于一些技术点的随笔记录
Hive数据导入HBase引起数据膨胀引发的思考
HBase中Memstore存在的意义以及多列族引起的问题和设计
JVM垃圾回收器、内存分配与回收策略
Kafka中sequence IO、PageCache、SendFile的应用详解
笔试编程 | 二分查找、数组、排序
Hive Join优化
对Spark硬件配置的建议
Redis中的哈希问题