最近着手个项目,整体数据量有5亿多,每个月增量9000w。应用场景是Oltp 根据用户id直接计算各种维度值。

因为是Oltp 场景,直接根据用户id %2000分(方便后续横向扩展),有些喜欢扯分区表的或者顺序分表的请复习下数据库原理以及硬件原理。

分完表oltp 访问速度上了几个level。但是牵涉到一个实时统计的问题,需要对2000张表进行实时统计。因暂时没gp、hadoop 这种分布式数据库环境,以及怎么解决Oltp 到分布式数据库之间实时同步的问题。

想了个恶心的办法。对2000张表开启cdc 变更,记录时间段发生的变更userid,写了个多线程脚本实时根据这些userid 去更新数据。基本做到了实时统计,数据时间间隔差10分钟左右。

明年计划结构化数据先通过Gp计算,需要写个小程序来满足Cdc 变更到Gp的实时同步。

顺便附带 多线程统计脚本,还是powershell 写的。

#region hostinfo
$hostinfos=[System.Collections.ArrayList]@()
[void] $hostinfos.add('192.168.1.1')
[void] $hostinfos.add('1433')
[void] $hostinfos.add( $ClientSqlAccount)
[void] $hostinfos.add($ClientSqlPassWord)
[void] $hostinfos.add('db')
#endregion #region 生成2000张表
$tables=[System.Collections.ArrayList]@()
<#
foreach($s in 0..1999)
{
switch([void] $s)
{
{$s -lt 10 }{ [void] $tables.add('Tab'+'000'+ $s.ToString());}
{$s -ge 10 -and $s -lt 100 }{ [void] $tables.add(('Tab'+'00'+ $s.ToString())); }
{$s -ge 100 -and $s-lt 1000 }{ [void] $tables.add(('Tab'+'0'+ $s.ToString())); }
{$s -ge 1000 }{ [void] ($tables.add(('Tab'+ $s.ToString()))); }
} }
#>
#endregion $ClientSqlAccount=$hostinfos[2];
$ClientSqlPassWord=$hostinfos[3];
$ClientDB=$hostinfos[4];
$log='d:'
$SqlServer=$hostinfos[0] ;
$Port=$hostinfos[1] ;
$SqlString="Data Source="+$SqlServer+","+$Port+";uid="+$ClientSqlAccount+";Password="+$ClientSqlPassWord;
$SqlConn = [System.Data.SqlClient.SqlConnection] $SqlString;
$SqlConn.Open() ;
$SqlConn.ChangeDatabase($ClientDB);
$CC = $SqlConn.CreateCommand();
$CC.CommandTimeout = 0;
$CC.CommandText='select tabname from Cdc_Change_userid where isdelete=0 group by tabname '
$Reader = $CC.ExecuteReader();
while ($Reader.read())
{
[void] $tables.add($Reader.GetString(0));
}
$SqlConn.Close(); #region Get SqlserverObjectScriptBlock
$SBbillcellphone={
param($hostinfos,$sqlcmd)
Function Sqler_BillCellPhones
{param(
[array] $hostinfos
,[string] $sqlcmd
)
try
{
$ClientSqlAccount=$hostinfos[2];
$ClientSqlPassWord=$hostinfos[3];
$ClientDB=$hostinfos[4];
$log='d:'
$SqlServer=$hostinfos[0] ;
$Port=$hostinfos[1] ;
$SqlString="Data Source="+$SqlServer+","+$Port+";uid="+$ClientSqlAccount+";Password="+$ClientSqlPassWord;
$SqlConn = [System.Data.SqlClient.SqlConnection] $SqlString;
$SqlConn.Open() ;
$SqlConn.ChangeDatabase($ClientDB);
$CC = $SqlConn.CreateCommand();
$CC.CommandTimeout = 0;
$CC.CommandText=$sqlcmd
$CC.ExecuteScalar();
$SqlConn.Close();
}
catch
{ $day=(Get-Date -Format "yyyyMMdd").tostring();
$return='Error';
( 'Sqler_BillCellPhones : '+((Get-Date).tostring())+' '+ $SqlServer+','+$Port +' '+$_.Exception.Message )|Out-File -FilePath "$log\tab_$day.log" -Append -Force }
}
Sqler_BillCellPhones $hostinfos $sqlcmd
} $throttleLimit=5
$sqlcmd='exec csp_billcellphone_Score ''@tabname''';
$SessionState = [system.management.automation.runspaces.initialsessionstate]::CreateDefault()
$Pool = [runspacefactory]::CreateRunspacePool(1, $throttleLimit, $SessionState, $Host)
$Pool.Open()
$threads = @()
$handles = foreach($table in $tables) {
$sqlcmd='exec csp_billcellphone_Score ''@tabname''';
$sqlcmd=$sqlcmd-replace '@tabname',$table
$powershell = [powershell]::Create().AddScript($SBbillcellphone).AddArgument($hostinfos).AddArgument($sqlcmd)
$powershell.RunspacePool = $Pool
$powershell.BeginInvoke()
$threads += $powershell
}
do {
$i = 0
$done = $true
foreach ($handle in $handles) {
if ($handle -ne $null) {
if ($handle.IsCompleted) {
$threads[$i].EndInvoke($handle)
$threads[$i].Dispose()
$handles[$i] = $null
} else {
$done = $false
}
}
$i++
}
if (-not $done) { Start-Sleep -second 1 }
} until ($done)
Remove-Variable -Name handles, threads,powershell;
[System.GC]::Collect(); [System.GC]::WaitForPendingFinalizers()

在没Hadoop 、GP 前提下怎么进行实时数据统计。的更多相关文章

  1. 不修改模板的前提下修改VisualState中的某些值

    原文链接:不修改模板的前提下修改VisualState中的某些值 - 超威蓝火 UWP里有一件非常令人不爽的事,大部分控件只提供了Normal状态下的Background,Foreground,Bor ...

  2. 【hadoop】——window下elicpse连接hadoop集群基础超详细版

    1.Hadoop开发环境简介 1.1 Hadoop集群简介 Java版本:jdk-6u31-linux-i586.bin Linux系统:CentOS6.0 Hadoop版本:hadoop-1.0.0 ...

  3. 自问自答-hadoop在安全模式下究竟干了什么见不得人的事

    本来想自己从网上搜集整理的,但是发现吴超写的刚刚好,不多不少,所以直接转载(图片失效了,用自己的图片) http://www.superwu.cn/2013/08/23/548/ 在hadoop集群的 ...

  4. call 方法在使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法.

    call 方法在使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法. 注意:该函数的语法与 apply() 方法的语法几乎完全相同,唯一的区别在于,apply()方法接受的是一个参 ...

  5. 如何使用python在保留原excel格式的前提下插入/修改数据

    一.需求分析: 统计的报表中需要每日查询当天数据并追加到原有的excel后面. 因为原始excel格式已经设定好,如果使用xlwt,仅仅指定设定我们要插入的单元格的格式,原始数据的格式会被初始化. 所 ...

  6. a,b,c为3个整型变量,在不引入第四个变量的前提下写一个算法实现 a=b b=c c=a?(异或解决值互换问题)

    package com.Summer_0424.cn; /** * @author Summer * a,b,c为3个整型变量,在不引入第四个变量的前提下写一个算法实现 a=b b=c c=a? */ ...

  7. a,b为2个整型变量,在不引入第三个变量的前提下写一个算法实现 a与b的值互换

    package com.Summer_0424.cn; /** * @author Summer * a,b为2个整型变量,在不引入第三个变量的前提下写一个算法实现 a与b的值互换? */ publi ...

  8. 【F12】谷歌浏览器--前台效果可以在不访问服务器的前提下直接改样式看效果是否是预期值。

    F12-前台效果可以在不访问服务器的前提下直接改样式看效果是否是预期值. 1.Element---页面所有元素,通过它可以做selenium的元素定位,删除页面元素,增加页面属性(通过增加页面属性便于 ...

  9. Android DevArt4:IntentFilter学习及深入~问题描述:在不指定具体action前提下,如果有两个以上的Activity,具有完全相同的intent-filter,项目同步是否会出现异常?程序运行是否会崩溃?

    概述:GitHub IntentFilter意图过滤器,三种匹配规则:action.category.data 重点:过滤规则中必须设置 '<category android:name=&quo ...

随机推荐

  1. Java-Runoob-高级教程-实例-环境设置实例:4.Java 实例 – 如何查看当前 Java 运行的版本?

    ylbtech-Java-Runoob-高级教程-实例-环境设置实例:4.Java 实例 – 如何查看当前 Java 运行的版本? 1.返回顶部 1. Java 实例 - 如何查看当前 Java 运行 ...

  2. configure: error: Please reinstall the libcurl distribution - easy.h should be in <curl-dir>/include/curl/

    编译php出现错误: configure: error: Please reinstall the libcurl distribution - easy.h should be in <cur ...

  3. 031:Cetus sharding

    目录 一.主机环境 二.搭建环境 1.准备环境 三.Cetus安装 1.下载包和安装依赖包 2.Cetus安装 1.安装说明 2.安装实施 四.Cetus配置 1.创建和修改配置文件 2.启动cetu ...

  4. red ant

    Red Ant(红蚁)网络运维管理系统是IT运维管理系统,提供智能的B/S接口可视化人机界面,通过简单的操作实现全方位的网络专线.服务器.中间件.各种应 用程序.机房动力环境等监控管理,“化繁为简”, ...

  5. uwsgi的python2+3多版本共存实操使用virtualenv

    1首先,机器需要有python2和python3的可执行环境.确保pip和pip3命令可用.原理就是在哪个环境下安装uwsgi.uwsgi启动的时候,就用的哪个python版本 2安装virtuale ...

  6. python3.6的turtle库练手

    import turtle as t t.speed(10) t.pencolor("yellow") t.fillcolor("red") for num i ...

  7. tensorflow 基本函数(1.tf.split, 2.tf.concat,3.tf.squeeze, 4.tf.less_equal, 5.tf.where, 6.tf.gather, 7.tf.cast, 8.tf.expand_dims, 9.tf.argmax, 10.tf.reshape, 11.tf.stack, 12tf.less, 13.tf.boolean_mask

    1.  tf.split(3, group, input)  # 拆分函数    3 表示的是在第三个维度上, group表示拆分的次数, input 表示输入的值 import tensorflow ...

  8. PIN 引脚类型

    一个 capture filter 通常有两个或更多个输出相同类型数据的输出引脚,例如预览引脚和捕捉引脚.因此,媒体类型不是区分引脚的好方法. //相反,这些引脚通过它们的功能来区分,这些功能是使用称 ...

  9. 在Eclipse中创建Maven版的Web工程

    步骤: 1.第一步 2.第二步 3.第三步 4.第四步 选中项目,右键在弹出的对话框中选择properties 5.第五步 6.第六步

  10. 创建和运行Java项目

    ---------siwuxie095                     首先在左侧的工程管理面板 Package Explorer 中,右键->New->Java Project ...