最近着手个项目,整体数据量有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. 基于Redis实现简单的分布式锁

      在分布式场景下,有很多种情况都需要实现最终一致性.在设计远程上下文的领域事件的时候,为了保证最终一致性,在通过领域事件进行通讯的方式中,可以共享存储(领域模型和消息的持久化数据源),或者做全局XA ...

  2. Spring源码分析之——导入spring-framework源代码到Eclipse

    本人最近想要研究spring的源代码,但当要导入spring sub project到Eclipse里面去的时候遇到了不少麻烦(其实都怪自己想当然). 找到spring-framework的gitHu ...

  3. python之CMDB

    浅谈ITIL TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central ...

  4. leetcode111

    /** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...

  5. Direcshow之视频捕捉<转>

    关于视频捕捉(About Video Capture in Dshow) 1. 视频捕捉Graph的构建 一个能够捕捉音频或者视频的graph图都称之为捕捉graph图.捕捉graph图比一般的文件回 ...

  6. Git----时光穿梭机之管理修改04

    假如你已经阅读了https://www.cnblogs.com/cxq0017/p/9663452.html Git工作区和暂存区,并且已经掌握了暂存区的概念,下面我们要讨论的是,为什么Git比其他版 ...

  7. Maven(六) eclipse 使用Maven deploy命令部署构建到Nexus

    转载于:http://blog.csdn.net/jun55xiu/article/details/43051627 1  应用场景:SYS-UTIL(系统工具)项目部署.构建成JAR包(SYS-UT ...

  8. C#抽象类与接口的区别【转】

    一.抽象类:      抽象类是特殊的类,只是不能被实例化(可以用派生类实例化基类对象):除此以外,具有类的其他特性:重要的是抽象类可以包括抽象方法(当然它可以有普通方法),这是普通类所不能的.抽象方 ...

  9. AABB和平面的相交性检测

    [AABB和平面的相交性检测]

  10. 第七章 二叉搜索树 07B2-1 插入:算法