最近着手个项目,整体数据量有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. python3_爬虫_爬百度音乐

    工具及环境 1.操作系统:windows 64位系统 2.软件工具:谷歌浏览器.pycharm集成开发工具 3.第三方库:request 注:如果第三方库搭建有困难,请看博客:https://www. ...

  2. HDU 1686 Oulipo(优化的KMP)

    Oulipo Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  3. web开发的功能备忘录

    总体设计 Web项目开发中,我们可以根据不同的功能,将整个系统的功能进行划分.系统功能总体来说可以划分为两个模块:系统的必备功能和逻辑业务功能. 下面主要是分析一下系统的必备功能,所谓系统的必备功能是 ...

  4. [置顶] linux c常用函数 (待完善)

    (1)字符测试函数 isalnum(测试字符是否为英文字母或数字) isalpha(测试字符是否为英文字母) isascii(测试字符是否为ASCII码字符) isblank(测试字符是否为空格字符) ...

  5. [置顶] Ubuntu16.04+opencv3.3.0的安装配置说明

    系统环境:  Linux Ubuntu 16.04  [GCC 5.4.0 20160609] on linux2 之前的教程中我们已经安装了做机器学习需要使用的框架TensorFlow,笔者本科阶段 ...

  6. Sql Server-使用Sql Server自带的分词功能实现字段关键词提取(分词能力很低,慎用)

    “创建全文索引 启动服务 在SQL Server配置管理工具中,找到'SQL Full-text Filter Daemon Launcher'服务用本地用户启动. 创建全文目录 打开需要创建全文目录 ...

  7. 在C#里面获得应用程序的当前路径

    Environment.CurrentDirectory——获取应用程序的当前工作目录.System.IO.Directory.GetCurrentDirectory()AppDomain.Curre ...

  8. Linux Tomcat 7.0 管理员登录时"401 Unauthorized" 问题解决方法

    http://blog.csdn.net/u010359532/article/details/36055291 tomcat 7.0没有默认值,需要在conf的tomcat-users.xml中设置 ...

  9. ubuntu server静态IP和DNS服务器设置

    Ubuntu的网络参数保存在文件 /etc/network/interfaces中, 默认设置使用dhcp,动态IP获取.   设置静态ip的方法如下: 1) 编辑 /etc/network/inte ...

  10. java常量池与对象存储

    一 数据存储位置                                 我们先来谈谈数据的存储位置,有五个地方可以存储数据 (1)寄存器:这是最快的存储区,因为它位于不同于其他存储区的地方- ...