标签: 大数据

关于大数据(千万级,亿级)的查询问题

现在有两张表,一张工商表 6000 万数据,一张工商变更记录表 1.5 亿数据,工商表和变更记录表是一对多的关系,没有物理外键
需要用工商 6000 万的表同步一张新的表,
在同步的过程中需要去查变更记录表,算一些衍生数据,现在就是批量查变更记录表特别慢,
传 1 万个“公司 id”去变更记录表都查要十几分钟,“公司 id”在变更记录表已经建了索引,但是还是慢
已经尝试过分表,“公司 id”去 hash 分表 查询速度不是很明显
第 1 条附言 · 3 分钟前
传 1 万个“公司 id”去变更记录表都查要十几分钟,
纠正一下应该是 1 万个“公司 id” 查需要 2 分钟,
第 2 条附言 · 几秒前
工商表
company_id 主键
name
…..

工商变更记录
rec_id 主键
company_id 普通索引
modification
….
23 条回复 • 2021-09-14 17:19:52 +08:00
ipwx 1
ipwx 6 小时 10 分钟前
加内存,用内存数据结构做。

这可能是*容易的优化方法
wzq001 2
wzq001 5 小时 44 分钟前
传 1 万个“公司 id”去变更记录表都查要十几分钟
wzq001 3
wzq001 5 小时 43 分钟前
??? 业务需要批量变更数据?能不能单独的变更
yidinghe 4
yidinghe 5 小时 42 分钟前 via Android
试下 elastic search,将计算负担分流到多个节点
saberlong 5
saberlong 5 小时 16 分钟前 via Android
分片。把两张表拉下来,根据公司 id 分片,存到磁盘上。然后一个一个分片加载到内存中计算。磁盘持久化的 b+树上千万级,性能下降很厉害。
ericbize 6
ericbize 5 小时 6 分钟前 via iPhone
不说说什么硬件么
zoharSoul 7
zoharSoul 5 小时 4 分钟前
不说说什么硬件么
正常来说 1w 个公司 id 去查记录表应该是秒出
goobai 8
goobai 4 小时 32 分钟前 via Android
数据同步到 es,然后再查
qq8331199 9
qq8331199 3 小时 7 分钟前
@zoharSoul @ericbize
2t 机器硬盘+128G 内存

@goobai @yidinghe
试过了,es 不适合做单纯的查询,我对分词没要求,只是想查出表的数据

@wzq001
不是批量变更,是数据同步,需要根据查其他表,计算出衍生数据,比如新的表里面会标记出公司是否有资本增长,类似这种字段
qq8331199 10
qq8331199 3 小时 5 分钟前
@wzq001
全量同步 6000w 数据,不可能查 6000W 次吧
feirenK 11
feirenK 2 小时 37 分钟前
hbase
feirenK 12
feirenK 2 小时 36 分钟前
ck
ytmsdy 13
ytmsdy 2 小时 25 分钟前
贴一下执行计划,这样大家可以集思广益的看一看。
zhengsidao 14
zhengsidao 2 小时 21 分钟前
用 es 去查实际上是比较快,1.5 亿的数据量很少,term query 很快就能找到。
不过就算是用什么来存储 一万个 id 要查十几分钟,你们到底怎么存的,会这么慢
tulumu 15
tulumu 2 小时 16 分钟前
可以试试实时计算行不行
1. 变更表 binlog 实时更新到 kv 存储中(redis/hbase)
2. 接入主表 binlog, flink 实时 lookup 或者 lookup 缓存 来关联变更维表(redis/hbase), do something, 产生你想要的逻辑的新表
ddkk1112 16
ddkk1112 1 小时 50 分钟前
上 clickhouse
tiiis 17
tiiis 1 小时 35 分钟前
mysql ? 看看索引有没又生效哦,我们几十亿数据 mysql 分好表做好索引也可以毫秒级别的
aragakiyuii 18
aragakiyuii 1 小时 19 分钟前
数据库,表结构,索引都是什么?
这些不知道的话挺难想思路的。。。
ericbize 19
ericbize 47 分钟前
什么数据库? mysql 的话 看看 buff pool 是多少啊, 正常 128 G 内存 如果放 两张表 都可以全部进内存了吧
hongweiliuruige 20
hongweiliuruige 37 分钟前
mysql8.0
abccccabc 21
abccccabc 23 分钟前
同步一张新的表需要实时吗?不需要的话,走计划任务呗
qq8331199 22
qq8331199 4 分钟前
@tiiis
索引生效的
@ericbize
mysql 5.7
@abccccabc
就是离线同步太慢了 单纯的查询 1W id 放到 1.5 亿的表查询 需要 2 分钟
@ddkk1112
这个应用场景不太使用,我需要的是所有列的数据
qq8331199 23
qq8331199 3 分钟前
@zhengsidao
说错了 1W id 我测试的时候应该有人操作数据库,后面再测了一次 只用 2 分钟,但是还是慢

大数据处理必备的十大工具!

大数据的日益增长,给企业管理大量的数据带来了挑战的同时也带来了一些机遇。下面是用于信息化管理的大数据工具列表:

1.ApacheHive

%title插图%num

Hive是一个建立在hadoop上的开源数据仓库基础设施,通过Hive可以很容易的进行数据的ETL,对数据进行结构化处理,并对Hadoop上大数据文件进行查询和处理等。Hive提供了一种简单的类似SQL的查询语言—HiveQL,这为熟悉SQL语言的用户查询数据提供了方便。

2JaspersoftBI套件

%title插图%num

Jaspersoft包是一个通过数据库列生成报表的开源软件。行业领导者发现Jaspersoft软件是一流的,许多企业已经使用它来将SQL表转化为pdf,,这使每个人都可以在会议上对其进行审议。另外,JasperReports提供了一个连接配置单元来替代HBase。

3.1010data

%title插图%num

1010data创立于2000年,是一个总部设在纽约的分析型云服务,旨在为华尔街的客户提供服务,甚至包括NYSEEuronext、游戏和电信的客户。它在设计上支持可伸缩性的大规模并行处理。它也有它自己的查询语言,支持SQL函数和广泛的查询类型,包括图和时间序列分析。这个私有云的方法减少了客户在基础设施管理和扩展方面的压力。

4.Actian

%title插图%num

Actian之前的名字叫做IngresCorp,它拥有超过一万客户而且正在扩增。它通过Vectorwise以及对ParAccel实现了扩展。这些发展分别导致了ActianVector和ActianMatrix的创建。它有Apache,Cloudera,Hortonworks以及其他发行版本可供选择。

5.PentahoBusinessAnalytics

%title插图%num

从某种意义上说,Pentaho与Jaspersoft相比起来,尽管Pentaho开始于报告生成引擎,但它目前通过简化新来源中获取信息的过程来支持大数据处理。Pentaho的工具可以连接到NoSQL数据库,例如MongoDB和Cassandra。PeterWayner指出,PentahoData(一个更有趣的图形编程界面工具)有很多内置模块,你可以把它们拖放到一个图片上,然后将它们连接起来。

6.KarmasphereStudioandAnalyst

%title插图%num

KarsmasphereStudio是一组构建在Eclipse上的插件,它是一个更易于创建和运行Hadoop任务的专用IDE。在配置一个Hadoop工作时,Karmasphere工具将引导您完成每个步骤并显示部分结果。当出现所有数据处于同一个Hadoop集群的情况时,KarmaspehereAnalyst旨在简化筛选的过程,。

7.Cloudera

%title插图%num

Cloudera正在努力为开源Hadoop,提供支持,同时将数据处理框架延伸到一个全面的“企业数据中心”范畴,这个数据中心可以作为首选目标和管理企业所有数据的中心点。Hadoop可以作为目标数据仓库,高效的数据平台,或现有数据仓库的ETL来源。企业规模可以用作集成Hadoop与传统数据仓库的基础。Cloudera致力于成为数据管理的“重心”。

8.HPVerticaAnalyticsPlatformVersion7

%title插图%num

HP提供了用于加载Hadoop软件发行版所需的参考硬件配置,因为它本身并没有自己的Hadoop版本。计算机行业领袖将其大数据平台架构命名为HAVEn(意为Hadoop,Autonomy,Vertica,EnterpriseSecurityand“n”applications)。惠普在Vertica7版本中增加了一个“FlexZone”,允许用户在定义数据库方案以及相关分析、报告之前探索大型数据集中的数据。这个版本通过使用HCatalog作为元数据存储,与Hadoop集成后为用户提供了一种探索HDFS数据表格视图的方法。

9.TalendOpenStudio

%title插图%num

Talend’s工具用于协助进行数据质量、数据集成和数据管理等方面工作。Talend是一个统一的平台,它通过提供一个统一的,跨企业边界生命周期管理的环境,使数据管理和应用更简单便捷。这种设计可以帮助企业构建灵活、高性能的企业架构,在次架构下,集成并启用百分之百开源服务的分布式应用程序变为可能。

10.ApacheSpark

%title插图%num

ApacheSpark是Hadoop开源生态系统的新成员。它提供了一个比Hive更快的查询引擎,因为它依赖于自己的数据处理框架而不是依靠Hadoop的HDFS服务。同时,它还用于事件流处理、实时查询和机器学习等方面。

云计算从产业发展、公共服务和生活领域,改变着我们的生活

云计算产业发展与智慧城市建设相辅相成,云计算技术在工业、交通、能源、医疗、市政等经济社会各个领域支撑城市的智慧发展。通过技术创新提高城市的综合管理效率和公共服务水平,让城市运营发展的更加智慧。同时智慧城市也在孕育和催化云计算典型应用的落地和推广,为云计算产业发展不断拓展广阔的空间。

今天,云计算已经从纸上蓝图发展成为实实在在的大产业,革命性的将大数据、大宽带、大平台、大服务捆绑在一起,孕育着广阔的产业变革,深刻改变着信息产业发展格局和我们的生产生活方式。具体表现在三个方面:

产业发展领域:云计算加速了产业优化升级步伐,越来越多的企业通过大规模部署云计算在推动战略性变革,实现更精准的决策和更深入的协作方面获得企业核心竞争优势。借助互联网、云计算技术,实现多业态融合,成为产业结构调整升级新方向,*大的促进中小企业创新创业和全社会信息化水平提升。

公共服务领域:云计算提升了服务水平和管理效率。随着云计算和大数据技术在智慧城市建设、社区精细管理、疾病预防和治疗、食品药品安全监管、环境污染监测等领域的逐渐应用,社会管理效率、公共服务水平和人民幸福感将得到*大的提升。

个人生活领域:云计算使工作更加高效,生活更加快乐。随着云计算、大数据时代的到来,云办公、云笔记、云视频、云记帐等被广泛应用,可穿戴设备随时关注着我们的健康。基于大数据的反馈经济,让我们生活的更加便捷。

随着多元化的发展,思想文化的交流,社会也变得越来越无序。所以更需要借助云计算、大数据等新一代信息技术手段,面向未来,构建我们的现代市场体系,宏观调控体系,开放型经济体系等等。这都给云计算产业的发展孕育提供了更大的空间。

什么? 搞不定redis分布式锁?

分布式锁

1. 什么是分布式锁

分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。

2. 为什么要使用分布式锁

为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLock或Synchronized)进行互斥控制。在单机环境中,Java中提供了很多并发处理相关的API。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的Java API并不能提供分布式锁的能力。为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题!

举个例子:

机器A , 机器B是一个集群, A, B两台机器上的程序都是一样的, 具备高可用性能.

A, B机器都有一个定时任务, 每天晚上凌晨2点需要执行一个定时任务, 但是这个定时任务只能执行一遍, 否则的话就会报错, 那A,B两台机器在执行的时候, 就需要抢锁, 谁抢到锁, 谁执行, 谁抢不到, 就不用执行了!

3. 锁的处理

  • 单个应用中使用锁: (单进程多线程)
synchronize
  • 分布式锁控制分布式系统之间同步访问资源的一种方式

分布式锁是控制分布式系统之间同步同问共享资源的一种方式

4. 分布式锁的实现

  • 基于数据的乐观锁实现分布式锁
  • 基于zookeeper临时节点的分布式锁
  • 基于redis的分布式锁

5. redis的分布式锁

  • 获取锁:

在set命令中, 有很多选项可以用来修改命令的行为, 一下是set命令可用选项的基本语法

redis 127.0.0.1:6379>SET KEY VALUE [EX seconds] [PX milliseconds] [NX|XX]

  1. redis 127.0.0.1:6379>SET KEY VALUE [EX seconds] [PX milliseconds] [NX|XX]
  2. EX seconds 设置指定的到期时间(单位为秒)
  3. PX milliseconds 设置指定的到期时间(单位毫秒)
  4. NX: 仅在键不存在时设置键
  5. XX: 只有在键已存在时设置

方式1: 推介

  1. private static final String LOCK_SUCCESS = “OK”;
  2. private static final String SET_IF_NOT_EXIST = “NX”;
  3. private static final String SET_WITH_EXPIRE_TIME = “PX”;
  4. public static boolean getLock(JedisCluster jedisCluster, String lockKey, String requestId, int expireTime) {
  5. // NX: 保证互斥性
  6. String result = jedisCluster.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
  7. if (LOCK_SUCCESS.equals(result)) {
  8. return true;
  9. }
  10. return false;
  11. }

方式2:

  1. public static boolean getLock(String lockKey,String requestId,int expireTime) {
  2. Long result = jedis.setnx(lockKey, requestId);
  3. if(result == 1) {
  4. jedis.expire(lockKey, expireTime);
  5. return true;
  6. }
  7. return false;
  8. }

注意: 推介方式1, 因为方式2中setnx和expire是两个操作, 并不是一个原子操作, 如果setnx出现问题, 就是出现死锁的情况, 所以推荐方式1

  • 释放锁:

方式1: del命令实现

  1. public static void releaseLock(String lockKey,String requestId) {
  2. if (requestId.equals(jedis.get(lockKey))) {
  3. jedis.del(lockKey);
  4. }
  5. }

方式2: redis+lua脚本实现 推荐

  1. public static boolean releaseLock(String lockKey, String requestId) {
  2. String script = “if redis.call(‘get’, KEYS[1]) == ARGV[1] then return
  3. redis.call(‘del’, KEYS[1]) else return 0 end”;
  4. Object result = jedis.eval(script, Collections.singletonList(lockKey),
  5. Collections.singletonList(requestId));
  6. if (result.equals(1L)) {
  7. return true;
  8. }
  9. return false;
  10. }

6. zookeeper的分布式锁

6.1 zookeeper实现分布式锁的原理

理解了锁的原理后,就会发现,Zookeeper 天生就是一副分布式锁的胚子。

首先,Zookeeper的每一个节点,都是一个天然的顺序发号器。

在每一个节点下面创建子节点时,只要选择的创建类型是有序(EPHEMERAL_SEQUENTIAL 临时有序或者PERSISTENT_SEQUENTIAL 永久有序)类型,那么,新的子节点后面,会加上一个次序编号。这个次序编号,是上一个生成的次序编号加一

比如,创建一个用于发号的节点“/test/lock”,然后以他为父亲节点,可以在这个父节点下面创建相同前缀的子节点,假定相同的前缀为“/test/lock/seq-”,在创建子节点时,同时指明是有序类型。如果是*个创建的子节点,那么生成的子节点为/test/lock/seq-0000000000,下一个节点则为/test/lock/seq-0000000001,依次类推,等等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里插入图片描述

其次,Zookeeper节点的递增性,可以规定节点编号*小的那个获得锁。

一个zookeeper分布式锁,首先需要创建一个父节点,尽量是持久节点(PERSISTENT类型),然后每个要获得锁的线程都会在这个节点下创建个临时顺序节点,由于序号的递增性,可以规定排号*小的那个获得锁。所以,每个线程在尝试占用锁之前,首先判断自己是排号是不是当前*小,如果是,则获取锁。

第三,Zookeeper的节点监听机制,可以保障占有锁的方式有序而且高效。

每个线程抢占锁之前,先抢号创建自己的ZNode。同样,释放锁的时候,就需要删除抢号的Znode。抢号成功后,如果不是排号*小的节点,就处于等待通知的状态。等谁的通知呢?不需要其他人,只需要等前一个Znode 的通知就可以了。当前一个Znode 删除的时候,就是轮到了自己占有锁的时候。*个通知第二个、第二个通知第三个,击鼓传花似的依次向后。

Zookeeper的节点监听机制,可以说能够非常完美的,实现这种击鼓传花似的信息传递。具体的方法是,每一个等通知的Znode节点,只需要监听linsten或者 watch 监视排号在自己前面那个,而且紧挨在自己前面的那个节点。 只要上一个节点被删除了,就进行再一次判断,看看自己是不是序号*小的那个节点,如果是,则获得锁。

为什么说Zookeeper的节点监听机制,可以说是非常完美呢?

一条龙式的首尾相接,后面监视前面,就不怕中间截断吗?比如,在分布式环境下,由于网络的原因,或者服务器挂了或则其他的原因,如果前面的那个节点没能被程序删除成功,后面的节点不就永远等待么?

其实,Zookeeper的内部机制,能保证后面的节点能够正常的监听到删除和获得锁。在创建取号节点的时候,尽量创建临时znode 节点而不是永久znode 节点,一旦这个 znode 的客户端与Zookeeper集群服务器失去联系,这个临时 znode 也将自动删除。排在它后面的那个节点,也能收到删除事件,从而获得锁。

说Zookeeper的节点监听机制,是非常完美的。还有一个原因。

Zookeeper这种首尾相接,后面监听前面的方式,可以避免羊群效应。所谓羊群效应就是每个节点挂掉,所有节点都去监听,然后做出反映,这样会给服务器带来巨大压力,所以有了临时顺序节点,当一个节点挂掉,只有它后面的那一个节点才做出反映。

###6.2 zookeeper实现分布式锁的示例

zookeeper是通过临时节点来实现分布式锁.

  1. import org.apache.curator.RetryPolicy;
  2. import org.apache.curator.framework.CuratorFramework;
  3. import org.apache.curator.framework.CuratorFrameworkFactory;
  4. import org.apache.curator.framework.recipes.locks.InterProcessMutex;
  5. import org.apache.curator.retry.ExponentialBackoffRetry;
  6. import org.junit.Before;
  7. import org.junit.Test;
  8. /**
  9. * @ClassName ZookeeperLock
  10. * @Description TODO
  11. * @Author lingxiangxiang
  12. * @Date 2:57 PM
  13. * @Version 1.0
  14. **/
  15. public class ZookeeperLock {
  16. // 定义共享资源
  17. private static int NUMBER = 10;
  18. private static void printNumber() {
  19. // 业务逻辑: 秒杀
  20. System.out.println(“*********业务方法开始************\n”);
  21. System.out.println(“当前的值: “ + NUMBER);
  22. NUMBER–;
  23. try {
  24. Thread.sleep(2000);
  25. } catch (InterruptedException e) {
  26. e.printStackTrace();
  27. }
  28. System.out.println(“*********业务方法结束************\n”);
  29. }
  30. // 这里使用@Test会报错
  31. public static void main(String[] args) {
  32. // 定义重试的侧策略 1000 等待的时间(毫秒) 10 重试的次数
  33. RetryPolicy policy = new ExponentialBackoffRetry(1000, 10);
  34. // 定义zookeeper的客户端
  35. CuratorFramework client = CuratorFrameworkFactory.builder()
  36. .connectString(“10.231.128.95:2181,10.231.128.96:2181,10.231.128.97:2181”)
  37. .retryPolicy(policy)
  38. .build();
  39. // 启动客户端
  40. client.start();
  41. // 在zookeeper中定义一把锁
  42. final InterProcessMutex lock = new InterProcessMutex(client, “/mylock”);
  43. //启动是个线程
  44. for (int i = 0; i <10; i++) {
  45. new Thread(new Runnable() {
  46. @Override
  47. public void run() {
  48. try {
  49. // 请求得到的锁
  50. lock.acquire();
  51. printNumber();
  52. } catch (Exception e) {
  53. e.printStackTrace();
  54. } finally {
  55. // 释放锁, 还锁
  56. try {
  57. lock.release();
  58. } catch (Exception e) {
  59. e.printStackTrace();
  60. }
  61. }
  62. }
  63. }).start();
  64. }
  65. }
  66. }

7. 基于数据的分布式锁

我们在讨论使用分布式锁的时候往往首先排除掉基于数据库的方案,本能的会觉得这个方案不够“高级”。从性能的角度考虑,基于数据库的方案性能确实不够优异,整体性能对比:缓存 > Zookeeper、etcd > 数据库。也有人提出基于数据库的方案问题很多,不太可靠。数据库的方案可能并不适合于频繁写入的操作.

下面我们来了解一下基于数据库(MySQL)的方案,一般分为3类:基于表记录、乐观锁和悲观锁。

7.1 基于表记录

要实现分布式锁,*简单的方式可能就是直接创建一张锁表,然后通过操作该表中的数据来实现了。当我们想要获得锁的时候,就可以在该表中增加一条记录,想要释放锁的时候就删除这条记录。

为了更好的演示,我们先创建一张数据库表,参考如下:

  1. CREATE TABLE `database_lock` (
  2. `id` BIGINT NOT NULL AUTO_INCREMENT,
  3. `resource` int NOT NULL COMMENT ‘锁定的资源’,
  4. `description` varchar(1024) NOT NULL DEFAULT “” COMMENT ‘描述’,
  5. PRIMARY KEY (`id`),
  6. UNIQUE KEY `uiq_idx_resource` (`resource`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=‘数据库分布式锁表’;
  • 获得锁

我们可以插入一条数据:

INSERT INTO database_lock(resource, description) VALUES (1, 'lock');

因为表database_lock中resource是唯一索引, 所以其他请求提交到数据库, 就会报错, 并不会插入成功, 只有一个可以插入. 插入成功, 我们就获取到锁

  • 删除锁
INSERT INTO database_lock(resource, description) VALUES (1, 'lock');

这种实现方式非常的简单,但是需要注意以下几点:

  1. 这种锁没有失效时间,一旦释放锁的操作失败就会导致锁记录一直在数据库中,其它线程无法获得锁。这个缺陷也很好解决,比如可以做一个定时任务去定时清理。
  2. 这种锁的可靠性依赖于数据库。建议设置备库,避免单点,进一步提高可靠性。
  3. 这种锁是非阻塞的,因为插入数据失败之后会直接报错,想要获得锁就需要再次操作。如果需要阻塞式的,可以弄个for循环、while循环之类的,直至INSERT成功再返回。
  4. 这种锁也是非可重入的,因为同一个线程在没有释放锁之前无法再次获得锁,因为数据库中已经存在同一份记录了。想要实现可重入锁,可以在数据库中添加一些字段,比如获得锁的主机信息、线程信息等,那么在再次获得锁的时候可以先查询数据,如果当前的主机信息和线程信息等能被查到的话,可以直接把锁分配给它。

7.2 乐观锁

顾名思义,系统认为数据的更新在大多数情况下是不会产生冲突的,只在数据库更新操作提交的时候才对数据作冲突检测。如果检测的结果出现了与预期数据不一致的情况,则返回失败信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

乐观锁大多数是基于数据版本(version)的记录机制实现的。何谓数据版本号?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表添加一个 “version”字段来实现读取出数据时,将此版本号一同读出,之后更新时,对此版本号加1。在更新过程中,会对版本号进行比较,如果是一致的,没有发生改变,则会成功执行本次操作;如果版本号不一致,则会更新失败。

为了更好的理解数据库乐观锁在实际项目中的使用,这里也就举了业界老生常谈的库存例子。一个电商平台都会存在商品的库存,当用户进行购买的时候就会对库存进行操作(库存减1代表已经卖出了一件)。如果只是一个用户进行操作数据库本身就能保证用户操作的正确性,而在并发的情况下就会产生一些意想不到的问题:

比如两个用户同时购买一件商品,在数据库层面实际操作应该是库存进行减2操作,但是由于高并发的情况,*个用户购买完成进行数据读取当前库存并进行减1操作,由于这个操作没有完全执行完成。第二个用户就进入购买相同商品,此时查询出的库存可能是未减1操作的库存导致了脏数据的出现【线程不安全操作】,通常如果是单JVM情况下使用JAVA内置的锁就能保证线程安全,如果在多JVM的情况下,使用分布式锁也能实现【后期会补】,而本篇着重的去讲数据库层面的。

针对上面的问题,数据库乐观锁也能保证线程安全,通常哎代码层面我们都会这样做:

  1. select goods_num from goods where goods_name = “小本子”;
  2. update goods set goods_num = goods_num -1 where goods_name = “小本子”;

上面的SQL是一组的,通常先查询出当前的goods_num,然后再goods_num上进行减1的操作修改库存,当并发的情况下,这条语句可能导致原本库存为3的一个商品经过两个人购买还剩下2库存的情况就会导致商品的多卖。那么数据库乐观锁是如何实现的呢?
首先定义一个version字段用来当作一个版本号,每次的操作就会变成这样:

  1. select goods_num,version from goods where goods_name = “小本子”;
  2. update goods set goods_num = goods_num -1,version =查询的version值自增 where goods_name =“小本子” and version=查询出来的version

其实,借助更新时间戳(updated_at)也可以实现乐观锁,和采用version字段的方式相似:更新操作执行前线获取记录当前的更新时间,在提交更新时,检测当前更新时间是否与更新开始时获取的更新时间戳相等。

7.3 悲观锁

除了可以通过增删操作数据库表中的记录以外,我们还可以借助数据库中自带的锁来实现分布式锁。在查询语句后面增加FOR UPDATE,数据库会在查询过程中给数据库表增加悲观锁,也称排他锁。当某条记录被加上悲观锁之后,其它线程也就无法再改行上增加悲观锁。

悲观锁,与乐观锁相反,总是假设*坏的情况,它认为数据的更新在大多数情况下是会产生冲突的。

在使用悲观锁的同时,我们需要注意一下锁的级别。MySQL InnoDB引起在加锁的时候,只有明确地指定主键(或索引)的才会执行行锁 (只锁住被选取的数据),否则MySQL 将会执行表锁(将整个数据表单给锁住)。

在使用悲观锁时,我们必须关闭MySQL数据库的自动提交属性(参考下面的示例),因为MySQL默认使用autocommit模式,也就是说,当你执行一个更新操作后,MySQL会立刻将结果进行提交。

  1. mysql> SET AUTOCOMMIT = 0;
  2. Query OK, 0 rows affected (0.00 sec)

这样在使用FOR UPDATE获得锁之后可以执行相应的业务逻辑,执行完之后再使用COMMIT来释放锁。

我们不妨沿用前面的database_lock表来具体表述一下用法。假设有一线程A需要获得锁并执行相应的操作,那么它的具体步骤如下:

STEP1 – 获取锁:SELECT * FROM database_lock WHERE id = 1 FOR UPDATE;。
STEP2 – 执行业务逻辑。
STEP3 – 释放锁:COMMIT。

【总结】2020年*新算法工程师技术路线图

这是一份写给公司算法组同事们的技术路线图,其目的主要是为大家在技术路线的成长方面提供一些方向指引,配套一些自我考核项,可以带着实践进行学习,加深理解和掌握。

%title插图%num

工程师能力层级概览

对于不同级别的算法工程师技能要求,我们大致可以分成以下几个层级:

  • 初级:可以在一些指导和协助下独立完成开发任务。具体到算法方面,需要你对于工具框架,建模技术,业务特性等方面有一定的了解,可以独立实现一些算法项目上的需求。
  • 中级:可以基本独立完成一个项目的开发与交付。在初级工程师的基础上,对于深入了解技术原理的要求会更高,并且能够应对项目中各种复杂多变的挑战,对于已有技术和工具进行改造适配。在整体工程化交付方面,对于代码质量,架构设计,甚至项目管理方面的要求会开始显现。另外从业务出发来评估技术选型和方案也变得尤为重要。
  • 高级:可以独立负责一条产品线的运作。在中级工程师的基础上,需要更广阔的技术视野与开拓创新能力,定义整个产品线的前进方向。解决问题已经不是关键,更重要的是提出和定义问题,能够打造出在业界具有*性和差异性的产品,为公司创造更大的价值。

事实上对于不同层级的工程师,非技术部分的要求都有一定占比。本文主要聚焦在技术路线图上,对于其他方面的学习进阶路线不会做覆盖。

阅读建议

以下内容分工程基础,算法基础,算法工程交叉,工程深入方向,算法深入方向几个部分,在各个部分内部会进一步区分一些主题。在各个主题内部,也是有深入程度的区别的,不过限于篇幅没有进行详细的说明。建议学习路线可以先把两个基础部分与工作中较为相关的内容做一个整体基础的夯实,然后可以在后续交叉和深入方向的主题中选择感兴趣的进行深入了解和学习,过程中发现基础部分欠缺的,可以再回到基础部分查漏补缺,迭代前行。

工程基础

编程语言

Python

Python 是算法工程师日常工作中*常用的语言,应该作为必须掌握的一门技术。大致的学习路线如下:

  • 学习掌握 Python 的基本语法,可以通过各类入门教程来看,个人推荐《Learn Python the Hard Way》。
  • 自我考核:能够读懂大多数的内部项目及一些开源项目代码的基本模块,例如 pandas, sklearn 等。
  • 学习 Python 的编程风格,建议学习观远内部的 Python 代码规范。
  • 自我考核:编写的代码符合编码规范,能够通过各类 lint 检查。
  • Python 进阶,这方面有一本非常著名的书《Fluent Python》,深入介绍了 Python 内部的很多工作原理,读完之后对于各类疑难问题的理解排查,以及语言高级特性的应用方面会很有帮助。另外动态语言元编程这块,《Ruby 元编程》也是一本非常值得推荐的书。
  • 自我考核:能够读懂一些复杂的 Python 项目,例如 sqlalchemy 中就大量使用了元编程技巧。在实际工程项目中,能够找到一些应用高级技巧的点进行实践,例如基于 Cython 的性能优化等。
  • 领域应用,Python 的应用相当广泛,在各个领域深入下去都有很多可以学习的内容,比如 Web 开发,爬虫,运维工具,数据处理,机器学习等。这块主要就看大家各自的兴趣来做自由选择了,个人推荐熟悉了解一下 Python web 开发,测试开发相关的内容,开拓视野。
  • 自我考核:以 Web 开发和测试开发为例,尝试写一个简单的 model serving http 服务,并编写相应的自动化测试。

Scala/Java

Java 目前是企业级开发中*常用的软件,包括在大数据领域,也是应用*广泛的语言,例如当年的 Hadoop 生态基本都是基于 Java 开发的。Scala 由于其函数式编程的特性,在做数据处理方面提供了非常方便的 API,也因为 Spark 等项目的火热,形成了一定的流行度。在进行企业级的软件开发,高性能,大规模数据处理等方面,JVM 上的这两门语言有很大的实用价值,值得学习。

顺带一提,Scala 本身是一门非常有意思的语言,其中函数式编程的思想与设计模式又是非常大的一块内容,对于拓宽视野,陶冶情操都是挺不错的选择。

考虑到算法工程师的工作内容属性,这边给出一个 Scala 的学习路线:

  • 学习掌握 Scala 的基本语法,开发环境配置,项目编译运行等基础知识。这里推荐 Coursera 上 Martin Odersky 的课程,《快学 Scala》或《Programming in Scala》两本书也可以搭配着浏览参考。
  • 自我考核:能使用 Scala 来实现一些简单算法问题,例如 DFS/BFS。或者使用 Scala 来处理一些日常数据工作,例如读取日志文件,提取一些关键信息等。
  • 学习使用 Scala 来开发 Spark 应用,推荐 edX 上的《Big Data Analytics Using Spark》或者 Coursera 上的《Big Data Analytics with Scala and Spark》,另外有些相关书籍也可以参考,比如《Spark 快速大数据分析》等。
  • 自我考核:能够使用 Spark 的 Scala API 来进行大规模的数据分析及处理,完成 lag feature 之类的特征工程处理。
  • JVM 的原理学习,Scala/Java 都是 JVM 上运行的优秀语言,其背后是一个非常大的生态,包括在 Web,Android,数据基础架构等方面有广泛的应用。JVM 相比 Python 虚拟机,发展更加成熟,有一套非常完善的 JDK 工具链及衍生的各类项目,便于开发者 debug,调优应用。这方面推荐学习周志明的《深入理解 Java 虚拟机》。
  • 自我考核:理解 JVM GC 原理,能通过 JDK 中相关工具或者优秀的第三方工具如 arthas 等,排查分析 Spark 数据应用的资源使用情况,GC profiling,hot method profiling 等,进而进行参数优化。
  • 计算机语言理论。Programming Language 作为计算机科学的一个重要分支,包含了很多值得深入研究的主题,例如类型论,程序分析,泛型,元编程,DSL,编译原理等。这方面的很多话题,在机器学习方面也有很多实际应用,比如 TVM 这类工作,涉及到大量编译原理的应用,知乎大佬 “蓝色” 也作为这个领域的专家在从事深度学习框架相关的工作。llvm, clang 作者 Chris Lattner 也加入 Google 主导了 Swift for Tensorflow 等工作。Scala 作为一门学术范非常强的语言,拥有*佳的 FP,元编程等能力支持,强大的类型系统包括自动推理,泛型等等高级语言特性,相对来说是一门非常 “值得” 学习的新语言,也是一个进入 PL 领域深入学习的 “gateway drug” 🙂 对这个方面有兴趣的同学,可以考虑阅读《Scala 函数式编程》,《冒号课堂》,以及 Coursera 上《Programming Languages》也是一门非常好的课程。另外只想做科普级了解的同学,也可以读一读著名的《黑客与画家》感受一下。

C/C++/Rust

当前流行的算法框架,例如 TensorFlow, PyTorch, LightGBM 等,底层都是基于 C++ 为主要语言进行实现的。但是 C++ 本身过于复杂,使用场景也比较有限制,建议只需要达到能够读懂一些基础的 C++ 代码逻辑即可。在系统级开发领域,目前有一门新语言逐渐崛起,连续几年被 StackOverflow 投票评选为程序员*喜爱的语言:Rust。从设计理念和一些业界应用(例如 TiKV)来看还是非常不错的,但是我也没有深入学习了解过,就不做具体推荐了。这方面建议的学习内容包括经典的《The C Programming Language》以及 Rust 官方的:https://github.com/rust-lang/rustlings

  • 自我考核:能够读懂 LightGBM 里对于 tweedie loss 的相关定义代码。

操作系统

基本概念

我们所编写的算法应用,都是通过操作系统的环境运行在物理硬件之上的。在实际运作过程中,会碰到不少相关的问题,例如为什么程序报了资源不足的错误,为什么 notebook 在浏览器里打不开,为什么进程 hang 住了没有响应等等,都需要一些操作系统的知识来帮助理解和分析问题,*终排查解决。操作系统涵盖的内容比较多,建议一开始只需要了解一些主要概念(例如硬件结构,CPU 调度,进程,线程,内存管理,文件系统,IO,网络等),对于整体图景有一些感觉即可。后续碰到了实际问题,可以再在各个部分深入学习展开。优秀的学习资料也有很多,基本都是大部头,重点推荐《深入理解计算机系统》,《Operating Systems: Three Easy Pieces》,以及《现代操作系统》。

  • 自我考核:能够基本明确运行一个模型训练任务过程中,底层使用到的硬件,操作系统组件,及其交互运作的方式是如何的。

Linux 基础

平时工作中*常用的两个操作系统 CentOS 和 macOS,都是 Unix/Linux 系的,因此学习掌握相关的基础知识非常重要。一些必须掌握的知识点包括:Shell 与命令行工具,软件包管理,用户及权限,系统进程管理,文件系统基础等。这方面的入门学习资料推荐《鸟哥的 Linux 私房菜》,基本涵盖了 Linux 系统管理员需要掌握知识的方方面面。进阶可以阅读《Unix 环境高级编程》,对于各种系统调用的讲解非常深入,可以为后续性能调优等高级应用打下基础。

  • 自我考核:开发一个 shell 小工具,实现一些日常工作需求,例如定时自动清理数据文件夹中超过一定年龄的数据文件,自动清理内存占用较大且运行时间较久的 jupyter notebook 进程等。

深入应用

工作中碰到的疑难问题排查,性能分析与优化,系统运维及稳定性工程等方面,都需要较为深入的计算机体系和操作系统知识,感兴趣的同学可以针对性的进行深入学习。以性能优化为例,可以学习经典的《性能之巅》,了解其中的原理及高级工具链。像其中的系统调用追踪 (strace),动态追踪(systemtap, DTrace, perf, eBPF) 等技术,对于操作系统相关的问题排查都会很有帮助。

  • 自我考核:能够分析定位出 LightGBM 训练过程中的性能瓶颈,精确到函数调用甚至代码行号的级别。

软件工程

算法与数据结构

暂时先把这块放到软件工程模块下。这里指的算法是计算机科学中的经典算法,例如递归,排序,搜索,动态规划等,有别于我们常说的机器学习算法。这块的学习资料网上有非常多,个人当年是通过普林斯顿的算法课 (需要有 Java 基础) 入门,后来又上了斯坦福的算法分析与设计,开拓了一些视野。书籍方面推荐新手从《算法图解》入门,然后可以考虑阅读 Jeff Erickson 的《Algorithms》,或者选择上面提到的网课。另外像《编程珠玑》,《编程之美》等也可以参阅,里面有不少问题的巧妙解法。除了从书本中学习,还可以直接去 LeetCode 等网站进行实战操作进行练习提高。

  • 自我考核:能够设计相关的数据结构,实现一个类似 airflow 中点击任意节点向后运行的功能。

代码规范

从初级程序员到中高级程序员,其中比较大的一个差异就是代码编写习惯上,从一开始写计算机能理解,能够运行成功的代码,逐渐演化到写人能够理解,易于修改与维护的代码。在这条学习路径上,首先需要建立起这方面的意识,然后需要在实战中反复思考和打磨自己的代码,评判和学习其它优秀的项目代码,才能逐渐精进。推荐的学习书籍有《编写可读代码的艺术》,一本非常短小精悍的入门书籍,后续可以再慢慢阅读那些经典大部头,例如《Clean Code》,《Code Complete》,《The Pragmatic Programmer》等。这方面 Python 也有一本比较针对性的书籍《Effective Python》,值得一读。

  • 自我考核:审视自己写的项目代码,能发现并修正至少三处不符合*佳编码实践的问题。

设计模式

在代码架构方面,设计模式是一个重要的话题,对于日常工作中出现的许多典型场景,给出了一些解决方案的“套路”。这方面*著名的书当属 GoF 的《设计模式》,不过个人并不十分推荐,尤其是以 Python 作为主要工作语言的话,其中很大部分的设计模式可能并不需要。入门可以浏览一下这个网站掌握一些基本概念:https://refactoringguru.cn/design-patterns/python ,后续可以考虑阅读《Clean Architecture》,《重构》等相关数据,理解掌握在优化代码架构过程中思考的核心点,并加以运用。Python 相关的设计模式应用,还可以参考《Python in Practice》。

  • 自我考核:在项目中,找到一处可以应用设计模式的地方,进行重构改进。

质量保障

对于需要实际上线运行的软件工程,质量保障是非常重要的一个环节,能够确保整个产品按照期望的方式进行运作。在机器学习项目中,由于引入了数据这个因素,相比传统的软件测试会有更高的难度,也是业界还在摸索前进的方向。建议可以先阅读《单元测试的艺术》或《Google 软件测试之道》,大致理解软件测试的一些基本概念和运作方式,在此基础上可以进一步阅读 Martin Fowler 对于机器学习领域提出的 CD4ML 中相关的测试环节,学习 sklearn,LightGBM 等开源库的测试开发方式,掌握机器学习相关的质量保障技术能力。

  • 自我考核:在项目中,实现基础的数据输入测试,预测输出测试。

项目管理

软件工程推进过程中,项目管理相关的技能方法与工具运用也非常的关键。其中各种研发流程与规范,例如敏捷开发,设计评审,代码评审,版本管控,任务看板管理等,都是实际项目推进中非常重要的知识技能点。这方面推荐学习一本经典的软件工程教材《构建之法》,了解软件项目管理的方方面面。进一步来说广义的项目管理上的很多知识点也是后续深入学习的方向,可以参考*客时间上的课程《项目管理实战 20 讲》。

  • 自我考核:在某个负责项目中运用项目管理方法,完成一个实际的需求评估,项目规划,设计与评审,开发执行,项目上线,监控维护流程,并对整个过程做复盘总结。

高级话题

软件工程师在技能方向成长的一条路线就是成为软件架构师,在这个方向上对于技能点会有非常高的综合性要求,其中也有不少高级话题需要深入学习和了解,例如技术选型与系统架构设计,架构设计原则与模式,宽广的研发知识视野,高性能,高可用,可扩展性,安全性等等。有兴趣的同学可以了解一下*客时间的《从 0 开始学架构》这门课,逐渐培养这方面的视野与能力。另外如《微服务架构设计模式》还有领域驱动设计方面的一系列书籍也值得参考学习。

  • 自我考核:设计一个算法项目 Docker 镜像自动打包系统。

算法基础

数据分析

数学基础

在进行算法建模时,深入了解数据情况,做各类探索性分析,统计建模等工作非常重要,这方面对一些数学基础知识有一定的要求,例如概率论,统计学等。这方面除了经典的数学教材,也可以参考更程序员向的《统计思维》,《贝叶斯方法》,《程序员的数学 2》等书籍。

  • 自我考核:理解实际项目中的数据分布情况,并使用统计建模手段,推断预测值的置信区间。

可视化

在进行数据分析时,可视化是一个非常重要的手段,有助于我们快速理解数据情况,发掘数据规律,并排查异常点。对于各种不同类型的数据,会对应不同的可视化*佳实践,如选择不同的图表类型,板式设计,分析思路编排,人机交互方式等等。另一方面,可视化与数据报告也是我们与不同角色人群沟通数据 insights 的一个重要途径,需要从业务角度出发去思考可视化与沟通方式。这方面可以参考《Storytelling with Data》,《The Visual Display of Quantitative Information》等经典数据,同时也需要培养自己的商业背景 sense,提升沟通能力。

  • 自我考核:对内沟通方面,能使用可视化技术,分析模型的 bad case 情况,并确定优化改进方向。对外沟通方面,能独立完成项目的数据分析沟通报告。

误差分析与调优

在做算法模型调优改进中,需要从数据分析的基础上出发来决定实验方向,这么做有几个好处:

  • 从分析出发指导调优更有方向性,而不是凭经验加个特征,改个参数碰运气。哪怕是业务方提供的信息,也*好是有数据分析为前提再做尝试,而不是当成一个既定事实。
  • 由分析发现的根源问题,对于结果验证也更有帮助。尤其在预测的数据量*大情况下,加一个单一特征很可能总体只有千分位准确率的提升,无法确定是天然波动还是真实的提升。但如果有分析的前提,那么我们可以有针对性的看对于这个已知问题,我们的调优策略是否生效,而不是只看一个总体准确率。
  • 对于问题的彻底排查解决也更有帮助,有时候结果没有提升,不一定是特征没用,也可能是特征代码有 bug 之类的问题。带着数据分析的目标去看为什么这个特征没有效果,是模型没学到还是特征没有区分度等,有没有改进方案,对于我们评判调优尝试是否成功的原因也更能彻查到底。
  • 数据分析会帮助我们发现一些额外的问题点,比如销量数据清洗处理是不是有问题,是不是业务本身有异常,需要剔除数据等。

这方面在业界有一些关于误差分析的探索研究,不过大多数都是基于分类问题的,例如《Identifying Unknown Unknowns in the Open World》,《A Characterization of Prediction Errors》等。可以在了解这些研究的基础上,结合具体的业务情况,深入思考总结误差分析的思路与方法论。

  • 自我考核:在项目中形成一套可以重复使用的误差分析方案,能够快速从预测输出中定位到目前模型*重要的误差类别,并一定程度上寻找到根本原因。

机器学习基础

传统机器学习

这块大家应该都非常熟悉了,初阶的学习路线可以参考周志华老师的《机器学习》,涵盖了机器学习基础,常用机器学习方法,和一些进阶话题如学习理论,强化学习等。如果希望深化理论基础,可以参考经典的《PRML》,《ESL》和《统计学习方法》。在实战中,需要综合业务知识,算法原理,及数据分析等手段,逐渐积累形成建模调优的方法论,提高整体实验迭代的效率和成功率。

  • 自我考核:结合实际业务和机器学习理论知识,挖掘项目中算法表现不够好的问题,并通过算法改造进行提升或解决。

深度学习

近些年兴起的深度学习,已经成为机器学习领域一个非常重要的分支,在各个应用方向发挥了很大的作用。相对于传统机器学习,对于特征工程要求的降低成了其核心优势。另一方面,深度学习对于大数据量,大规模算力的应用能力很强,也一定程度上提升了整体的产出效果。由于理论方面的研究稍显落后,深度学习在实际应用中对于使用者的经验技能要求相对比较高,需要有大量的实战经验才能达到比较理想的效果。这方面的学习资料推荐 Keras 作者的《Deep Learning with Python》,以及《Hands-on Machine Learning with Scikit-Learn and TensorFlow》,而在理论方面推荐著名的“花书”《Deep Learning》。在学习理论原理的基础上,尤其要注意在实际算法应用中,能够通过观察各种指标与数据分析,找到提升模型的操作改进方向。

  • 自我考核:能够在实际项目中,使用深度学习模型,达到接近甚至超过传统 GBDT 模型的精确度效果,或者通过 ensemble,embedding 特征方式,提升已有模型的精度。

领域建模

目前我们的业务领域在时间序列预测,自然语言处理,推荐等方面,其它类似图像,搜索,广告等领域也都有各自的一些领域建模方法。在时间序列领域,包括了传统时序模型,如 ARIMA, Prophet,机器学习模型,如划动窗口特征构建方法结合 LightGBM,及深度学习模型,例如 LSTM,seq2seq,transformer 等。这方面可以参考 Kaggle 上相关比赛的方案分享,以及 Amazon,Uber,天猫等有类似业务场景公司的分享资料。其它领域也是类似,通过了解历史技术演进,相关比赛,业界的方案分享与开源项目,会议论文来逐渐掌握学习建模方法,结合实际业务进行实践尝试,积累起更加体系性的个人知识技能。

  • 自我考核:在项目中复现一个 Kaggle 获胜方案,检验其效果,分析模型表现背后的原因,并尝试进行改进。

算法框架

数据处理框架

在项目实施过程中,会需要各类复杂的数据处理操作,因此熟练掌握此类框架就显得尤为重要。目前行业的标准基本上会参照 Pandas DataFrame 的定义,在数据量较大的情况下,也有许多类似的框架,如 Spark,Dask,Modin,Mars 等支持分布式运行的 DataFrame,以及 cuDF,Vaex 等提升单机性能的改进实现。这方面经典的书籍可以参考 Wes McKinney 的《Python for Data Analysis》,在掌握基础数据操作的基础上,可以进而了解窗口函数,向量化性能优化等高级话题。另外 SQL 也可以做非常复杂的数据处理工作,有不少公司例如阿里会以 SQL 为主来构建数据处理流程,感兴趣的同学也可以学习一下 SQL 中各种高级计算的使用及优化方法。

  • 自我考核:在已有项目中,能把至少三个使用 apply 方法的 pandas 处理修改成向量化运行,并测试性能提升。使用 window function 或其它方案来实现 lag 特征,减少 join 次数。

机器学习框架

机器学习方面的新框架层出不穷,一方面我们需要掌握经典框架的使用方式,理解其模块构成,接口规范的设计,一定程度上来说其它新框架也都需要遵循这些业界标准框架的模块与接口定义。另一方面对于新框架或特定领域框架,我们需要掌握快速评估,上手使用,并且做一定改造适配的能力。一些比较经典的框架有:

  • 通用机器学习:scikit-learn,Spark ML,LightGBM
  • 通用深度学习:Keras/TensorFlow,PyTorch
  • 特征工程:tsfresh, Featuretools,Feast
  • AutoML:hyperopt,SMAC3,nni,autogluon
  • 可解释机器学习:shap,aix360,eli5,interpret
  • 异常检测:pyod,egads
  • 可视化:pyecharts,seaborn
  • 数据质量:cerberus,pandas_profiling,Deequ
  • 时间序列:fbprophet,sktime,pyts
  • 大规模机器学习:Horovod,BigDL,mmlspark
  • Pipeline:MLflow, metaflow,KubeFlow,Hopsworks

一般的学习路径主要是阅读这些框架的官方文档和 tutorial,在自己的项目中进行尝试使用。对于一些核心接口,也可以阅读一下相关的源代码,深入理解其背后的原理。

  • 自我考核:在 LightGBM 框架下,实现一个自定义的损失函数,并跑通训练与预测流程。

其它框架

其它比较常见且与算法工程师日常工作会有一些联系的有 Web 框架,爬虫框架等,*具有代表性的当属 Flask 和 scrapy。这两者背后各自又是很大一块领域,尤其 web 开发更是保罗万象。感兴趣的同学还可以了解一下一些新兴的基于 Python3 的框架,例如 FastAPI,其背后借鉴的许多现代框架的思想设计,包括数据验证,序列化,自动文档,异步高性能等,开拓一下知识面。

  • 自我考核:实现一个简单的 model serving http 服务。

算法工程交叉

大规模算法运行

分布式训练

在很多项目中,数据量达到十亿级以上的情况下,单机训练会难以支撑。因此分布式训练也是实际工程落地中非常重要的一个主题。分布式训练涉及到多机的通讯协同方式,优化算法的改造,数据及模型的并行与聚合,以及框架的选择和运维等话题,具体可以参考《分布式机器学习》。另外对于分布式系统,也可以参阅《数据密集型应用系统设计》这本神作,了解其背后原理。

  • 自我考核:能够在多机上进行亿级数据的 GBDT 模型训练与预测。

高性能计算

在做大规模的数据训练与推理时,近些年涌现出许多高性能计算优化的方法,例如从硬件方面,有各种超线程技术,向量化指令集,GPGPU,TPU 的应用等,从软件方面,有针对数值计算场景的 OpenBLAS,有自动并行化的 OpenMP,有各种 codegen,JIT 技术下的运行时优化等。这方面可以学习的方向也很多,从基础的并行编程,编译原理及优化的知识开始,到 CUDA,OpenMP 的应用(例如 Nvidia 的 cuDNN,还有 LightGBM 中也用到了 OpenMP),Codegen,JIT 等技术在 Spark,TVM 等项目中的使用等,建议有深度性能优化需求时可以往这些方向做调研和学习。

  • 自我考核:能够通过 LLVM JIT 来优化实现 Spark window function 的执行性能。

模型加速领域

这个方向分两个部分,一块是模型训练方面,能够做到加速,例如使用大 batch size,迁移学习,持续的在线 / 增量学习等手段,另一块在模型预测方面,也有很多加速需求,比如模型参数量优化,模型压缩,混合精度,知识蒸馏等技术手段,都是为了做到更高性能,更低资源消耗的模型预测推理。这方面业界有各个方向的文章和技术实现可以参考,比如经典的《Training ImageNet in 1 Hour》,MobileNet,TensorRT,二值网络等。

  • 自我考核:在典型的销量预测场景中实现增量训练与预测。

MLOps

编排调度

包含各类 pipeline 的编排与调度能力的支持,包括数据 pipeline,训练 pipeline 和 serving pipeline 等。这方面比较常用的框架工具有 Airflow,DolphinScheduler,Cadence 等,需要掌握其基本的工作原理和使用方式,并能够应用于离线实验与线上运行。

  • 自我考核:使用 Airflow 完成一个标准的项目 pipeline 搭建与运行。

数据集成

相对于传统的 DevOps,机器学习项目*大的区别在于数据方面的依赖会更加显著与重要。这方面的话题包括数据血缘,数据质量保障,数据版本控制等,有各类工具可以借鉴使用,例如数据版本管理方面的 DVC,数据质量方面的 TFX Data Validation,Cerberus,Deequ 等。在方法论层面,《The ML Test Score》中给出了不少数据相关的具体测试方法,值得参考学习。

  • 自我考核:在项目中实现输入数据的分布测试,特征工程测试及特征重要性准入测试。

实验管理

这部分也是 ML 项目的独特之处,在开发过程中有大量的实验及相应的结果输出需要记录,以指导后续调整优化的方向,并选择*优结果来进行上线部署。这方面可以参考的项目有 MLflow,fitlog,wandb 等。当然对于单独的项目来说,可能 online Excel 就能满足需求了 🙂

  • 自我考核:在实际项目中实行一套标准的实验记录手段,并能从中找出各类实验尝试带来的精度提升的 top 5 分别是哪些操作。

Serving

目前我们的 serving 大多数是离线 batch 预计算的形式,所以主要依赖的技术手段是各类离线 inference 的方法,例如直接使用 model predict 接口,使用 mmlspark 等做大规模并行 inference 等。如果涉及到在线 serving,情况会更加复杂,例如在线 pipeline 的运行,实时特征获取,low latency/high throughput 的 serving 服务等,可以参考 TF Serving,MLeap,H2O,PredictionIO,PMML/PFA/ONNX 等开发标准模型格式等。

  • 自我考核:部署一个实时预测服务,能够根据用户输入产生相应的预测结果。

CI/CD

软件工程中的持续集成,持续部署已经成为一种标准实践,在算法项目中,额外引入了数据这个维度的复杂性,带来了一些新的挑战。在这个方向上,几个主要话题包括自动化测试,pipeline 打包部署,持续监控运维等,可以参考 Martin Fowler 关于 CD4ML 的文章。工具系统层面,可以学习传统的 Jenkins,也有一些新选择例如 CircleCI,GoCD,VerCD(Uber)等。

  • 自我考核:通过 Jenkins 实现 pipeline 自动测试,打包,上线流程。

系统监控

在整个项目上线后,需要对系统的各个环节进行监控,并对各种异常情况作出响应。例如输入数据的监控,判别测试数据与训练数据的分布是否有偏移,整个运行 pipeline 的监控,判别是否有运行失败抛出异常的情况,对于预测输出的监控,确保没有异常的预测输出值,也包括对于系统计算资源等方面的监控,确保不会因为资源不足导致业务受到影响等。在监控信息收集,基础上,还需要配套一系列的自动告警通知,日志追踪排查等。这方面的工具框架包括 TF data validation 这类专门针对算法项目的新产品,也有 elasicsearch + kibana 这类传统产品。

  • 自我考核:将三个项目中做过的问题排查改造成常规监控手段,支持自动的问题发现,告警通知,如有可能,提供自动化或半自动化的问题排查解决方案。

MLOps 系统

MLOps 整体是一个比较大的话题,在这方面有很多产品和系统设计方面的实践可以参考学习。例如 Uber 的 Michelangelo 系列文章,Facebook 的 FBLearner,neptune.ai,dataiku,domino 等,虽然没有开源,但是其背后的很多设计理念,演进思考,白皮书等都非常值得我们学习。在开源界也有很多可以参考的项目,例如 MLflow,Kubeflow,Metaflow,TFX 等,可以学习他们的设计理念,Roadmap,以及实现细节等。

  • 自我考核:总结各个 MLOps 产品的功能模块矩阵对比,能够根据项目需求来进行产品选型与使用。

工程深入方向

数据库

数据库原理

在平时工作中,我们有大量的场景需要用到数据库。从客户数据的对接,数据集的管理和使用,到各种业务系统的数据表设计及优化等,都需要对数据库的运作原理,适用场景,运维使用,性能优化等方面有一定的了解。常见的需要掌握的概念有 OLTP vs OLAP,事务,索引,隔离级别,ACID 与 CAP 理论,数据同步,数据分片,SQL 语法,ORM 等。从底层原理看,会涉及到数据,索引,及日志等存储引擎方面,以及各种计算查询引擎,包括分布式系统的设计与实现。这方面推荐的学习资料有《数据库系统内幕》及《数据密集型应用系统设计》。

  • 自我考核:能够理解 SQL 执行计划,并能够根据执行计划来做索引或查询调优。

关系型数据库

目前常用的关系型数据库主要是 MySQL 和 PostgreSQL,主要需要掌握的是日常的一些 SQL 操作,例如 DML(增删改查),DDL(创建表,修改索引等),DCL(权限相关)。在此基础上还可以进一步了解一些如数据类型,高级计算,存储引擎,部署运维,范式概念与表结构设计等方面的话题。对于高级话题这块,推荐《高性能 MySQL》与《高可用 MySQL》。

  • 自我考核:在 MySQL 中设计相关表结构,存储实际项目中的一系列中间数据集。

NoSQL 数据库

常用的 NoSQL 数据库有几类,KV 存储(Redis),文档数据库(MongoDB),Wide-column 存储(Cassandra,HBase)以及图数据库(Neo4j)。在目前我们的算法项目中,比较有可能会用到的主要是 Redis 这类 KV 存储(也可能把 Cassandra 之类当泛 KV 来用),或者更新一点的类似 Delta Lake 的存储系统。建议学习了解一下这类 KV 存储,以及分布式数据库的常见操作方式,以及基础的运维排查,性能优化方法。

  • 自我考核:考虑一个线上模型服务的场景,用户输入作为基础特征,使用类似 Redis 的 KV 系统,实现实时获取其它特征,并进行模型预测。

云计算

基础架构

IT 系统总体的发展趋势在往云计算方向演进,即使是自建的基础设施,也会采用云计算的一套构建方式,让开发者不用过多的关注底层计算存储资源的部署运维。对于应用开发者来说,需要了解一些基础架构方面的知识,例如各类虚拟化及容器技术,配置管理,容器编排等,便于在日常工作中使用相关技术来管理和发布应用。从工具层面看,Docker 与 k8s 等技术发展速度较快,主要还是根据官方文档来学习为主。浙大之前出版的《Docker – 容器与容器云》一书中有一些更深入的话题的探讨,另外《Kubernetes in Action》中也值得一读。从方法论层面看,《Infrastructure as Code》和《Site Reiliability Engineering》是两本非常不错的学习资料。与算法应用结合的虚拟化,运维,持续集成等都是比较新的领域,需要我们探索出一条可行路线。

  • 自我考核:对于已有的算法项目,总结制定一套开发,测试,发布,运维的标准流程,且尽可能自动化执行。

分布式存储

前些年*流行的分布式存储是脱胎于 Google 经典的 GFS 论文实现的 HDFS,不过随着硬件技术的发展,计算存储分离思想的逐渐兴起,不但灵活性更高,成本更低,且各自架构的复杂度也大大降低了。因此目前更建议学习简单的 object store 形式的分布式存储,例如 s3,minio 等。在此基础上的一些存储系统,例如 Delta Lake,提供了事务,高效的 upsert,time travel 等功能,也值得关注与学习。原理方面,还是推荐《数据密集型应用设计》这本。

  • 自我考核:在项目中实现不同机器能够访问同一个 s3 路径的文件,并进行正常的数据读写,模型文件读写等功能。

分布式计算

大数据时代的分布式计算的鼻祖来自于 Google 经典的 MapReduce 论文,后续在 Hadoop 系统中做了开源实现,在前几年是非常火热的一项技术。目前业界的主流是 Spark 和 Flink,前者在批处理计算中处于霸者地位,后者是流处理领域的*者。目前我们的业务应用中,Spark 是比较常用的分布式计算引擎,其基本操作相关内容比较简单,参考官方文档或者《Spark 快速大数据分析》即可。后续的主要难点会有大数据量下的问题排查与性能调优,执行复杂计算或与 Python 相关 UDF 的交互配合方式等。这方面需要对 Spark 的系统架构,内部原理有一定了解,例如 master,worker,driver,executor 等之间的关系,lazy evaluation,DAG 的 lineage 与 stage 概念,shuffle 优化,wholestage codegen 等技术细节。这方面暂时没有找到比较好的资料,主要还是依赖实际问题解决的经验积累。

  • 自我考核:用 Spark 来实现项目中的特征工程,并在一定数据量情况下取得比单机 Pandas 更好的性能效果。

其它话题

其它云服务基础设施还包括分布式数据库,消息队列,zk/raft 分布式协作系统,虚拟网络,负载均衡等。这些话题离算法应用方面会比较远一些,基本上达到遇到需求时会使用的能力即可,在这里不做展开。

算法深入方向

AutoML

超参优化

自动化机器学习中比较传统的一块是超参数优化,进而可以推广到整个 pipeline 的超参优化,包括数据预处理,特征工程,特征选择,模型选择,模型调优,后处理等部分。目前业界应用比较广泛的技术手段主要是随机搜索,贝叶斯优化,进化算法,Hyperband/BOHB 等,在特征工程方面有 Featuretools,tsfresh,AutoCrossing 等自动化特征工程工具。学术界有一些进一步的探索研究,包括 multi-fidelity 优化,多任务优化,HPO 结合 ensemble learning,pipeline planning,data diff 自动数据分布探测等方面。可以参考 http://automl.org 上的各类参考资料与书籍进行学习了解。主要难点包括 automl 算法的泛化能力,scalability,整体 pipeline 组合的搜索与生成,针对不同学习算法的自动优化手段等。

  • 自我考核:了解超参优化的基础概念,能够在项目中应用框架工具来实现模型超参的贝叶斯优化流程。

元学习

Meta learning 是近年来非常活跃的一个新兴领域,其主要思路是希望能通过元学习模型方法,去积累建模调优的先验知识,跨任务推断模型效果并 warm start 新的训练任务,或者指导学习算法来进行更高效的具体任务的训练过程。这方面在工业界的主要应用基本上集中在建模调优先验知识的积累方面,比如通过一系列公开数据集搜索寻找出表现较好的起始参数,用于指导在新任务上做超参优化的起始搜索点。学术研究中除了 configuration space 的研究,还包括从 learning curve 中进行学习推断,元特征提取与建模,HTN planning 在 pipeline 构建中的应用,以及 MAML 等 few-shot learning 方向的探索。这方面推荐 Lilian Weng 的一系列文章(https://lilianweng.github.io/lil-log/2018/11/30/meta-learning.html),以及 http://automl.org 网站上的资料。

  • 自我考核:设计一系列 meta feature 与 meta learning 手段,实现对新任务的参数选择的初始化。

NAS

AutoML 领域比较火,但也是比较特别的一个方向,目前需要大量的计算资源投入才能做这方面的研究与尝试,因此主要建议了解一下这个方向的一些工作即可,不做深入探索学习。

AutoML 系统

自动化机器学习相关的框架工具也非常多,比较有代表性的框架有 auto-sklearn(来自 http://automl.org 团队),nni(microsoft),auto-gluon(amazon),H2O,ray tune 等,在工具级别也有如 hyperopt,SMAC3,featuretools 等。可以通过学习这些工具框架,了解 AutoML 系统的架构与实现方式,并应用到实际项目中。

  • 自我考核:使用一种 AutoML 系统来进行项目的模型自动优化,并与手工优化的结果进行比较,看是否有所提升,及寻找背后的原因。

模型解释

模型解释技术

主要有三个方面,一是模型本身的解释性,例如线性回归,决策树等,模型结构简单,根据其原理,可以直接对预测结果,特征使用等方面给出解释。另外一些复杂模型,例如 EBM,神经网络,Bayesian rule lists,SLIMs 等,也可以利用一些本身的特性给出一些解释,例如 GradCAM 方法等。二是模型无关的解释方法,包括经典的 PDP,ICE 等特征图,LIME 等 surrogate model 方法,以及基于博弈论的 Shapley 方法。三是基于 sample 的解释方法,例如 conterfactual explanations,adversarial examples,prototypes,influential instances,kNN 等,不过看起来这类方法对于计算的开销一般都会比较大,不太容易在工程中实现落地。这方面的资料可以学习《Interpretable Machine Learning》和《Explainable AI》(关于深度学习的内容会更多)。另外学术界也有很多前沿探索,比如针对模型解释的降维工作,自动的时间序列分析及报告生成,因果模型,模型公平性及社会影响等方面,可以保持关注。

  • 自我考核:理解 LIME,Shapley 的运作原理,并分析其局限性,尝试提出改进方案。

模型解释应用

从工具框架方面,有许多可以使用的开源项目,例如微软的 interpret,eli5,shap,AIX360 等。另外也有一些非传统意义上的模型解释,例如 manifold,tensorboard 这类模型 debugging 工具,自动化的误差分析与模型改进方案,因果模型框架,模型公平性评估与纠正工具等,都可以涵盖在广义的模型解释领域中。在工具基础上,如何结合业务领域知识,给出更有针对性的解释方案,也是值得思考深挖的方向。

  • 自我考核:使用 shap,eli5 等工具来进行模型解释,并在此基础上形成面向开发者的模型 debug,误差分析及改进方案,或形成面向业务的 what-if 分析看板。

总结

目前机器学习应用领域还在高速发展与演进过程中,除了上述提到的技能方向,后续很可能会不断有新的主题引入进来,需要练就快速学习并应用落地的能力。在掌握前面编程,软件工程,机器学习的基础上,后半部分的研究方向,大家可以根据个人兴趣,选择几个进行深入探索与实践。仅阅读相关书籍和文章,只能对知识内容有一个初步的认识,必须要通过深入的动手实践,反复试错思考和修正,才能逐渐内化为自己的技能,并构建起较为坚实的知识体系。

原文链接:https://zhuanlan.zhihu.com/p/192633890

云计算的应用领域有哪些?

云计算与大数据、人工智能是当前*火爆的三大技术领域,近年来我国政府高度重视云计算产业发展,其产业规模增长迅速,应用领域也在不断的扩展,从政府应用到民生应用,从金融、交通、医疗、教育领域到人员和创新制造等全行业延伸拓展。

云计算将在IT产业各个方面都有其用武之地,以下是云计算十个比较典型的应用场景!

1. IDC云

IDC云是在IDC原有数据中心的基础上,加入更多云的基因,比如系统虚拟化技术、自动化管理技术和智慧的能源监控技术等。通过IDC的云平台,用户能够使用到虚拟机和存储等资源。还有,IDC可通过引入新的云技术来提供许多新的具有一定附加值的服务,比如,PaaS等。现在已成型的IDC云有Linode和Rackspace等。

2. 企业云

企业云对于那些需要提升内部数据中心的运维水平和希望能使整个IT服务更围绕业务展开的大中型企业非常适合。相关的产品和解决方案有IBM的WebSphere CloudBurst Appliance、Cisco的UCS和VMware的vSphere等。

3. 云存储系统

云存储系统可以解决本地存储在管理上的缺失,降低数据的丢失率,它通过整合网络中多种存储设备来对外提供云存储服务,并能管理数据的存储、备份、复制和存档,云存储系统非常适合那些需要管理和存储海量数据的企业。

4. 虚拟桌面云

虚拟桌面云可以解决传统桌面系统高成本的问题,其利用了现在成熟的桌面虚拟化技术,更加稳定和灵活,而且系统管理员可以统一地管理用户在服务器端的桌面环境,该技术比较适合那些需要使用大量桌面系统的企业。

5. 开发测试云

开发测试云可以解决开发测试过程中的棘手问题,其通过友好的Web界面,可以预约、部署、管理和回收整个开发测试的环境,通过预先配置好(包括操作系统,中间件和开发测试软件)的虚拟镜像来快速地构建一个个异构的开发测试环境,通过快速备份/恢复等虚拟化技术来重现问题,并利用云的强大的计算能力来对应用进行压力测试,比较适合那些需要开发和测试多种应用的组织和企业。

6. 大规模数据处理云

大规模数据处理云能对海量的数据进行大规模的处理,可以帮助企业快速进行数据分析,发现可能存在的商机和存在的问题,从而做出更好、更快和更全面的决策。其工作过程是大规模数据处理云通过将数据处理软件和服务运行在云计算平台上,利用云计算的计算能力和存储能力对海量的数据进行大规模的处理。

7. 协作云

协作云是云供应商在IDC云的基础上或者直接构建一个专属的云,并在这个云搭建整套的协作软件,并将这些软件共享给用户,非常适合那些需要一定的协作工具,但不希望维护相关的软硬件和支付高昂的软件许可证费用的企业与个人。

8. 游戏云

游戏云是将游戏部署至云中的技术,目前主要有两种应用模式,一种是基于Web游戏模式,比如使用JavaScript、Flash和Silverlight等技术,并将这些游戏部署到云中,这种解决方案比较适合休闲游戏;另一种是为大容量和高画质的专业游戏设计的,整个游戏都将在运行云中,但会将*新生成的画面传至客户端,比较适合专业玩家。

9. HPC云

HPC云能够为用户提供可以完全定制的高性能计算环境,用户可以根据自己的需求来改变计算环境的操作系统、软件版本和节点规模,从而避免与其他用户的冲突,并可以成为网格计算的支撑平台,以提升计算的灵活性和便捷性。HPC云特别适合需要使用高性能计算,但缺乏巨资投入的普通企业和学校。

10. 云杀毒

云杀毒技术可以在云中安装附带庞大的病毒特征库的杀毒软件,当发现有嫌疑的数据时,杀毒软件可以将有嫌疑的数据上传至云中,并通过云中庞大的特征库和强大的处理能力来分析这个数据是否含有病毒,这非常适合那些需要使用杀毒软件来捍卫其电脑安全的用户。

以上是云计算的十大应用场景,随着云计算的发展,其应用范围不断拓展,相信,在不久的将来会有更多的应用形式的出现!
————————————————

原文链接:https://blog.csdn.net/lmseo5hy/article/details/79625745

5G是新基建的大机会?还是堵点呢?

前不久,前财政部长楼继伟在中国经济50人论坛研讨会上,分析“双循环战略”中,“国内大循环”的堵点时表示:“基础设施适度超前是必要的,但有些方面过度超前,抬高了用户成本或不可持续的公共部门债务。现有5G技术很不成熟,数千亿级的投资已经布下,而且运营成本*高,找不到应用场景,今后消化成本是难题。” 此事引发了热烈的讨论,楼继伟部长被称为公开发对5G建设*人。那么5G到底是新基建的热点机会,还是个坑呢?

%title插图%num

首先从目前财务状况来看,4G网络覆盖全面完成和网络优化也基本完成,运营商进入投资回收期,2019年中国移动收入为7459亿元,折旧及税前利润为2960亿元,折旧摊销为1828.18亿元,净利润为1066亿元,为了改善财务报表,将4G无线资产的折旧由5年改为7年,证明4G网络这么金额巨大的折旧摊销,中国移动都有点吃不消,会影响每年的净利润情况,所以4G的回收周期被迫拉长,如果我们现在大规模上马5G,将带来巨大的财务压力,经营情况*好的中国移动尚且如此,其它几大运营商可想而知。

%title插图%num

从投资成本角度考虑,5G需要更密集的覆盖,目前我国城镇化率高,土地更贵,新建基站面临高成本的问题,有俄罗运营商就发声5G在20年内很难回本。

%title插图%num

从运营成本角度来看,更密集的基站,更快的速率,意味着更高的能耗,运营商工作的网友提供了数据,5G每年将要用掉4200亿元的电费,这是三大运营商年收入的三分之一。

%title插图%num

从应用场景来看,目前4G基本满足现有移动互联网的需求,当然在云游戏,云VR,万物互联时代5G将是更好的选择,但是目前来看这些应用场景还没有特别成熟的商业模式,所以5G的应用,也需要相应的应用场景的成熟。

综上,5G建设将给运营商带来沉重的财务和运营负担,从运营商正常的商业角度来看他们大规模建设5G的积*性应该不会太强。

 从国家整体战屡来看,5G是拉动我国ICT上下游产业发展*佳抓手,我国企业在5G领域积累了大量专利技术,5G的蓬勃发展,能够促进我国在通信技术领域的*优势,但是只有成功的商业模式才能助推产业持续的成长,没有正常的投资回报,高投资、高成本、高补贴的模式很难持续。

所以,5G的产业政策与方向将考验我国信息产业决策层的智慧和勇气,我们拭目以待。

传统架构与云架构_3大流行后云架构趋势

传统架构与云架构

根据分析公司Canalys的数据,2019年全球组织在云计算基础设施即服务上的支出达到创纪录的1070亿美元,比上年增长37%。 甚至在大流行之前,几乎所有公司都在跟踪更高的云计算销售。 但是,大多数云行业分析师预测,大流行后将在公共云服务上运行。

目前,在危机期间,大多数企业都属于以下一种普遍的运营模式:

那些处于保持状态将不会对任何费用,直到他们得到全部清除IT相关的项目。 此类别包括大多数大中型企业。 许多项目都处于暂停状态,这种普遍的延迟可能会再次困扰他们。

当前与大流行相关的限制使在紧急模式下运行的业务部分或全部被禁用。 此类别中的示例包括餐馆,酒店,游轮和许多小型店面。 他们将资源转移到较短的快速修复项目上。 如果没有良好的整体规划,可能会发生这些修复,因此将做出一些错误的决定,这些错误需要在以后进行纠正。

*终,有些会继续以正常模式运行 ,而大多数时间都是照常营业。 这将包括那些员工在大流行之前在自给自足的家庭式场所工作的企业,例如IT顾问和员工,艺术家和手Craft.io者,以及其他可以远程完成的基于服务的企业。

无论您现在所处的模式如何,当我们到达大流行的另一端时,情况都会改变。 以下是三种很可能会成为焦点的云架构模式:

  • 无服务器的一切。 无服务器计算从一个好主意变成了一个奇妙的主意。 无需调整服务器大小并使其在线(与存储相同)。 大多数公共云提供商现在可以为容器,数据库和人工智能提供无服务器计算。 大流行后世界的好处是部署速度和变更速度,这意味着您创建了一个专为变更而设计的架构。
  • 联合安全。 通常,鉴于云资源和应用程序的分布式性质,IAM(身份访问管理)是实现云计算安全性的*佳方法。 分布式资源的集中安全管理是一个新兴的概念,它已经到来了。 联合安全性涵盖所有计算和存储资源,以及所有设备和人员。 无论需要多少资源来适应新的市场机会或全球危机,这种方法都将大步向前。 这将是前进的更好方法。
  • 分布式容器。 您已经听说过使用容器编排技术(例如Kubernetes)的容器和群集容器。 什么是分布式容器? 它是独立运行或在集群中运行的容器联合,具有在任何地方(无论是否在云中)运行这些容器的能力。 再次,我们正在寻找灵活性,以使我们摆脱未来的麻烦。 您可以更快地将处理从一个云转移到另一个云,或者从数据中心转移到云,在危机期间您拥有更多的选择。

危机之前和之后的计划都归结为常识。 在过渡期间,没有为云计算上的大流行后运行做好准备或至少没有做好准备的企业将在混乱或危机模式下运行。 您可能会遇到云提供商的服务短缺问题,因为云提供商难以获得必要的硬货和员工来应对大流行后的需求激增。

如果您现在可以采取一些防御措施来研究无服务器,联合安全性和分布式容器的选项,那么当生活恢复到新的正常水平时,您的云配置和选择将更容易实现。

战疫内外,京东智联云如此“一鸣惊人”!

鼠年春节,一场疫情突如其来地打破了人们平静的生活;但在滨州,一款名为“疫情助手”的上线软件却为滨州市民的疫情生活带来“雪中送炭”的丝丝温情,细微知著中人们深深感受到了京东诠释而来的“ABCDE”技术战略以及那股子科技力量背后的温暖人心。

%title插图%num

滨州市一位公务人员展示“疫情助手”
疫情之内,京东释放科技力量温暖人心
据晶少了解,这款“疫情助手”全名为“疫情助手智能机器人咨询平台”,作为京东自主研发的智能情感客服系统,其主要依靠NeuHub京东人工智能开放平台提供的语义理解、句法分析等能力,就可通过问题预判、意图反问、分类识别、相似度匹配等多种方法探索出用户的准确意图,并根据问题类型,智能匹配出*佳的解决方案。

在滨州抗疫过程中,该产品历经多重场景、用户、数据的锤炼,通过提供实时疫情查询、专业医生服务、就医指南、发热门诊医院查询等功能高效协助当地政府、医疗单位遏制灾情,提供了有效的技术支撑。

同样的抗疫惊喜还出现在千里之外的广西南宁。一样在疫情期间,京东智能疫情产品在南宁“爱南宁”APP和微信端落地被应用,超过千万市民只需从疫情专区进入“应急资源信息发布”,就可以在“智能疫情助理”模块中选择相应服务。

据悉,这款京东“智能疫情助理”产品源于京东智联云打造的通用智能对话平台,可以根据不同行业、不同场景的需求,快速搭建出融合行业理解、支持多轮交互、具备情感能力的对话产品,具有场景化快速落地与快速调优能力,目前累计服务咨询量高达数近百万次。

%title插图%num

此外,基于京东智联云*的语音语义技术研发的同款智能疫情助理已经在北京、山东、安徽、江苏、江西、四川等地的十多个行业、一千余家组织和机构中快速落地,服务免费并累计服务咨询数量达数百万条,让人们在特殊时期充分感受到了技术的便利与科技的温度。

无论是智能疫情助理驰援抗疫前线武汉,还是携手浙江丽水开启“5G+AI”科技抗“疫”,抑或是全国十余城共同落地“京东智能温感筛查系统”,可以想见,疫情期间京东已充分做到广泛调动内部基于京东云平台、京东人工智能开放平台NeuHub、京东物联小京鱼智能服务平台的能力和资源,迅速向社会推出了应急资源信息发布与匹配平台、智能疫情助理、云视频会议、远程家庭医生服务等十余款免费产品和服务,为3000多个企业提供免费远程视频会议服务,保障数十万学生“停课不停学”,实现云上经营、云上办公等,截至2月28日已覆盖上万机构、数百万用户,匹配并提供抗疫物资超6.6亿件。

%title插图%num

疫情严峻,但京东的技术是有温度的。对此京东集团技术委员会主席、京东云与AI总裁周伯文表示,在疫情防控攻坚战中,京东智联云不断推出有温度的技术产品助力政府治理、企业经营、服务公众生活,彰显责任与担当。

疫情之外,京东一路技术向前、融合至上
放眼疫情科技背后,盘点京东一路坚持贯彻的“技术转型”,我们发现,其实早在2017年初,全面加速转型的号角就已然在其内部吹响:在日前发布的2019年第四季度及全年财报数据显示,京东全年净服务收入为662亿元人民币,同比大幅增长44.1%,总收入占比超过10%,如此说明什么问题?足见技术与服务正逐渐成为其增长的又一重要引擎。

除此之外,晶少得知,2019年京东体系所属上市及非上市企业合计研发投入达179亿元,研发投入同比增长高达47.8%,已跃升为对技术投入*多的中国企业之一,成绩表现着实可圈可点。具体来讲在云计算领域,截至2019年,京东云累计建基地及落地城市云超过40个,合作伙伴超过2500,注册用户超过69万,推出300+款产品与服务,实现100%云上订单,拥有全球*大规模Docker集群之一和中国*大的GPU集群之一。

另外在物联网技术领域,京东方面2014年就率先进行业务布局并发布*个自主研发,跨品牌,跨品类的智能家居互联互通平台。目前该智能家居互联互通平台可连接高质量设备突破1.5亿台,设备品类超230种,品牌超1000家,用户交互次数近20亿次。

如此发展,可以想见未来包括以安全、可信赖为核心差异化的基础云服务,以智能供应链为抓手的数字化、智能化产业互联网应用云服务,以边缘计算为代表的云、边、端协同的下一代智能云服务等在内的三个方向都势必成为主攻着力点。

深耕技术的同时,我们了解到目前恰逢互联网竞争已遁入下半场,人口红利正被2B企业服务(特别是技术服务)所取代;行业方面,随着AI、云计算等技术与IoT产业的融合,硬件与软件的协同趋势加剧,促使涉足2B领域的企业必须同时具备全产业链整合和供应链智能制造能力,从而覆盖全场景以及全品类。

在此背景下,作为一家以供应链为基础的技术与服务公司,京东技术战略强大之余走向融合实属必然,所以在趁热打铁之际,2019年12月京东集团再次加码对技术的投入,将原京东云、人工智能、物联网整合成为京东云与AI事业部,统一冠名为“京东智联云”品牌,并于2020年3月5日正式启用,技术融合释放更多价值,终成定局。

%title插图%num

着力解读新品牌内涵就会发现,总体来说LOGO所描绘的三种颜色分别代表了人工智能、物联网、云计算与大数据等多种前沿技术。对此京东集团技术委员会主席、京东云与AI总裁周伯文总结道,“京东智联云的品牌形象传承着京东‘红’,代表可信赖;搭配世界通用的科技‘蓝’,代表在京东价值观下对技术与创新的坚持;交互融合组成的无限符号‘ ∞’,代表互联互通的智联世界,也寓意更多不断发展变化的前沿科技。未来十年将是智能经济的时代,作为京东对外技术与服务输出的核心通道,将着力打造可信赖的智能技术,更好携手合作伙伴,始于信赖,胜于格局。”

就晶少理解,*简线条中 3个无限符号相互环绕交织,确实生动形象地表达了京东人工智能、物联网以及云计算融合形成的科技体系,未来将成为集团技术能力的统一输出窗口,但此种部门的整合、业务的合并以及品牌的融合*不仅仅是简单的“加法关系”,而是更多承载了“以人工智能(AI)为大脑、大数据(Big Data)为氧气、云(Cloud)为躯干、物联网(Device)为感知神经,以不断探索(Exploration)为好奇心”的京东技术“ABCDE”战略的有机体,以此为基础提供可信赖与高效率的前沿科技服务,为G(政府)、B(企业)、C(个人)端用户提供包括从基础资源到智能应用等各类产品与服务才是核心所在。

AI、云计算、 IoT的业务整合是技术发展的需要,也是“集中力量办大事”的考量,能够具备提供一站式、生态化技术解决方案的能力才更有助于将自身全面深厚的技术积累转化为技术势能,对内释放并对外赋能,正所谓“融合技术、释放价值、整合优势,输出一体化解决方案”就是这个道理。

技术融合在前,帮助用户补齐产业要素、实现产品创新、推进产业转型升级紧随其后,不容割裂。基于新品牌的着力打造,面对企业伙伴甚至是智能化初期企业,京东智联云未来想必会大力整合云、AI、IoT技术和产品,打造安全、可信赖差异化的基础云服务,共同进行产品技术创新和打磨。另外对于开发者而言,全新组合的京东智联云则是一个平台、技术与工具的乐园。稳定、丰富、高效、开放的特点让开发者尽情施展才华,开“箱”即用,部署成本低是常态。如今以NeuHub为核心载体的新一代智能供应链平台已成入选了科技部公布的智能供应链国家新一代人工智能开放创新平台,未来会让更多产业开发者受益匪浅。

%title插图%num

由简入深,技术以场景致胜,联接场景、赋能产业也是未来京东智联云内外赋能的重要一环。通过数字企业和数字政府两大主要场景,京东智联云协同打造零售、物流、金融、城市四朵云和强大丰富的生态平台,提供从底层资源到上层应用的全面服务,凭借自身在零售、物流、金融等领域多年深耕所积累的场景和技术优势,为客户提供更多、更好、更融合、更场景化的技术与服务,构建统一平台生态。想必此举也是助推内部技术能力、资源优势来搭建京东技术大中台,将技术势能通过技术中台对内释放和对外赋能的重要抓手之一。

回到行文*初,疫情之内我们看到了京东智联云携手宿迁联通、鸿联九五在江苏推出疫情防控外呼机器人公益活动;我们看到了京东智联云助力黑龙江省前进农场,在抗击疫情*艰难的时刻用技术短时间内帮助解决抗疫、生产物资供应等紧急问题;我们同时也看到了由京东智联云为海淀区政府定制部署,提供“应急物资、疫情动态、企业服务、市民服务”等多重服务,全面支持北京市海淀区应急防疫工作的诸多举措……这不正是京东通过可信赖的AI+云+端技术打造云智联世界,探索前沿科技,抵达真实生活,展望美好未来的集中展现吗?

疫情之外,如今越来越多的“智能”走入日常生活,随时随地享受数字经济时代带来的便捷渐渐演变成人们生活的主旋律。可以肯定的一点,未来品牌升级之后的京东智联云势必将大力联手各方,通过云、边、端提供丰富、稳定且易用的产品、服务与解决方案,将智能科技落地千万家,民之所想、技术所向。

如今智能经济时代已开启,消费者服务面临升级,企业技术服务的黄金机遇也已到来,我们相信品牌升级之后的京东智联云,未来定将一如既往,利用自身沉淀的能力洞察以及各产业场景中的实战经验,铸造更多“硬核”技术力量服务民生、技术报国,在一线。
————————————————

原文链接:https://blog.csdn.net/sch881226/article/details/104747505

Ivanti Neurons™神经元:远程边缘设备实现自主、自动、自助管理

打造可愈合的自主边缘(Autonomous Edge),让远程工作人员提前结合上下文,实现远程边缘设备的自助管理。

近日,致力于通过统一IT为企业用户提供更加高效安全数字化工作场所的Ivanti发布了基于深度学习技术的超级自动化平台——Ivanti Neurons™ 神经元。

该平台赋予企业自主愈合和保护边缘设备的能力,并重新诠释了为*终用户提供IT自助服务的理念。

通过一系列智能应用,*终用户可自主进行检测和修复边缘设备,企业IT团队的服务效率将获得大幅提升,管理成本显著减少。

目前,已采用Ivanti Neurons™ 神经元的企业可将意外停运时间减少63%,部署安全升级的时间缩短88%,并在用户上报之前解决多达80%的端点设备问题。

%title插图%num

Ivanti Neurons™神经元的全新上线,标志着Ivanti进一步实现其预见性和前瞻性,即打造超级自动化平台,帮助企业用户有效地应对日益繁复的设备、数据和远程工作人员的管理问题,以及层出不穷的安全威胁,助力企业IT管理从基础的自动化转型,走向成熟的超级自动化,为远程工作人员提供可愈合的自主体验,帮助其提前结合自身状况,实现远程边缘设备的自助管理。

Ivanti执行副总裁兼首席产品总监Nayaki Nayyar表示:“随着远程工作模式成为下一个常态,Ivanti Neurons™ 神经元不仅为企业提供了自主修复和保护端点设备的能力,还为员工提供了 ‘随时随地工作’的无缝体验。借助可自主检修和保护边缘端点设备的智能应用,IT部门将实现‘及早发现,及时解决问题’的工作目标。”

金斯顿大学技术服务负责人Daniel Bolton表示:“Ivanti Neurons™神经元提供主动式监测,让我们随时掌握各设备电池的使用情况及寿命,节省了大量资产采购和维修成本。而且,Ivanti Neurons™神经元能在短时间内为技术部门提供动态信息,帮助我们做出更合理的决策,确保在校员工和学生高效地完成工作及学习。”

Ivanti Neurons™超级自动化平台,可为企业及组织提供多项功能,包括:

· Ivanti Neurons™ for Edge Intelligence边缘设备智能化: 这项基于自然语言处理技术(NLP)的功能,将帮助IT团队快速查询所有边缘设备,在短时间内获取内部整体信息;它还拥有基于传感器的架构,可以帮助企业迅速了解边缘设备的运营环境,实时清点资产,并做好安全配置。

· Ivanti Neurons™ for Healing自我治疗:该功能可提供一系列智能应用,可主动检测、诊断和自动修复端点设备的配置问题、合规问题及安全问题,实现常规任务自动化,为打造真正的IT自愈合环境铺平道路,大大提升效率并缩减成本,改善用户体验。

· Ivanti Neurons™ for Discovery发现:该功能可在短时间内提供准确而实用的资产信息,通过主动扫描、被动扫描和第三方连接器,提供实时的可视化功能。这些规范化的软硬件资产清点数据、软件使用信息以及实用的洞察,有助于高效地配置管理数据库和资产管理数据库。

· Ivanti Neurons™ Workspace工作空间:该功能基于实时数据,提供了从设备、用户,到应用程序和服务的360度全方位视图,可帮助一线IT人员解决原本需要向专家上报的问题,消除问题上报带来的复杂性,同时缩短等待时间并降低上报成本,有助于加快解决*终用户的问题,大幅提高工作效率。

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速