无言

不语


  • 首页

  • 分类

  • 归档

  • 标签

  • 关于

java 垃圾回收

发表于 2017-07-01 | 分类于 java

分析对象是否已经死亡

  • 引用计数法
    优点:实现简单,在远古的jdk版本中是该种方式,python2.7里面的回收也是这种方式
    缺点:容易内存泄露,对象循环依赖,类似于死锁

  • 可达性分析(一般第一次标记,第二次如果确实没有引用会回收)

回收算法

  • 标记-清除算法

    可达性分析后,进行标记,然后清除
    缺点:效率不是很高,标记清除后会产生不连续的内存碎片,如果创建大对象时,可分配的连续内存不足时,会提前进行垃圾回收动作。

  • 复制算法

    可达性分析后,进行标记,将活着的对象复制到内存的另一块上面,然后将已使用过的内存一次性清除干净。
    优点: 实现简单,运行高效,现在的商用虚拟机一般都用来回收新生代,新生代里面分为eden区和2个survivor,比率一般是8:1,回收时将eden区和一个survivor存活的对象复制到另一个空着的survivor区,
    如果空间不够,会向老年代申请空间,采用分配担保的方式。
    缺点:可运行内存缩小为原先的一半,另一半要一直空着,等待下次回收时使用。

  • 标记整理算法

    在老年代,将存活的对象,移向一端,然后清理掉边界外的内存。

  • 分代算法

    将虚拟机根据对象的存活周期不同将内存划分为几块。一般分为新生代和老年代。在不同的年代,采用不同的算法。

可达性分析

  • 全局性的引用(如常量和静态属性)
  • 执行的上下文(栈帧的本地变量表)

垃圾收集器

2岁半in上海

发表于 2017-07-01 | 分类于 日常生活

2岁半in上海

场景一

妈:我叫什么名字啊
女儿:葫芦娃
妈:错了,我叫什么名字啊
女儿:王秀丽
妈:你叫什么名字啊
女儿:王秀丽
妈:错了,你叫什么名字啊
女儿:葫芦娃
妈:。。。错了,你叫什么名字啊
女儿:华欣晴。。。
妈:爸爸叫什么名字啊
女儿:葫芦娃。。。。
只剩下在风中凌乱的爸爸..

场景二

小华要洗澡的时候,脱衣服,从口袋里面掏出一大把硬币,
原来我一个杯子里面的硬币全部被她收走。。
真的是泼出去的水啊

场景三

在老家来上海前,我抱者她在椅子上看动画片,本人喜欢吃蚕豆,刚好看到地上不远处有一颗,以为是她丢的,
遂让她捡起来,告诉她勤俭节约的道理,结果叫了几次也没有动静,自己动手,捡来发现是一颗石头。。她在那
笑着说,是我丢的。。。。

在现实编程中使用fluent风格

发表于 2017-05-01 | 分类于 设计模式

在现实编程中使用fluent风格

需求:

根据相应的条件查找对应的imsi,其中条件有多个满足即返回结果,如果不满足对对数据进行过滤,交由后续处理。
条件:
1.电话号码匹配,返回匹配结果,即匹配的imsi
2.根据电话号码生成imsi前缀,匹配imsi,如果多条,需进行后续处理
3.根据银行,卡号匹配imsi,如果多条,需进行后续处理
4.根据地区,匹配imsi,如果多条,需进行后续处理
5.根据姓名的摘要,匹配imsi,如果多条,即认为数据没有命中

设计:

在前面的条件中,所有的步骤都能结束整个查找流程,在上述的查找流程中,我引入了责任链的模式,该模式的类图为:

职责链模式:使多个对象都有机会处理请求,将多个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止,使用该模式,可对查询条件进行组合,或者添加新的查询条件,而不影响别已有的结构。

使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public IMatcher buildMatchChain(String phone,String name,String areaCode,String bank,String card) throws Exception{
bank = BankCache.getInstance().get(bank);
IMatcher imsiUserNameMatch = new ImsiUserNameMatch(name); //匹配姓名
IMatcher imsiAreaMatch = new ImsiAreaMatch(areaCode); //匹配地区
imsiAreaMatch.setNext(imsiUserNameMatch);
//
IMatcher preFixphoneImsiCardMatch = new PrefixPhoneImsiCardMatch(phone,bank, card); //匹配银行卡号
preFixphoneImsiCardMatch.setNext(imsiAreaMatch);
IMatcher phoneImsiMatch = new PhoneImsiMatch(phone);//匹配手机号和IMSI
phoneImsiMatch.setNext(preFixphoneImsiCardMatch);
return phoneImsiMatch;
}

使用fluent风格:

1
2
3
4
5
6
7
public IMatcher buildMatchChain2(String phone,String name,String areaCode,String bank,String card) throws Exception{
bank = BankCache.getInstance().get(bank);
return new PhoneImsiMatch(phone)
.setNext(new PrefixPhoneImsiCardMatch(phone,bank, card))
.setNext(new ImsiAreaMatch(areaCode))
.setNext(new ImsiUserNameMatch(name));
}

fluent风格在知名开源框架中的使用:

1.在google guava中,各种api接口都是采用该风格
2.在netty api中,也是采用该种风格
3.在apache curator,也是采用风格

hive表创建的几种方式

发表于 2017-05-01 | 分类于 大数据

hive表的创建

一、语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name -- (Note: TEMPORARY available in Hive 0.14.0 and later)
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[SKEWED BY (col_name, col_name, ...) -- (Note: Available in Hive 0.10.0 and later)]
ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
[STORED AS DIRECTORIES]
[
[ROW FORMAT row_format]
[STORED AS file_format]
| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)] -- (Note: Available in Hive 0.6.0 and later)
]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)] -- (Note: Available in Hive 0.6.0 and later)
[AS select_statement]; -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
LIKE existing_table_or_view_name
[LOCATION hdfs_path];
data_type
: primitive_type
| array_type
| map_type
| struct_type
| union_type -- (Note: Available in Hive 0.7.0 and later)
primitive_type
: TINYINT
| SMALLINT
| INT
| BIGINT
| BOOLEAN
| FLOAT
| DOUBLE
| STRING
| BINARY -- (Note: Available in Hive 0.8.0 and later)
| TIMESTAMP -- (Note: Available in Hive 0.8.0 and later)
| DECIMAL -- (Note: Available in Hive 0.11.0 and later)
| DECIMAL(precision, scale) -- (Note: Available in Hive 0.13.0 and later)
| DATE -- (Note: Available in Hive 0.12.0 and later)
| VARCHAR -- (Note: Available in Hive 0.12.0 and later)
| CHAR -- (Note: Available in Hive 0.13.0 and later)
array_type
: ARRAY < data_type >
map_type
: MAP < primitive_type, data_type >
struct_type
: STRUCT < col_name : data_type [COMMENT col_comment], ...>
union_type
: UNIONTYPE < data_type, data_type, ... > -- (Note: Available in Hive 0.7.0 and later)
row_format
: DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
[NULL DEFINED AS char] -- (Note: Available in Hive 0.13 and later)
| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
file_format:
: SEQUENCEFILE
| TEXTFILE -- (Default, depending on hive.default.fileformat configuration)
| RCFILE -- (Note: Available in Hive 0.6.0 and later)
| ORC -- (Note: Available in Hive 0.11.0 and later)
| PARQUET -- (Note: Available in Hive 0.13.0 and later)
| AVRO -- (Note: Available in Hive 0.14.0 and later)
| INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname

二、创建表时的4种模式

  1. TEMPORARY模式,在该模式下创建的表,只在当前session中有效,当前session关闭时,该表会被hive删除,不支持分区,也不支持创建索引.
  2. EXTERNAL模式,俗称外部表,该模式的表,数据不由hive管理,删除表时,数据不会被删除,创建表时可以指定数据加载的路径如:

    CREATE EXTERNAL TABLE [IF NOT EXISTS] [db_name.]table_name
     LIKE existing_table_or_view_name
    [LOCATION hdfs_path];
    
  3. 默认模式,俗称管理表,该模式的表,数据由hive管理,删除表时数据也会被删除。
  4. Create Table As Select (CTAS)模式,该模式的表是由查询的结果来创建,在该模式下,不能创建分区表,不能创建外部表,也不支持数据分桶。

三、表中的字段的数据类型

在hive中字段支持5种类型:

1.基本类型(primitive_type):

 TINYINT
| SMALLINT
| INT
| BIGINT
| BOOLEAN
| FLOAT
| DOUBLE
| STRING
| BINARY      
| TIMESTAMP   
| DECIMAL    
| DECIMAL(precision, scale)  
| DATE        
| VARCHAR     
| CHAR 

2.数组类型(array_type)
3.字典类型(map_type)
4.结构类型(struct_type)
5.联合类型(union_type)
如:

CREATE TABLE employees (  
    name STRING,  
    salary FLOAT,  
    subordinates ARRAY<STRING>,  
    deductions MAP<STRING, FLOAT>,  
    address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>,
    dddd:UNIONTYPE<data_type,data_type,....>
) PARTITIONED BY (country STRING, state STRING);  

四、数据分区

数据分区为将数据按照指定字段的值来分别存放,这样在查询时,可以只查某一个分区的数据,以提高数据查询效率,也可以在数据的管理上更有效率。指定分区时,数据将按照分区字段先后的顺序来存放.
如:

 CREATE TABLE employees (.....)
PARTITIONED BY (pt_dt string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;

五、数据分桶

#####把表(或者分区)组织成桶(Bucket)有两个理由:
1.为获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。

2.使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

六、数据导入与数据导出

在创建表时,可以指定3个属性[INPUTFORMAT, OUTPUTFORMAT, SERDE],由这些属性来指定数据的导入格式和导出格式
首先来理清这三者之间的关系,我们直接引用Hive官方说法:

SerDe is a short name for “Serializer and Deserializer.”
Hive uses SerDe (and !FileFormat) to read and write table rows.
HDFS files –> InputFileFormat –> <key, value> –> Deserializer –> Row object
Row object –> Serializer –> <key, value> –> OutputFileFormat –> HDFS files

总结一下,当面临一个HDFS上的文件时,Hive将如下处理(以读为例):

1.调用InputFormat,将文件切成不同的文档。每篇文档即一行(Row)。  
2.调用SerDe的Deserializer,将一行(Row),切分为各个字段。

当HIVE执行INSERT操作,将Row写入文件时,主要调用OutputFormat、SerDe的Seriliazer,顺序与读取相反
【INPUTFORMAT】属性的类必须实现org.apache.hadoop.mapred.InputFormat接口
【OUTPUTFORMAT】属性的类必须实现org.apache.hadoop.mapreduce.OutputFormat接口
【SERDE】属性的类必须实现org.apache.hadoop.hive.serde2接口

###注:参考文档
https://cwiki.apache.org/confluence/display/Hive/DeveloperGuide
https://hive.apache.org/javadocs/r1.2.1/api/
http://hadoop.apache.org/docs/r2.7.1/api/
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

Hello World

发表于 2017-05-01

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

1…45
huawei

huawei

1

25 日志
17 分类
32 标签
GitHub
© 2019 huawei
由 Hexo 强力驱动
主题 - NexT.Pisces