0%

ortools解决LP问题

ojAlgo可以整合ortools,使用ojAlgo来进行约束条件的模型构造,使用ortools来进行求解。因为我们一开始使用的是ojAlgo,这样可以更小幅度的修改,只需要求解时使用ortools就可以

1
2
3
4
5
6
7
8
9
10
11
12
<dependency>
<groupId>org.ojalgo</groupId>
<artifactId>ojalgo</artifactId>
<version>51.4.1</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.google.ortools/ortools-java -->
<dependency>
<groupId>com.google.ortools</groupId>
<artifactId>ortools-java</artifactId>
<version>8.2.9025</version>
</dependency>

还是以求解 5x1 + 6x2 + 23x3 + 5x4 + 24x5 + 6x6 + 23x7 + 5x8的最小值为例

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
ExpressionsBasedModel model = new ExpressionsBasedModel();
model.addVariable(Variable.makeInteger("x"+1).lower(0).weight(5));
model.addVariable(Variable.makeInteger("x"+2).lower(0).weight(6));
model.addVariable(Variable.makeInteger("x"+3).lower(0).weight(23));
model.addVariable(Variable.makeInteger("x"+4).lower(0).weight(5));
model.addVariable(Variable.makeInteger("x"+5).lower(0).weight(24));
model.addVariable(Variable.makeInteger("x"+6).lower(0).weight(6));
model.addVariable(Variable.makeInteger("x"+7).lower(0).weight(23));
model.addVariable(Variable.makeInteger("x"+8).lower(0).weight(5));

// 约束1 2x1+x2+x3+x4>=100
Expression expression = model.addExpression("e" + 1);
expression.set(0,2);
expression.set(1,1);
expression.set(2,1);
expression.set(3,1);
expression.lower(100);

// 约束2 x2+x3+3x5+2x6+x7>=150
Expression expression2 = model.addExpression("e" + 2);
expression2.set(1,2);
expression2.set(2,1);
expression2.set(4,3);
expression2.set(5,2);
expression2.set(6,1);
expression2.lower(150);

// 约束3 x1+x3+3x4+2x6+3x7+5x8>=100
Expression expression3 = model.addExpression("e" + 3);
expression3.set(0,1);
expression3.set(2,1);
expression3.set(3,3);
expression3.set(5,2);
expression3.set(6,3);
expression3.set(7,5);
expression3.lower(100);

SolverORTools tools = SolverORTools.INTEGRATION.build(model);
Optimisation.Result result = tools.solve(null);
System.out.println(result);

可以发现,业务部分上面构造model的地方一点都没有动,只是改了solve的地方

阅读全文 »

HBase数据结构

命名空间NameSpace

HBase的命名空间类似于mysql中的database,一个mysql下可以有多个database,同样的一个HBase下也可以有多个命名空间,命名空间中包括

  • Table表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定,则在default默认的命名空间中。
  • RegionServer group,一个命名空间包含了默认的RegionServer Group。
  • Permission权限,命名空间能够让我们来定义访问控制列表ACL(Access Control List)。例如,创建表,读取表,删除,更新等等操作。
  • Quota限额,可以强制一个命名空间可包含的region的数量。
阅读全文 »

HBase简介

HBase是Apache下Hadoop项目的子项目,是Hadoop Database的简称,来源于Google的BigTable(BigTable是将所有的字段放到一个大表中,造成了数据的冗余,但是效率有效地提高了),本质实际上是一张稀疏的大表,用来存储粗粒度的结构化数据,并且能够通过简单的增加节点来实现系统的线性扩展,HBase是建立在HDFS之上的高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库,HBase基于列的而不是基于行的模式,HBase每个列属于一个特定的列族,通过行和列来确定一个存储单元,而每个存储单元又可以有多个版本,通过时间戳来标识

列式存储

列式存储与行存储区别

  • 写入方面,行存储的写入是一次完成的,建立在操作系统的文件系统上,保证写入过程的成功与失败;列存储是把一行数据拆分成单列保存,写入次数更多,所以写入时间消耗会更大
  • 读取方面,行存储通常也是以行来进行读取,通常是读取一整行;列存储每次读取是数据集合的一段或者全部

系统架构

系统架构

阅读全文 »

优化

既然hive是写sql来生成MR任务,那sql写的好坏严重影响了生成的MR任务,那么如何优化呢?就像优化sql一下,有个Explain执行计划,hive也是有Explain执行计划的

Explain执行计划

1
EXPLAIN [EXTENDED | DEPENDENCY | AUTHORIZATION] query
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
hive (study_hive)> explain select max(sal),deptno from emp group by deptno; 
OK
Explain
STAGE DEPENDENCIES:
Stage-1 is a root stage
Stage-0 depends on stages: Stage-1

STAGE PLANS:
Stage: Stage-1
Map Reduce
Map Operator Tree:
TableScan
alias: emp
Statistics: Num rows: 1 Data size: 6570 Basic stats: COMPLETE Column stats: NONE
Select Operator
expressions: sal (type: double), deptno (type: int)
outputColumnNames: sal, deptno
Statistics: Num rows: 1 Data size: 6570 Basic stats: COMPLETE Column stats: NONE
Group By Operator
aggregations: max(sal)
keys: deptno (type: int)
mode: hash
outputColumnNames: _col0, _col1
Statistics: Num rows: 1 Data size: 6570 Basic stats: COMPLETE Column stats: NONE
Reduce Output Operator
key expressions: _col0 (type: int)
sort order: +
Map-reduce partition columns: _col0 (type: int)
Statistics: Num rows: 1 Data size: 6570 Basic stats: COMPLETE Column stats: NONE
value expressions: _col1 (type: double)
Execution mode: vectorized
Reduce Operator Tree:
Group By Operator
aggregations: max(VALUE._col0)
keys: KEY._col0 (type: int)
mode: mergepartial
outputColumnNames: _col0, _col1
Statistics: Num rows: 1 Data size: 6570 Basic stats: COMPLETE Column stats: NONE
Select Operator
expressions: _col1 (type: double), _col0 (type: int)
outputColumnNames: _col0, _col1
Statistics: Num rows: 1 Data size: 6570 Basic stats: COMPLETE Column stats: NONE
File Output Operator
compressed: false
Statistics: Num rows: 1 Data size: 6570 Basic stats: COMPLETE Column stats: NONE
table:
input format: org.apache.hadoop.mapred.SequenceFileInputFormat
output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

Stage: Stage-0
Fetch Operator
limit: -1
Processor Tree:
ListSink

Time taken: 0.183 seconds, Fetched: 53 row(s)
阅读全文 »

配置调优

map join配置

对于两个表的join操作,将小表写在join的左边,大表写在join的右边,小表驱动大表来进行查询,可以使用mapjoin使得小表进入内存,将小表文件加载到DistributeCache中,再扫描大表,根据DistributeCache中的数据与大表进行关联对应

1
2
3
4
-- 设置自动选择mapjoin(默认是true)
set hive.auto.convert.join=true;
-- 设置大小表阈值(默认25M)
set hive.mapjoin.smalltable.filesize=25000000;
阅读全文 »