概述:Metabase可以帮助你把数据库中的数据更好的呈现给更多人,数据分析人员通过建立一个”查询“(Metabase中定义为Question)来提炼数据,再通过仪表盘(Dashboards)来组合展示给公司成员.

优点:

1.开源免费

2.工具轻量、安装依赖的环境简单、配置简单清楚

3.容易上手,操作门槛低,不会sql语句也能使用

4.支持对外共享,权限控制

5.Question可以便捷地创建图表,Dashboards界面整洁美观

缺点:

1.Question每次只能对数据库中的一张表进行查询,切换数据表已有的查询选项会重置

2.填写了sql语句的sql查询(Native query)模式不能转到点选查询(Custom)模式

Read more »

MapReduce的编程模型的原理是:利用一个输入key/value对集合来产生一个输出的key/value对集合。MapReduce库的用户用两个函数表达这个计算:Map和Reduce。用户自定义的Map函数接受一个输入的key/value对值,然后产生一个中间key/value对值的集合。MapReduce库把所有具有相同中间key值的中间value值集合在一起后传递给Reduce函数。用户自定义的Reduce函数接受一个中间key的值和相关的一个value值的集合。Reduce函数合并这些value值,形成一个较小的value值的集合。

通过将Map调用的输入数据自动分割为M个数据片段的集合,Map调用被分布到多台机器上执行。输入的数据片段能够在不同的机器上并行处理。使用分区函数将Map调用产生的中间key值分成R个不同分区(例如,hash(key) mod R),Reduce调用也被分布到多台机器上执行。分区数量(R)和分区函数由用户来指定。

Map Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class MaxTemperatureMapper
extends Mapper<LongWritable, Text, Text, IntWritable> {

private static final int MISSING = 9999;

@Override
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {

String line = value.toString();
String year = line.substring(15, 19);
int airTemperature;
if (line.charAt(87) == '+') { // parseInt doesn't like leading plus signs
airTemperature = Integer.parseInt(line.substring(88, 92));
} else {
airTemperature = Integer.parseInt(line.substring(87, 92));
}
String quality = line.substring(92, 93);
if (airTemperature != MISSING && quality.matches("[01459]")) {
context.write(new Text(year), new IntWritable(airTemperature));
}
}
}

Reduce Demo

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
public class MaxTemperatureReducer
extends Reducer<Text, IntWritable, Text, IntWritable> {

@Override
public void reduce(Text key, Iterable<IntWritable> values,
Context context)
throws IOException, InterruptedException {

int maxValue = Integer.MIN_VALUE;
for (IntWritable value : values) {
maxValue = Math.max(maxValue, value.get());
}
context.write(key, new IntWritable(maxValue));
}
}

public class MaxTemperature {

public static void main(String[] args) throws Exception {
if (args.length != 2) {
System.err.println("Usage: MaxTemperature <input path> <output path>");
System.exit(-1);
}

Job job = new Job();
job.setJarByClass(MaxTemperature.class);
job.setJobName("Max temperature");

FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));

job.setMapperClass(MaxTemperatureMapper.class);
job.setReducerClass(MaxTemperatureReducer.class);

job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);

System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}

setup()

此方法被MapReduce框架仅且执行一次,在执行Map任务前,进行相关变量或者资源的集中初始化工作。若是将资源初始化工作放在方法map()中,导致Mapper任务在解析每一行输入时都会进行资源初始化工作,导致重复,程序运行效率不高!

Read more »

go 调用 c/c++ 函数的实现方式有:

1、直接嵌套在go文件中使用,最简单直观的;

2、导入动态库 .so 或 dll 的形式,最安全但是很不爽也比较慢的;

3、直接引用 c/c++ 文件的形式,层次分明,容易随时修改看结果的;

(1)直接嵌套在go文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main
/*
// C 标志io头文件,你也可以使用里面提供的函数
#include <stdio.h>

void pri(){
printf("hey");
}

int add(int a,int b){
return a+b;
}
*/
import "C" // 切勿换行再写这个

import "fmt"

func main() {
fmt.Println(C.add(2, 1))
}

但凡要引用与 c/c++ 相关的内容,写到 go 文件的头部注释里面;

嵌套的 c/c++ 代码必须符合其语法,不与 go 一样;

import “C” 这句话要紧随,注释后,不要换行,否则报错;

go 代码中调用 c/c++ 的格式是: C.xxx(),例如 C.add(2, 1);

Read more »

直接上代码:

1
2
3
4
5
6
7
8
9
10
11
b := buf.Bytes()
rc := C.the_function(unsafe.Pointer(&b[0]), C.int(buf.Len()))


p := C.malloc(C.size_t(len(b)))
defer C.free(p)

// copy the data into the buffer, by converting it to a Go array
cBuf := (*[1 << 30]byte)(p)
copy(cBuf[:], b)
rc = C.the_function(p, C.int(buf.Len()))
Read more »

背景

在SageMaker中使用wide and deep模型进行训练:

使用的TF2.X + tf.keras + tf.feature_column API。
优化前利用mirrostrategy distributed策略单机多卡训练超过26个小时。

痛点和诉求:

提升训练速度。

训练速度优化思路

从GPU使用率和CPU使用率入手:

GPU使用率很低(没有喂饱GPU)

	CPU准备一个batch的数据相对于GPU(们)计算一个batch的数据太慢吗?
		CPU准备一个batch的数据真的比较慢
			CPU如何准备一个batch的数据
			Data input pipeline是否足够优化
			数据的预处理操作是在CPU还是GPU上做?
		CPU准备一个batch不慢,GPU算的太快
			Batch size太小吗?
			模型结构太简单?
	GPU之间是否需要协作?协作是否低效?
		由于多卡训练协作引入的开销
GPU使用率挺高(营养过剩就一定会快吗?)
	不同的模型可能都能让可见的GPU使用率比较高,但是用的GPU的tensor core和cuda core的数量很可能是不一样的。

从具体框架的API和代码入手:

框架的版本和使用了框架的什么feature?
	TF1.X vs TF2.X?
	Enable eager or disable eager?
多卡的训练方式是什么?
	框架自带的多卡训练方式?
	和第三方集成的多卡训练方式?
一行一行的review的代码
	是否有耗时的操作其实没有必要?
	是框架训练一个模型主流的代码调用形式吗?
Read more »

 Aerospike是一个高性能的分布式Key-Value NoSQL数据库,可基于行随机存取,索引存放在内存中。数据存取可以在内存中或者SSD。一个典型应用是广告业务。作为服务器端的cookie存储来使用,这种情况对写入性能要求比较高。

Aerospike是一个分布式,高可用的 K-V类型的Nosql数据库。提供类似传统数据库的ACID操作。

Aerospike最大的卖点就是可以存储在SSD上,并且保证和redis相同的查询性能。AS内部在访问SSD屏蔽了文件系统层级,直接访问地址,保证了数据的读取速度。 AS同时支持二级索引与聚合,支持简单的sql操作,相比于其他nosql数据库,有一定优势。  

一个namespace包含记录(records),索引(indexes )及策略(policies)。

Set 存储于namespace,是一个逻辑分区,类比于传统数据库的表。set的存储策略继承自namespace,也可以为set设置单独的存储策略。

Records 类比于传统数据库的行,包含key,Bins(value),和Metadata(元数据)。key全局唯一,作为K-V数据库一般也是通过key去查询。Bins相当于列,存储具体的数据。元数据存储一些基本信息,例如TTL等。

特点:

  1. 键值存储, 内存 + 闪存(SSD) 存储数据,官方承诺查询 速度99% 达到1ms 低延迟和高吞吐量而闻名,已经用于许多大型的、要求堪称苛刻的实时平台

  2. 数据结构相对简单(意思是说没有REDIS丰富)

  3. AerospikeDB是多线程的,而Redis是单线程的

  4. 可以把索引放在内存,数据放在SSD。

  5. 与纯内存数据库(如REDIS,SSDB)对比,扩展上性价比会高些(SSD的价格还是比内存便宜的)

  6. 支持跨机房(企业版)

1
2
3
4
5
6
7
8
9
10
//连接
aql -p 3000 -h 192.168.0.108
//显示所有命名空间
aql> show namespaces
//显示所有集合
aql> show sets
//显示所有字段
aql> show bins
//查询信息
aql> SELECT * FROM bar.messagecache WHERE PK = 143934142381500000

Read more »

最近庆余年电视剧很火,前东家不厚道,我已经办理了包年的会员,还要花钱,不能忍。网上看到了很多链接,两周前已经看完了,等第二季咯。如果有需要讨论剧情的,欢迎留言哈。。。。

以下是链接,无需安装app,直接观看即可,安全放心,童叟无欺。就从39集开始吧,附件中是所有的链接,稍后上传。

NO.39.http://youku.cdn4-okzy.com/share/c5bbd980e5ab2c17413ec02bd757a9e5

NO.40.http://youku.cdn7-okzy.com/share/bb1d545891bbbebcf457ed1cad5394f8

NO.41.http://youku.cdn7-okzy.com/share/5f9ce39aec46f3e8e8aebbc722d8ceeb

NO.42.http://iqiyi.com-ok-iqiyi.com/share/c4b108f53550f1d5967305a9a8140ddd

NO.43.http://iqiyi.com-ok-iqiyi.com/share/c1399f2eb50e562b9e0f3778c16fd7a3

NO.44.http://youku.cdn4-okzy.com/share/2e1b24a664f5e9c18f407b2f9c73e821

NO.45.http://youku.cdn4-okzy.com/share/86a1793f65aeef4aeef4b479fc9b2bca

NO.46.http://youku.cdn6-okzy.com/share/7a951116de2a4c23c74733d76046a5b4

Read more »

线性回归用一个线性函数对提供的已知数据进行拟合,得到一个线性函数,使这个函数满足我们的要求(如具有最小偏差、平方差等等),之后我们可以利用这个函数,对给定的输入进行预测。

假设最终得到的假设函数具有如下形式:

其中,x是输入,theta是要求的参数。

为了使得代价函数具有最小值,需要求得代价函数关于参量theta的导数:

什么是逻辑回归?逻辑回归的模型是一个非线性模型,sigmoid函数,又称逻辑回归函数。但是它本质上又是一个线性回归模型,逻辑回归是以线性回归为理论支持的。只不过,线性模型,无法做到sigmoid的非线性形式,sigmoid可以轻松处理0/1分类问题。逻辑回归虽然名字里带“回归”,但是它实际上是一种分类方法,主要用于两分类问题(即输出只有两种,分别代表两个类别),函数形式为:

Read more »

google-perftool,它是由google开发的用来分析C/C++程序性能的一套工具,这里的性能分析主要包括内存和CPU两个方面,内存分析使用google-perftool所提供的tcmalloc,CPU分析使用它所提供的profiler。下面先分别介绍一下tcmalloc和profiler,然后再给出一些使用的例子,及一些使用时的注意事项.

  1. tcmalloc

      tcmalloc的全称是thread cache malloc,顾名思义,它是带有thread cache的内存管理工具,具体的实现细节这里不做过多的介绍,感兴趣的朋友可以参考google官方提供的文档,或者阅读源码。这里需要注明一下tcmalloc的一些优点,和它所提供的一些分析程序内存使用的一些功能。

      tcmalloc的主要优点有两个方面,一个是内存allocate/deallocate的速度,通常情况下它的速度比glibc所提供的malloc要快;另一个方面是小内存(< =32K)的管理,它的小内存是在thread cache里面管理的,一方面减少了加锁的开销,另一方面用来表示小内存所用的额外的空间也比较小,比较节省空间。因此,对于多线程下,经常小内存的allocation/deallocation的程序(尤其多线程下使用STL比较多的程序),可以尝试使用一下tcmalloc。

      除了在allocate/deallocate内存时的优化外,tcmalloc还提供了heapcheck和heapprofile的功能。heapcheck主要被用来检查程序中是否有内存泄露,在哪里泄露。相信内存泄露这个话题,永远是让所有C/C++程序都非常蛋疼的问题,有了tcmalloc的帮助,也许一切会变得简单一些,会有点事半功倍的效果。tcmalloc另外一个功能是heapprofile。先来说一下profile这个词,它的本意是“描绘…轮廓”,我一直觉得这个词是一个很伟大的词,用在sns中,它表示用来描绘用户的那些特征、属性,也有叫用户画像的。用在这里呢,heapprofile,顾名思义,它就是描绘程序的heap轮廓,通过这样一个过程,我们就能知道,程序的heap里在每一时刻都有些啥东东。有了profile的结果,它可以帮助我们定位内存泄露,帮助我们发现一些频繁allocate内存的地方,以此来做一些优化。

  1. profiler

      profiler,是由google-perftool所提供的用来做cpu-profile的工具,相信通过上面的介绍,大家对profile这个词已经不再陌生。Cpu-profile,它的主要功能就是通过采样的方式,给程序中cpu的使用情况进行“画像”,通过它所输出的结果,我们可以对程序中各个函数耗时情况一目了然。在对程序做性能优化的时候,这个是很重要的,先把最耗时的若干个操作优化好,程序的整体性能提升应该十分明显,这也是做性能优化的一个最为基本的原则—先优化最耗时的。

  1. 使用举例

关于google-perftool的使用,总体上来讲有以下三种方式:

(1)直接调用提供的api:这种方式比较适用于对于程序的某个局部来做分析的情况,直接在要做分析的局部调用相关的api即可。

Read more »