阿里云数仓MaxCompute存取性能调研报告,内含纯手搓SQL生成器

告别虚拟机:在阿里云ECS(CentOS 7.9)上实战部署ArcGIS Enterprise 10.8完整指南 本文详细解析了在阿里云ECS(CentOS 7.9)上部署ArcGIS Enterprise 10.8的完整流程,涵盖资源规划、系统优化、组件配置及高可用架构设计。通过云端部署,企业可实现资源弹性伸缩、成本优化和全球加速等五大核心优势,提升GIS系统的性能和运维效率。 阅读详情

前言

前段时间公司给我安排了个任务,让我去测试一下阿里云DataWork下的MaxCompute的存取性能,这不,测试报告来了。

MaxCompute介绍

MaxCompute(ODPS)是适用于数据分析场景的企业级SaaS(Software as a Service)模式云数据仓库,以Serverless架构提供快速、全托管的在线数据仓库服务,消除了传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使用户可以经济并高效地分析处理海量数据。

MaxCompute适用于100 GB以上规模的存储及计算需求,最大可达EB级别,并且MaxCompute已经在阿里巴巴集团内部得到大规模应用。MaxCompute适用于大型互联网企业的数据仓库和BI分析、网站的日志分析、电子商务网站的交易分析、用户特征和兴趣挖掘等。

官方学习路线:www.alibabacloud.com/zh/getting-…

查询测试报告

测试方案一

多线程SQL查询

查询场景:

  • 单表查询,只查询单字段,共610万条数据(大约100MB)
  • 每次查询一万条,循环查询出所有数据(系统限制了只能一次查一万)

测试结果如下:

启动时间线程数花费时间
10:11203m10s
10:16302m28s
10:21501m37s
10:23701m9s
10:261001m3s
10:2720046s
10:2940044s
10:3050043s

由于这波操作属于IO密集型,故提高线程数可以有效的减少花费时间,提高到100-200时性价比应该是最高的。

核心代码:

    @Test
    public void test6() throws InterruptedException {
        // 查询code值
        String codeQuery = String.format("select distinct code from %s;", table);
        List<Map<String, Object>> list = MaxComputeUtil.queryData(codeQuery , true);
        log.info("获得code数据共{}条", list.size());
        // 建立线程池
        ThreadPoolExecutor pool = new ThreadPoolExecutor(20, 20, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<>(500));
        for (Map<String, Object> map : list) {
            String code = (String) map.get("code");
            pool.execute(new Test(code));
        }
        pool.shutdown();
        boolean awaitTermination = pool.awaitTermination(300, TimeUnit.SECONDS);
        if (!awaitTermination) log.warn("运行超时");
        log.info("执行完毕,所有数据,共{}条", Test.count);
    }

@Slf4j
class Test implements Runnable {

    public static long count = 0;

    private final String sql = "select code from table where code= '%s' and pt = 1;";

    private final String code ;

    public Test(String code) {
        this.code= code;
    }

    @Override
    public void run() {
        int now = 1;
        int size = 10000;
        int sum = 0;
        while (true) {
            List<Map<String, Object>> list = MaxComputeUtil.queryPageData(
            sum += list.size();
            if (list.size() < size) break;
        }
        log.info("运行完毕,共{}条数据", sum);
        count += sum;
    }

}

测试方案二

使用TableTunnel DownloadSession 进行数据下载

这个是官方推荐使用的批量传输通道,是一套可以查询数据和存入数据的SDK,可以用来代替SQL。

但是不知道为什么这个速度特别慢,总是卡在一个地方不动,一卡一卡的,一点也不流畅。

首先获取连接会话的时候,直接等了4分钟才连接上:

但是我同时去开启UploadSession进行数据上传,也没有像这样等待这么久,速度一般也就是一两秒,偶尔连接的时候会要10多秒。

我猜测可能是由于使用这个DownloadSession的客户端比较多,服务端资源提供不过来?或者是我们的网络和这个会话服务端的网络连接不通畅?连接上之后,每获取几条十几条数据就要等待一段时间,最终跑 118,064 条数据,花费时间13分钟,建议直接ban掉。

使用建议

使用方案一的多线程SQL查询,一次虽然只能查询一万条,但是多线程查询下速度还是可以接受的。

写入测试报告

首先我新建了一张表,表结构如下:

-- 此表结构取自官方文档:https://www.alibabacloud.com/help/zh/maxcompute/latest/use-the-maxcompute-client-create-tables#section-gwe-8vc-iwx
create table if not exists t_salary_write_test
(
    age             BIGINT comment '年龄',
    job             STRING comment '工作类型',
    marital         STRING comment '婚否',
    education       STRING comment '教育程度',
    credit          STRING comment '是否有信用卡',
    housing         STRING comment '是否有房贷',
    loan            STRING comment '是否有贷款',
    contact         STRING comment '联系方式',
    month           STRING comment '月份',
    day_of_week     STRING comment '星期几',
    duration        STRING comment '持续时间',
    campaign        BIGINT comment '本次活动联系的次数',
    pdays           DOUBLE comment '与上一次联系的时间间隔',
    previous        DOUBLE comment '之前与客户联系的次数',
    poutcome        STRING comment '之前市场活动的结果',
    emp_var_rate    DOUBLE comment '就业变化速率',
    cons_price_idx  DOUBLE comment '消费者物价指数',
    cons_conf_idx   DOUBLE comment '消费者信心指数',
    euribor3m       DOUBLE comment '欧元存款利率',
    nr_employed     DOUBLE comment '职工人数',
    fixed_deposit   BIGINT comment '是否有定期存款'
);

测试方案一

单线程,本地生成数据和SQL语句进行插入,每次插入一条数据,测试结果:

测试时间插入数据条数耗时
15:08201m52s
15:10528s
15:121048s

这个测不动,太慢了。。。时间都花在提交任务上去了,其实执行没花多少时间。

生成SQL的类

纯手搓,可以适用不同的表,主要是利用反射机制获取对象当中的字段和字段值,然后拼接成SQL语句。

需要注意对其中的特殊部分进行特殊处理,字符串之类的字段是需要添加引号的。

其实还可以再完善一下,把对象名进行读取,然后直接转化为表名,这样表名都不用传了。

实现了单数据插入和批量插入的生成方法。

package com.cfpamf.salary.integretion.maxcompute;

import com.cfpamf.salary.exception.HrmsSalarySeriousException;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.util.List;

/**
 * @author 阿杆
 * @version 1.0
 * @date 2022/9/1 14:58
 */
@Slf4j
public class SqlGenerateUtil {

    /**
     * 将对象和表名转为插入数据库的SQL语句,只能处理简单数据类型
     *
     * @param object    要插入的对象数据
     * @param tableName 表名称
     * @param partition 分区,需要带上字段名和符号,例如 pt=20220901
     * @return 转换后的SQL语句
     */
    public static <T> String insert(T object, String tableName, String partition) {
        String base = "insert into %s partition (%s) (%s) values(%s);";

        StringBuilder fieldNameBuilder = new StringBuilder();
        StringBuilder fieldValueBuilder = new StringBuilder();
        // 反射获取字段内容
        Field[] fields = object.getClass().getDeclaredFields();
        for (Field field : fields) {
            // 设置字段为可读
            field.setAccessible(true);
            try {
                // 字段名
                String fieldName = field.getName();
                // 字段值
                Object fieldValue = field.get(object);
                if (fieldValue == null) {
                    continue;
                }
                fieldNameBuilder.append(fieldName).append(',');
                // 字段值
                // 需要判断是否为字符串,或者其他跟字符串类似的,这一类需要添加引号
                if (fieldValue instanceof String) {
                    fieldValueBuilder.append('\'').append(fieldValue).append('\'');
                } else {
                    fieldValueBuilder.append(fieldValue);
                }
                fieldValueBuilder.append(',');
            } catch (IllegalAccessException e) {
                String massage = "insert SQL生成异常";
                log.error(massage);
                throw new SeriousException(massage, e);
            }
        }
        // 去除后面的多余逗号
        deleteLaseComma(fieldNameBuilder);
        deleteLaseComma(fieldValueBuilder);

        String format = String.format(base, tableName, partition, fieldNameBuilder, fieldValueBuilder);
        log.debug(format);
        return format;
    }

    /**
     * 生成批量插入数据的SQL语句
     *
     * @param list      要被插入的数据
     * @param tableName 表名称
     * @param partition 分区,需要带上字段名和符号,例如 pt=20220901
     * @return 生成的SQL语句
     */
    public <T> String batchInsert(List<T> list, String tableName, String partition) {
        if (list == null || list.size() == 0 || tableName == null) {
            throw new RuntimeException("参数异常,不能为null或长度为0");
        }
        // 基础SQL
        String base = "insert into %s partition (%s) (%s) values %s ;";
        StringBuilder fieldNameBuilder = new StringBuilder();
        StringBuilder fieldValueBuilder = new StringBuilder();
        // 先搞定字段名的部分,这部分是固定的,不需要进行多次拼接
        // 反射获取字段内容
        Field[] fields = list.get(0).getClass().getDeclaredFields();
        for (Field field : fields) {
            // 设置字段为可读
            field.setAccessible(true);
            // 字段名
            fieldNameBuilder.append(field.getName()).append(',');
        }
        // 删除最后的 ','
        deleteLaseComma(fieldNameBuilder);
        try {
            // 获取字段值
            for (Object o : list) {
                fieldValueBuilder.append('(');
                for (Field field : fields) {
                    Object fieldValue = field.get(o);
                    // 需要判断是否为字符串,或者其他跟字符串类似的,这一类需要添加引号
                    if (fieldValue instanceof String) {
                        fieldValueBuilder.append('\'').append(fieldValue).append('\'');
                    } else {
                        fieldValueBuilder.append(fieldValue);
                    }
                    fieldValueBuilder.append(',');
                }
                deleteLaseComma(fieldValueBuilder);
                fieldValueBuilder.append("),");
            }
            deleteLaseComma(fieldValueBuilder);
        } catch (IllegalAccessException e) {
            String massage = "barchInsert SQL生成异常";
            log.error(massage);
            throw new SeriousException(massage, e);
        }
        String format = String.format(base, tableName, partition, fieldNameBuilder, fieldValueBuilder);
        log.debug(format);
        return format;
    }

    /**
     * 剔除最后一个多余的逗号
     */
    private static void deleteLaseComma(StringBuilder builder) {
        final char comma = ',';
        int length = builder.length();
        if (length > 0 && builder.charAt(length - 1) == comma) {
            builder.deleteCharAt(length - 1);
        }
    }

}

测试方案二

多线程,每个线程都单独插入5条数据,测试结果:

测试时间线程数耗时
15:20225s
15:22532s
15:241029s
15:252042s
15:265052s
15:281001m30s
15:312002m59s
15:385009m32s

这个也测不动,太慢了。

测试方案三

使用官方SDK中的TableTunnel(UploadSession)进行批量传输(官方推荐),www.alibabacloud.com/help/zh/max…

以下是使用单线程的传输速度。

测试时间插入数据条数耗时
17:2410002.5s
17:24100003.3s
17:2910000012.4s

这速度就很快了,前面两种方案直接ban掉。

官方文档的解释是这种传输方式建议用在上传大量数据的场景(>64M)下进行使用,因为它里面需要构建一东西,比较消耗资源(这个说明具体的地方我找不到了,贴个大概位置的链接)

www.alibabacloud.com/help/zh/max…。

核心代码:

    @Test
    public void uploadSessionTest() {
        int count = 1000;
        TableTunnel.UploadSession uploadSession = MaxComputeUtil.getUploadSession(tableName, "pt=1");
        // 生成TunnelBufferedWriter的实例
        try (RecordWriter recordWriter = uploadSession.openBufferedWriter()) {
            for (int i = 0; i < count; i++) {
                // 创建一条新记录和新的待插入数据
                Record record = uploadSession.newRecord();
                BankData bankData = generateData(new BankData());
                // 把数据转换到 record 对象当中
                generateRecord(record, bankData);
                // 调用write接口写入数据。
                recordWriter.write(record);
            }
            // uploadSession提交,结束上传。
            uploadSession.commit();
            log.info("commit ok!");
        } catch (TunnelException | IOException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

数据填充:

    private <T> void generateRecord(Record record, T object) throws IllegalAccessException {
        // 通过反射
        Field[] fields = object.getClass().getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            record.set(field.getName(), field.get(object));
        }
    }

创建UploadSession的方法:

    public static TableTunnel.UploadSession getUploadSession(String tableName, String partition) {
        log.info("开始创建 UploadSession");
        // 创建TableTunnel
        TableTunnel tunnel = new TableTunnel(OdpsInstance.getInstance());
        // 需要指定的分区
        PartitionSpec partitionSpec = new PartitionSpec(partition);
        TableTunnel.UploadSession uploadSession;
        try {
            uploadSession = tunnel.createUploadSession(projectName, tableName, partitionSpec);
        } catch (TunnelException e) {
            throw new RuntimeException("创建 uploadSession 失败", e);
        }
        log.info("UploadSession 创建完毕");
        return uploadSession;
    }

测试方案四

使用SQL进行批量插入,将多条插入数据的SQL拼接成一条SQL(代码在上面方案一里),单线程运行。

测试时间插入数据条数耗时
10:1010009s
10:111000030.6s
10:16100000报错

测试十万记录的报错是因为SQL太长了,导致单次发送的HTTP请求数据量过大,造成数据异常。

性能比单数据插入的性能高上了很多,但相比于官方推荐的批量传输方式还是慢了很多。

使用建议

上传数据的话,如果数据量比较大(十万条数据以上),使用UploadSession进行上传是会比较好的,速度很快,如果数据量不大,那么使用批量上传的SQL也是完全可以的,虽然慢一点,但是可以减少很多不必要的资源消耗。

这两种方式都可以使用多线程来提高速度,速度会比上面测试的要更快。

后记

本篇文章主要是讲MaxCompute的存取性能如何,里面的代码都是只有核心部分的,完整的代码不方便贴。不过主要还是看它的性能如何,能达到什么样的存取速度。

最后不得不说,MaxCompute做的确实很不错了,几百万条数据全部取出来只要花一分钟不到的时间,存数据也可以达到10M/s(前提是你的网速达标)。

【信息科学与工程学】【数据科学】第一百二十二篇 大数据产品中的函数与算法01 它通常指。下面按照你给出的表格列💡 说明:下表中的"产品"以开源/主流商业组件为具象载体(Hadoop、Spark、Flink、Kafka、Hive、HBase、Iceberg、Atlas、Ranger、TensorFlow 等),它们共同构成一个完整的大数据产品家族;代码为实现示例,用于说明算法在工程系统中的落地方式。 阅读详情

相关推荐

保姆级教程:在K230开发板上为张大头步进电机实现位置、速度、回零全功能控制

本文提供了一份详细的K230开发板与张大头步进电机的控制教程,涵盖硬件连接、协议解析、模块化代码实现及实战案例。通过位置、速度和回零功能的全面讲解,帮助开发者快速掌握步进电机的高级控制技术,适用于自动化、机器人等应用场景。

weixin_42629671的博客 713

阿里云MaxCompute存取性能测试报告

前几天公司给我安排了个任务,让我去测试一下阿里云DataWork下的MaxCompute的存取性能,这不,测试报告来了。MaxCompute(ODPS)是适用于数据分析场景的企业级SaaS(Software as a Service)模式云数据仓库,以Serverless架构提供快速、全托管的在线数据仓库服务,消除了传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使用户可以经济并高效地分析处理海量数据。MaxCompute适用于100 GB以上规模的存储及计算需求,最大可达EB级别。

阿杆的博客 1730

Stata实战:用双向固定效应模型分析房价,从数据清洗到结果解读(附完整代码)

本文详细介绍了如何使用Stata实现房价数据的双向固定效应模型分析,从数据清洗到结果解读的全流程。通过具体代码示例,帮助读者掌握面板模型的应用技巧,特别适合经济学和金融学研究者进行房价影响因素分析。

weixin_31528001的博客 278

Hive/MaxCompute SQL性能优化(三):数据倾斜优化实战

前面介绍了如何定位数据倾斜,本文介绍如果遇到各种数据倾斜的情况该怎样优化代码。

王义凯 的博客 4997

稳定性性能系列之五——Native Crash深度分析:工具实战

深入理解Native Crash的机制与分析方法,掌握addr2line、ndk-stack、gdb等核心工具的实战使用,学会从Tombstone文件中快速定位问题根因

Cheson的专栏 1548

ERGM指数随机图模型全解析:从基础原理到R语言实操

从社交网络中的互惠、传递性和同质性等基本现象切入,介绍网络数据与传统回归分析的本质差异——边与边之间的依赖关系。指数随机图模型(ERGM)正是为刻画这种依赖结构而设计的统计框架,它通过指数族分布将网络结构效应显式建模,结合MCMC方法完成参数估计。ERGM在组织协作、传播扩散、生物生态等领域的应用日益广泛,其扩展模型TERGM、GERGM和多层ERGM进一步支持时序、权重与多重关系网络。本文系统梳理ERGM的理论基础、核心统计量、扩展模型选型及R语言实操要点,帮助研究者理解网络生成机制并完成收敛性诊断与结果

weixin_29050271的博客 365

基于MaxCompute的数仓数据质量管理

声明 本文中介绍的非功能性规范均为建议性规范,产品功能无强制,仅供指导。 参考文献 《大数据之路——阿里巴巴大数据实践》——阿里巴巴数据技术及产品部 著。 背景及目的 数据对一个企业来说已经是一项重要的资产,既然是资产,肯定需要管理。随着业务的增加,数据的应用越来越多,企业在创建的数仓过程中对数据的管理也提出了更高的要求,而数据质量也是数仓建设过程不容忽...

weixin_34023863的博客 550

华为[ENSP]OSPF的配置实例(单区域+多区域)

华为[ENSP]OSPF的配置实例(单区域+多区域)

weixin_62594100的博客 2万+

如何使用Tunnel SDK上传/下载MaxCompute复杂类型数据

基于Tunnel SDK如何上传复杂类型数据到MaxCompute?首先介绍一下MaxCompute复杂数据类型: 复杂数据类型MaxCompute采用基于ODPS2.0的SQL引擎,丰富了对复杂数据类型类型的支持。MaxCompute支持ARRAY, MAP, STRUCT类型,并且可以任意嵌套使用并提供了配套的内建函数。复杂类型构造与...

weixin_34324081的博客 262

PADS VX2.4 缝合孔(阵列过孔)的添加方法

缝合孔的主要目的是:①:增加底层和顶层的地铜皮的连接性,②:起到屏蔽外界信号干扰的作用。铺完铜后,右击空区域选择“选择形状”命令,选取整板中的一块大铜皮,右击选择“覆铜区域内过孔阵列模式”→“沿周边”指令后,再右击选择“覆铜区域内过孔阵列”,便能看到已选区域内添加的缝合孔(过孔阵列),也可以通过铜皮显示或隐藏的无模命令:PO进行查看。完成上面的“防止错误”和“过孔样式”的设置后,开始对整板进行铺铜处理,点击“工具栏”→覆铜平面指示器,在弹出的对话框点击“开始”,便能观察铺铜后的板子。

tianpu2320959696的博客 3065

实验二 离散控制系统的性能分析(时域/频域)

1.掌握离散闭环系统的动态性能时域参数的分析与计算方法; 2.掌握离散系统稳定性的频域典型参数分析与计算方法。 MATLAB 软件( 2022a); 1.在 Matlab 语言平台上,通过给定的闭环离散系统,深刻理解时域参数的物理意义与计算方法,内容包括如下: 阻尼比参数分析:Z 平面与 S 平面的极点相互转换编程实现;分析 S/Z 两个平面域特殊特性(水平线、垂直线、斜线、圆周等)的极点轨迹相互映射方法;系统阶跃响应参数:上升时间和超调量等。 2. 采用频域分析方法,通过编程计算,进一步理解离散系统的稳定

m0_51738372的博客 2479

离线批量数据通道Tunnel的最佳实践及常见问题

基本介绍及应用场景 Tunnel是MaxCompute提供的离线批量数据通道服务,主要提供大批量离线数据上传和下载,仅提供每次批量大于等于64MB数据的场景,小批量流式数据场景请使用DataHub实时数据通道以获得更好的性能和体验。 SDK上传最佳实践 import java.io.IOException; import java.util.Date; ...

weixin_33752045的博客 367

YOLOv8 改进:使用 MobileNetV3 轻量化架构改进特征提取网络

通过使用 MobileNetV3 作为 YOLOv8 的特征提取器,能够显著降低模型复杂度和运行时资源消耗,同时在一定程度上保持检测精度。这种方法特别适合需要高效计算的边缘设备和嵌入式系统。

走向CTO的路上... 1276

阿里云ODPS(现名MaxCompute,原名ODPS)介绍

什么是ODPS(一) 阿里云开放数据处理服务(Open Data Processing Service,简称ODPS) 是构建在飞天系统上的大规模分布式数据处理服务。 ODPS以REST API的形式,支持用户提交类SQL的查询语言,对海量数据进行处理。在API之上,还提供SDK开发包和命令行工具,Aliyun.com上还有一个Web演示界面。 什么是ODPS(二) 与传统数据仓库工具相比

weixin_36607803的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

搜索场景个数统计

package com.alibaba.newcpw.xx.logDeal; import com.alibaba.fastjson.JSONObject; import com.alibaba.newcpw.xx.utils.JsonAnalysis; import com.alibaba.newcpw.xx.utils.OdpsUtil; import com.aliyun.odps.da...

疯批美人 400

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

阿里云机器学习平台使用——协同过滤推荐算法快速应用

标签: 数加 概述 PAI机器学习平台是构建在阿里云ODPS计算平台之上,集数据处理、建模、离线预测、在线预测为一体的机器学习平台。 该平台为算法开发者提供了丰富的MPI、PS、BSP等编程框架和数据存取接口,同时为算法使用者提供了基于Web的IDE+可视化实验搭建控制台。平台目前整合了阿里集团内最先进的算法,为用户提供算法服务。 今天做了一件事情来体...

weixin_33895016的博客 833

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

4月22日丨【云数据库技术沙龙】技术进化,让数据更智能

MySQL 是毫无争议的最受欢迎的数据库,在现实世界中支持了无数大大小小的业务场景;ClickHouse则是最近几年增长最快速的开源分析型数据库,因为其对于性能的极致追求,使其即使是单机的情况下,也有着非常优秀的性能表现。而这也非常好的弥补了MySQL在复杂分析查询上的性能短板。这次,我们就一起来看看MySQL x ClickHouse会碰撞出怎样的火花。火山引擎资深研发工程师,负责ByteHouse云数仓版引擎计算模块。之前先后就职于网易、菜鸟集团、蚂蚁集团,有多年大数据计算引擎、分布式系统相关研发经历。

云原生智能数据管理平台 1372

java面试总结(持续更新)

热门知识 1.list接口的实现,arraylist与linkedlist的区别,arraylist的默认长度,何时扩容 2.hashmap何时扩容,以及扩容后长度 3.redis基本数据结构,set与sortset区别,如何实现排序 4.解释脏数据,不可重复读,幻度 5.什么是索引,索引为什么快,B树结构 6.springboot自动装配原理 7.@autowide与@resource区别 8....

yy544358098的博客 501

大数据(一)MaxCompute

作者后面会使用MaxCompute,所以在进行学习研究,总会有一些疑问产生,这里讲讲作者的疑问和思路

m0_69270256的博客 3904

性能追求之路——MaxCompute2.0(原ODPS)的前世今生

在2017云栖大会大数据专场,阿里云高级专家云郎分享了《大数据计算服务MaxCompute产品最新动态》。他首先介绍了MaxCompute的发展历程和技术架构,然后对MaxCompute 2.0版本新特性和新技术进行了详细介绍。最后,分享了基于MaxCompute平台构建完整大数据应用架构、构建新型数据仓库、实现个性化推荐的实践。 本文根据直播视频整...

weixin_33742618的博客 723

关于“阿里云平台”的研究报告

关于“阿里云平台”的研究报告

迅锋科技工作室 1963

基于ADS7851EVM-PDK的高性能ADC评估平台实战指南

模数转换器(ADC)是连接模拟世界与数字系统的关键桥梁,其性能直接决定了数据采集的精度与可靠性。ADC的工作原理是将连续的模拟信号离散化为数字代码,其核心指标如信噪比(SNR)、总谐波失真(THD)和无杂散动态范围(SFDR)共同定义了系统的动态性能与信号保真度。在嵌入式系统、工业自动化及精密仪器等领域,选择一款合适的ADC并验证其真实性能至关重要,这能避免因芯片实际表现与手册不符而导致的项目风险。评估套件(如TI的EVM-PDK)为此提供了开箱即用的完整参考系统,它将工程师从繁琐的硬件设计、驱动开发和软件

weixin_34378969的博客 480

手搓文本向量数据库(自然语言搜索生成模型)

【代码】手搓文本向量数据库(自然语言搜索生成模型)

东方佑 463

手搓一个最简单的注册中心

说到注册中心,相信很多人用过eureka和nacos,用法比较简单,只需引用jar包和配置服务器地址即可启用.但是今天我要说的不是两者的使用或者原理,而是更纯粹一点,就是手搓一个注册中心.

学习笔记 931

Odps使用过程中碰到的问题。

1.RequestId=201603311944245892b70a006de4d2, ErrorCode=InvalidPartitionSpec, ErrorMessage=The specified partitionspec is not valid. at com.aliyun.odps.tunnel.TableTunnel$UploadSession.initiate(TableTu

wwHRestarting的博客 5869

阿里云 MaxCompute Tunnel Upload 上传典型问题整理

文章目录前言一、Tunnel 上传功能概述二、Tunnel 上传问题分类三、数据问题四、网络问题五、计费问题 前言 在阿里云大学学习了付帅师兄关于《MaxCompute Tunnel Upload 上传典型问题》的分享,将学习笔记做了整理如下: 一、Tunnel 上传功能概述 二、Tunnel 上传问题分类 数据问题 网络问题 计费问题 三、数据问题 Q:使用Tunnel Java SDK上传数据,上传数据可以自动分配到各个分区吗? A:目前Tunnel是无法自动上传数据并自动分配到各个分区的:每一次

云祁QI 4344
上一篇: 架构师必备架构技术:高性能+分布式+开源框架+微服务(全)
下一篇: RocketMQ:写一个生产者程序要注意些什么
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值