关于一些技术点的随笔记录(二)
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 ' 33'
stored as orc -- orc格式
tablproperties('transactional'='true');
执行insert..values操作:
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模式匹配中 @ 的含义
@是为了给模式匹配起个变量名,一般格式为:variableName@pattern,示例:
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()
}
4.结合业务场景的HBase预分区及热点处理
1)HBase字段本身做优化,比如手机号码倒置
2)针对row key进行哈希散列取前几位作为预分区前缀,最常见的就是通过MD5处理
3)查询场景不是全表scan或者get,而是范围scan,可以给row key加上固定的预分区前缀。写入数据时采用轮询方式,写入这些范围前缀。假如scan指定范围的话就需要一个scan转化为n多个范围scan,这个可以实现针对单个key过大的优化,相当于均分了n份。
注意:对row key进行散列处理后,表范围scan(全表扫描除外),所以要根据业务场景进行分表处理,比如按天。此外,数据量大时,可以给row key加上时间戳或随机数,避免覆盖。
具体可以参考《HBase高级特性、rowkey设计以及热点问题处理》
5.newInstance和new
newInstance:弱类型、低效率,调用无参构造,使用类加载机制。
使用newInstance()方法的时候,必须保证:
1.这个类已经加载 2.这个类已经连接了
而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载Java API的那个加载器。newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。
new: 强类型、相对高效,能调用任何public构造。从JVM的角度看,我们使用new的时候,这个要new的类可以没有加载。
newInstance是实现IOC、反射、面向接口编程和依赖倒置等技术方法的必然选择,new是实现具体类的实例化,不适合于接口编程。
6.session共享
1)cookie加密的方式保存在客户端
优点:减轻服务器端压力
缺点:受到cookie大小限制,因为每次请求会在头部附带cookie信息,占用一定的带宽。另外,这种方式在用户禁用cookie的情况下无效。
这种方式不常用。
2)服务器间同步
比如tomcat集群:通过配置tomcat,实现session共享。
每个tomcat都会在局域网中广播自己的session信息,同时监听其他tomcat广播的session,一旦自己的session发生变化,其他的tomcat能够感知到的,同时就可以同步自己的session和它一样。
缺点:当集群服务器数量比较大如200台,每一台服务器的tomcat都需要广播自己的session,同时监听另外199台,此时,服务器的大量资源都用来处理session同步的事情,用户正常的访问就会受到影响。
要视部署的tomcat集群数量等来定是否使用这种方式。
3)基于分布式缓存的session共享机制
如使用redis取代session保存用户信息,这种方式比较常用
- ASP.NET MVC5+EF6+EasyUI 后台管理系统--工作流演示截图
- 基于CPPN与GAN+VAE生成高分辨率图像
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(54)-工作流设计-所有流程监控
- (收藏)搭建.NET Framework 3.0开发环境 及SharePoint 2007/WSS 3环境
- WCF技术剖析之八:ClientBase<T>中对ChannelFactory<T>的缓存机制
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(48)-工作流设计-起草新申请
- 把windows2003“搬”到手机上。
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(53)-工作流设计-我的批阅
- ASP.NET MVC5+EF6+EasyUI 后台管理系统--任务调度系统解析
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(52)-美化EasyUI皮肤和图标
- ASP.NET MVC5+EF6+EasyUI 后台管理系统--系统权限全套完整图
- 互联网时代的产品升级和用户反馈故事
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(50)-Easyui 扁平化皮肤
- 微信终于做了它最擅长的业务,市场已经轰动
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Prism代码高亮Pjax重载函数
- Qt示例-AnalogClock-自定义窗体-使用QPainter的转换和缩放特性简化绘图
- 2019-12-27-traefik
- 2019-12-05-eck-qustion
- 聊聊dubbo-go的ConsumerSignFilter
- Javascript错误处理
- 程序员说模型过拟合的时候,说的是什么?
- 分分钟教会你搭建企业级的 npm 私有仓库
- Golang语言之字符串操作
- Go语言ORM-gorm学习笔记(二)
- TypeScript: 常用的高级类型
- TypeScript:得泛型者,得天下
- 微信PC端多开的秘密
- Spring Cloud 微服务(七)- 上:日志收集集成
- Spring Cloud 微服务(七)- 下:日志收集详解