阿里云云数据库HBase版对接使用完全指南:从入门到生产实践

简介: 本文提供了一份完整的阿里云云数据库HBase版对接使用指南。内容涵盖HBase标准版与增强版的选型对比、集群创建与白名单配置、多种客户端接入方式(HBase Shell、Java API、Python Thrift、Phoenix SQL)、与大数据生态(Spark、Flink、Hive)的集成方案、性能调优的核心策略(Rowkey设计、BlockCache与Memstore调优、批量操作)、以及监控告警与数据迁移的最佳实践。通过大量代码示例和配置片段,帮助开发者从零开始快速上手,并在生产环境中稳定高效地使用阿里云HBase。

1. 云数据库HBase版概述与选型

阿里云云数据库HBase版是构建在阿里云基础设施之上的全托管NoSQL数据库服务,完全兼容开源HBase协议,为用户提供高性能、高可用、弹性伸缩的大数据存储能力。与自建HBase集群相比,云数据库HBase版免去了繁琐的运维工作,由平台自动完成节点管理、故障恢复、数据备份等任务,使开发者能够专注于业务逻辑本身。

阿里云HBase主要提供两种版本供用户选择:

  • 标准版:基于开源HBase内核构建,完全兼容社区版客户端,适合对开源生态依赖较强、希望平滑迁移的场景。标准版支持直接使用社区开源版客户端,也可以使用阿里定制的HBase客户端访问。
  • 增强版(云原生多模数据库Lindorm的宽表引擎):在RPC、内存管理、缓存、日志写入等方面进行了深度优化,通过高性能数据结构、协程、合并提交等核心技术大幅提升读写性能。增强版还支持冷热数据自动分离、多副本等企业级特性。

选择建议:如果业务对性能有较高要求、需要冷热分离等高级特性,或希望获得更好的吞吐能力和稳定性,推荐使用增强版;如果业务需要与开源社区保持最大兼容性,或已有大量基于开源HBase的代码和工具,标准版是更稳妥的选择。

2. 环境准备与集群创建

2.1 创建HBase集群

使用云数据库HBase版的第一步是在阿里云控制台中创建集群。操作流程如下:

  1. 登录阿里云控制台,在产品列表中找到"云数据库HBase版"。
  2. 点击"创建集群",根据业务需求选择地域、可用区、版本类型(标准版或增强版)、实例规格和存储容量。
  3. 设置网络类型。建议使用专有网络(VPC),具有更高的安全性。如果应用部署在ECS实例上,需确保HBase集群与ECS实例在同一地域,并建议在同一可用区以减少网络延迟。
  4. 完成购买后,集群进入创建过程,通常需要几分钟时间。

2.2 配置白名单

  1. 集群创建完成后,必须配置白名单才能让客户端访问。白名单配置是HBase安全访问的第一道防线,只有白名单中的IP地址或安全组中的ECS实例才能连接HBase集群。
  2. 配置步骤如下:
  1. 在HBase控制台的集群列表中找到目标集群,单击集群ID进入详情页。
  2. 点击左侧导航栏中的"访问控制"。
  3. 在白名单设置页签下,点击"修改分组白名单"。
  4. 手动添加客户端所属的IP地址,或通过ECS安全组方式添加。
  1. 安全组方式特别适合ECS部署场景——将HBase集群与ECS安全组关联后,该安全组中的所有ECS实例均可访问HBase,无需逐一添加IP。白名单和ECS安全组两种方式可以同时配置。
  2. 需要先登录阿里云控制台,点击:阿里云控制台

3. 获取连接地址

  1. 不同接入方式需要获取不同的连接地址:
  • Java API访问地址:在控制台单击目标实例,左侧导航栏选择"数据库连接",在连接信息区域查看。增强版Java API地址格式为 ld-xxx-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30020
  • ZK连接地址(标准版):标准版使用ZooKeeper地址进行连接,格式为三个master节点地址,如 hb-实例ID-masterN-001.hbase.rds.aliyuncs.com:2181
  • 非Java API访问地址(增强版):在Lindorm控制台实例详情页选择宽表引擎页签,展开HBase兼容地址区域获取,端口为90。

4. 使用HBase Shell进行基础操作

  1. HBase Shell是管理和操作HBase最直接的工具,适合运维人员和开发者进行快速验证。

4.1 连接HBase Shell

  1. 标准版和增强版的Shell连接方式略有不同。标准版可直接使用社区版HBase Shell,配置ZK地址后连接。增强版需要从控制台下载专用Shell工具包。

4.2 基础操作示例

  1. 以下是在HBase Shell中常用的操作命令:
# 创建表,指定表名和列族
create 'user_table', {NAME => 'info'}
# 查看所有表
list
# 插入数据
put 'user_table', 'row001', 'info:name', '张三'
put 'user_table', 'row001', 'info:age', '28'
put 'user_table', 'row001', 'info:city', '北京'
# 查询单行数据
get 'user_table', 'row001'
# 扫描表中所有数据
scan 'user_table'
# 扫描指定列族的数据
scan 'user_table', {COLUMN => 'info'}
# 删除数据
delete 'user_table', 'row001', 'info:age'
# 删除表(需要先禁用)
disable 'user_table'
drop 'user_table'

5. Java API接入

  1. Java API是HBase最核心的访问方式,几乎所有生产环境的应用都通过Java API与HBase交互。

5.1 前提条件

  • 安装JDK 1.8及以上版本。
  • 已将客户端IP地址添加至HBase白名单。
  • 安装HBase Java SDK。

5.2 Maven依赖配置

  1. 在项目的 pom.xml 中添加HBase客户端依赖:
<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-client</artifactId>
    <version>2.4.9</version>
</dependency>
  1. 如果使用阿里云定制客户端,需使用阿里云提供的SDK版本。

5.3 配置与连接

  1. 通过两种方式配置连接参数:
  2. 方式一:通过 hbase-site.xml 配置文件
<configuration>
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>ld-xxxx-proxy-hbaseue.lindormue.xxx.rds.aliyuncs.com:30020</value>
    </property>
    <property>
        <name>hbase.client.username</name>
        <value>testuser</value>
    </property>
    <property>
        <name>hbase.client.password</name>
        <value>password</value>
    </property>
</configuration>
  1. 方式二:通过代码直接配置
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
public class HBaseConnection {
    public static Connection createConnection() throws Exception {
        Configuration conf = HBaseConfiguration.create();
        
        // 设置连接地址(增强版使用Java API地址,标准版使用ZK地址)
        conf.set("hbase.zookeeper.quorum", 
            "ld-bp150tns0sjxs****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30020");
        
        // 设置用户名和密码(增强版需要)
        conf.set("hbase.client.username", "testuser");
        conf.set("hbase.client.password", "password");
        
        // 如果依赖了alihbase-connector,需配置connection.impl
        // conf.set("hbase.client.connection.impl", 
        //     AliHBaseUEClusterConnection.class.getName());
        
        // 创建连接——在程序生命周期内只需创建一次,该连接线程安全
        return ConnectionFactory.createConnection(conf);
    }
}

5.4 DDL操作示例

import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.util.Bytes;
public class DDLOperations {
    public static void createTable(Connection connection, String tableName, 
                                   String... columnFamilies) throws Exception {
        try (Admin admin = connection.getAdmin()) {
            TableName tn = TableName.valueOf(tableName);
            if (admin.tableExists(tn)) {
                System.out.println("Table " + tableName + " already exists");
                return;
            }
            
            HTableDescriptor htd = new HTableDescriptor(tn);
            for (String cf : columnFamilies) {
                htd.addFamily(new HColumnDescriptor(Bytes.toBytes(cf)));
            }
            
            // 预分区建议:根据数据特点预先分区,避免单Region性能瓶颈
            byte[][] splitKeys = new byte[][] {
                Bytes.toBytes("a"), Bytes.toBytes("b"), 
                Bytes.toBytes("c"), Bytes.toBytes("d")
            };
            admin.createTable(htd, splitKeys);
            System.out.println("Table " + tableName + " created with pre-splitting");
        }
    }
    
    public static void disableTable(Connection connection, String tableName) 
            throws Exception {
        try (Admin admin = connection.getAdmin()) {
            admin.disableTable(TableName.valueOf(tableName));
            System.out.println("Table " + tableName + " disabled");
        }
    }
    
    public static void dropTable(Connection connection, String tableName) 
            throws Exception {
        try (Admin admin = connection.getAdmin()) {
            admin.disableTable(TableName.valueOf(tableName));
            admin.deleteTable(TableName.valueOf(tableName));
            System.out.println("Table " + tableName + " dropped");
        }
    }
}

5.5 DML操作示例

import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;
public class DMLOperations {
    private static final byte[] CF_INFO = Bytes.toBytes("info");
    private static final byte[] COL_NAME = Bytes.toBytes("name");
    private static final byte[] COL_AGE = Bytes.toBytes("age");
    
    public static void putData(Connection connection, String tableName, 
                               String rowKey, String name, int age) throws Exception {
        try (Table table = connection.getTable(TableName.valueOf(tableName))) {
            Put put = new Put(Bytes.toBytes(rowKey));
            put.addColumn(CF_INFO, COL_NAME, Bytes.toBytes(name));
            put.addColumn(CF_INFO, COL_AGE, Bytes.toBytes(age));
            table.put(put);
            System.out.println("Data inserted for row: " + rowKey);
        }
    }
    
    public static void getData(Connection connection, String tableName, 
                               String rowKey) throws Exception {
        try (Table table = connection.getTable(TableName.valueOf(tableName))) {
            Get get = new Get(Bytes.toBytes(rowKey));
            // 建议指定列族,减少IO
            get.addFamily(CF_INFO);
            Result result = table.get(get);
            
            if (result.isEmpty()) {
                System.out.println("No data found for row: " + rowKey);
                return;
            }
            
            String name = Bytes.toString(result.getValue(CF_INFO, COL_NAME));
            int age = Bytes.toInt(result.getValue(CF_INFO, COL_AGE));
            System.out.println("Row: " + rowKey + ", Name: " + name + ", Age: " + age);
        }
    }
    
    public static void scanData(Connection connection, String tableName, 
                                String startRow, String stopRow) throws Exception {
        try (Table table = connection.getTable(TableName.valueOf(tableName))) {
            Scan scan = new Scan();
            scan.withStartRow(Bytes.toBytes(startRow));
            scan.withStopRow(Bytes.toBytes(stopRow));
            scan.addFamily(CF_INFO);
            
            // 大scan场景建议设置缓存大小
            scan.setCaching(1000);
            
            try (ResultScanner scanner = table.getScanner(scan)) {
                for (Result result : scanner) {
                    String row = Bytes.toString(result.getRow());
                    String name = Bytes.toString(result.getValue(CF_INFO, COL_NAME));
                    int age = Bytes.toInt(result.getValue(CF_INFO, COL_AGE));
                    System.out.println("Row: " + row + ", Name: " + name + ", Age: " + age);
                }
            }
        }
    }
    
    public static void deleteData(Connection connection, String tableName, 
                                  String rowKey) throws Exception {
        try (Table table = connection.getTable(TableName.valueOf(tableName))) {
            Delete delete = new Delete(Bytes.toBytes(rowKey));
            table.delete(delete);
            System.out.println("Data deleted for row: " + rowKey);
        }
    }
    
    public static void batchPut(Connection connection, String tableName, 
                                java.util.Map<String, String> dataMap) throws Exception {
        try (Table table = connection.getTable(TableName.valueOf(tableName))) {
            java.util.List<Put> puts = new java.util.ArrayList<>();
            for (java.util.Map.Entry<String, String> entry : dataMap.entrySet()) {
                Put put = new Put(Bytes.toBytes(entry.getKey()));
                put.addColumn(CF_INFO, COL_NAME, Bytes.toBytes(entry.getValue()));
                puts.add(put);
            }
            table.put(puts);  // 批量提交,减少RPC次数
            System.out.println("Batch inserted " + puts.size() + " rows");
        }
    }
}

6. Python非Java API接入

  1. Lindorm宽表引擎支持通过HBase非Java API(C++、Python、Go等)进行访问。Python开发者可以通过Thrift协议连接HBase。

6.1 环境准备

# 安装Thrift
pip install thrift
# 下载HBase Thrift定义文件并生成Python接口
thrift --gen py Hbase.thrift

6.2 Python连接示例

# -*- coding: utf-8 -*-
from thrift.protocol import TBinaryProtocol
from thrift.transport import THttpClient
from hbase import THBaseService
from hbase.ttypes import TColumnValue, TColumn, TTableName, TGet, TPut, TScan
# 配置连接地址
url = "http://ld-bp17j28j2y7pm****-proxy-lindorm.lindorm.rds.aliyuncs.com:9190"
transport = THttpClient.THttpClient(url)
# 设置认证信息
headers = {}
headers["ACCESSKEYID"] = "testuser"
headers["ACCESSSIGNATURE"] = "password"
transport.setCustomHeaders(headers)
protocol = TBinaryProtocol.TBinaryProtocolAccelerated(transport)
client = THBaseService.Client(protocol)
# 打开连接
transport.open()
try:
    # 创建表
    table_name = TTableName(namespace="default", qualifier="python_test")
    # 使用前需确认表是否存在
    
    # 写入数据
    put = TPut(row="row001")
    col_value = TColumnValue(family="info", qualifier="name", value="张三")
    put.columnValues = [col_value]
    client.put(table_name, put)
    print("Data inserted")
    
    # 读取数据
    get = TGet(row="row001")
    result = client.get(table_name, get)
    if result and result.columnValues:
        for col in result.columnValues:
            print(f"{col.family}:{col.qualifier} = {col.value}")
    
finally:
    # 关闭连接
    transport.close()

7. Phoenix SQL接入

  1. Apache Phoenix是一个构建在HBase之上的SQL层,允许使用标准SQL查询和管理HBase中的数据。阿里云HBase的Ali-Phoenix兼容开源客户端(版本4.12)。

7.1 Phoenix优势

  • 将SQL查询转换为HBase API调用,利用协处理器和自定义过滤器协调执行
  • 简单查询可在毫秒级完成
  • 支持二级索引、聚合查询、JOIN等高级功能

7.2 下载与配置

# 下载Phoenix客户端
wget https://hbase-opt.oss-cn-hangzhou.aliyuncs.com/ali-phoenix-4.12.0-AliHBase-1.1-0.9.tar.gz
# 解压
tar zxvf ali-phoenix-4.12.0-AliHBase-1.1-0.9.tar.gz

7.3 启动SQLLine

# 使用ZK地址启动
./sqlline.py hb-bp19142ir9****-001.hbase.rds.aliyuncs.com,\
hb-bp19142ir9****-002.hbase.rds.aliyuncs.com,\
hb-bp19142ir9****-004.hbase.rds.aliyuncs.com

7.4 Phoenix SQL示例

-- 创建表
CREATE TABLE IF NOT EXISTS us_population (
    state CHAR(2) NOT NULL,
    city VARCHAR NOT NULL,
    population BIGINT,
    CONSTRAINT pk PRIMARY KEY (state, city)
);
-- 插入数据
UPSERT INTO us_population VALUES ('NY', 'New York', 8143197);
UPSERT INTO us_population VALUES ('CA', 'Los Angeles', 3844829);
UPSERT INTO us_population VALUES ('IL', 'Chicago', 2695598);
-- 查询数据
SELECT * FROM us_population WHERE state = 'NY';
-- 聚合查询
SELECT state, SUM(population) as total_pop 
FROM us_population 
GROUP BY state 
ORDER BY total_pop DESC;
-- 退出
!quit

8. 大数据生态集成

8.1 Spark集成

  1. 通过HBase Spark Connector,可以在Spark中读写HBase数据。Connector使用Catalog(JSON结构)定义HBase表与Spark SQL表之间的映射。
  2. Spark读取HBase示例
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder()
    .appName("HBaseSparkExample")
    .getOrCreate()
// 定义Catalog映射
val catalog = s"""{
  "table":{
    "namespace":"default",
    "name":"user_table"
  },
  "rowkey":"key",
  "columns":{
    "rowkey":{"cf":"rowkey", "col":"key", "type":"string"},
    "name":{"cf":"info", "col":"name", "type":"string"},
    "age":{"cf":"info", "col":"age", "type":"int"}
  }
}""".stripMargin
// 创建Spark临时表
df.createOrReplaceTempView("hbase_table")
// 执行SQL查询
val result = spark.sql("SELECT name, age FROM hbase_table WHERE age > 18")
result.show()

8.2 Flink集成

  1. HBase增强版可作为Flink的维表(Lookup Source)或结果表(Sink)使用。社区版Flink和阿里云实时计算版Flink均支持通过SQL语句或DataStream API访问。
  2. Flink SQL创建HBase维表示例
CREATE TABLE dim_hbase_user (
    rowkey STRING,
    name STRING,
    age INT,
    PRIMARY KEY (rowkey) NOT ENFORCED
) WITH (
    'connector' = 'hbase-2.2',
    'table-name' = 'user_table',
    'zookeeper.quorum' = 'hb-xxx-001.hbase.rds.aliyuncs.com:2181,\
hb-xxx-002.hbase.rds.aliyuncs.com:2181',
    'zookeeper.znode.parent' = '/hbase'
);

8.3 Hive集成

  1. 通过Hive的HBaseStorageHandler,可以使用HiveQL查询和写入HBase数据。配置 hbase-site.xml 指向HBase的ZooKeeper地址:
<property>
    <name>hbase.zookeeper.quorum</name>
    <value>hb-xxx-001.hbase.rds.aliyuncs.com,\
hb-xxx-002.hbase.rds.aliyuncs.com,\
hb-xxx-003.hbase.rds.aliyuncs.com</value>
</property>
  1. 创建Hive外部表映射HBase表:
CREATE TABLE hive_hbase_table(key int, value string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")
TBLPROPERTIES ("hbase.table.name" = "hive_hbase_table");

9. 性能优化最佳实践

9.1 Rowkey设计

  1. Rowkey设计是HBase性能优化的核心。HBase按字典序对Rowkey排序,这使得范围扫描高效且相关行物理相邻。但顺序或时间戳类型的Rowkey会导致所有写入落在同一Region上,直到该Region分裂,造成写入热点。
  2. Rowkey设计原则
  • 散列性:使用MD5、反转、前缀等方式打散Rowkey,避免热点
  • 长度适中:Rowkey不宜过长,建议不超过100字节
  • 利用字典序:将经常一起查询的字段组合在Rowkey前面
  1. 示例:使用反转时间戳作为Rowkey前缀
// 反转时间戳
long timestamp = System.currentTimeMillis();
String reversedTimestamp = String.valueOf(Long.MAX_VALUE - timestamp);
String rowkey = reversedTimestamp + "_" + userId;

9.2 读取优化

  • 批量Get:使用 table.get(List) 批量获取,成倍减少RPC次数
  • 设置Scan缓存:大Scan场景设置 scan.setCaching(1000)
  • 指定列族/列名:减少不必要的IO
  • 离线读取禁用缓存scan.setBlockCache(false)
  • BlockCache调优:读多场景建议内存使用1:4的机器(8CPU32G或16CPU64G),调高 hfile.block.cache.size 至0.5,降低 hbase.regionserver.global.memstore.size 至0.3

9.3 写入优化

  • 批量提交:使用 table.put(List) 批量写入
  • 设置Autoflush:设置为false可大幅提升写性能,建议缓冲2MB数据后统一提交
  • 预分区:建表时根据Rowkey分布预先创建多个Region

9.4 Compaction与BloomFilter

  • 定期做Major Compaction合并小文件,提升读性能,但避免在业务高峰进行
  • 创建表时启用BloomFilter(默认ROW级别),可过滤不必要的HFile读取

10. 监控告警与运维

10.1 监控配置

  1. HBase增强版使用云监控实现系统监控与报警。推荐使用应用分组来组织被监控的实例,并以应用分组为粒度进行报警配置。
  2. 配置步骤:
  1. 创建应用分组并添加HBase实例
  2. 创建报警规则(如CPU使用率、存储使用比例、读写延迟等)
  3. 创建报警联系组
  1. 重要提醒:HBase实例在存储使用比例达到95%时会自动锁定集群。建议将存储告警阈值设置为80%-85%,预留充足时间进行扩容。

10.2 数据迁移与同步

  1. 阿里云提供Lindorm Tunnel Service(LTS)服务,支持HBase数据的全量迁移和增量同步。LTS支持:
  • Schema自动复制
  • 全量数据迁移
  • 增量数据实时同步
  1. 对于不停机迁移场景,可结合HBase Snapshot和Replication技术。

11. 常见问题与解答

  1. 问1:标准版和增强版在连接方式上有什么主要区别?
  2. 答:标准版使用ZooKeeper地址连接(三个master节点地址,端口2181),增强版使用Java API访问地址(单地址,端口30020)。增强版还需要配置用户名和密码进行认证。
  3. 问2:Connection对象应该如何管理?
  4. 答:Connection是线程安全的,在整个程序生命周期内只需创建一次,可以共享给所有线程使用。程序结束时必须关闭Connection,否则会造成连接泄露,建议使用try-with-resources或try-finally方式确保正确释放。
  5. 问3:如何解决HBase写入热点问题?
  6. 答:写入热点通常由Rowkey设计不合理导致。解决方案包括:使用散列前缀(如MD5取前几位)、反转时间戳、或者使用Salting(加盐)方式打散Rowkey。同时,建表时进行预分区也能有效分散写入压力。
  7. 问4:Phoenix和原生HBase API应该如何选择?
  8. 答:Phoenix适合需要SQL查询能力、有复杂查询和聚合需求的场景。原生HBase API更适合需要精细控制、追求极致性能的场景。两者可以混合使用——通过Phoenix进行查询分析,通过原生API进行高性能写入。
  9. 问5:HBase集群存储达到95%会发生什么?如何预防?
  10. 答:HBase实例在存储使用比例达到95%时会自动锁定集群,阻止写入操作。预防措施包括:设置合理的存储告警阈值(建议80%-85%)、定期清理过期数据、利用冷热分离将冷数据迁移至低成本存储、及时扩容磁盘。
  11. 问6:云数据库HBase支持公网访问吗?
  12. 答:支持,但需要通过公网访问时,必须使用阿里云提供的HBase客户端。出于安全考虑,强烈建议在VPC内网环境中访问HBase,通过同地域ECS内网连接可获得更低的延迟和更高的安全性。
相关文章
|
3天前
|
人工智能 弹性计算 运维
|
1天前
|
缓存 人工智能 安全
GPT-5.6 Terra与GPT-5.5性能实测:成本减半后的跑分对比与快速迁移指南
GPT-5.6 Terra 的定价为每百万 token 输入 2.50/输出 15。GPT-5.5 则是 5/ 30。Terra 的每一项费率,包括 $0.25/M 的缓存读取,都恰好是 GPT-5.5 的一半,因此在任何工作负载组合下,Terra 都固定 便宜 2.0x。以每天 10 万次请求、3K token 提示词计算,大约是 Terra 每天 2,000,GPT−5.5每天 4,000,即每月约 60,000对 120,000。问题在于:OpenAI 没有发布任何针对 Terra 的编码基准。那个著名的 91.9% Terminal-Bench 数字是 Sol 在 Ul
|
25天前
|
Linux 程序员 数据格式
【2026最新】Notepad++下载、安装和使用一篇搞定(附中文版安装包)
Notepad++ 是一款免费开源、轻量高效的 Windows 文本编辑器,支持 C/Python/HTML 等 80+ 语言语法高亮、代码折叠、正则替换、编码转换及插件扩展,专为程序员与文本处理用户打造,完美替代系统记事本。(239字)
|
10天前
|
人工智能 缓存 安全
Claude Code 封号真实原因曝光,这次彻底不装了,直接针对国内开发者的账号下手?
Claude Code 封号潮背后:逆向扒出客户端隐写区域标记,Anthropic 政策收紧叠加 DeepSeek 7 月涨价,国产替代更紧迫。
|
19天前
|
存储 人工智能 监控
QoderWork完全指南:从入门到精通,把“AI实习生”变成你的全能工作搭档
阿里云2026年推出的桌面端AI工作助手QoderWork,不止聊天,更可动手干活:本地运行、安全可控,支持文件整理、数据分析、PPT生成、网页开发等;内置专家套件、多Agent协作与自定义Skills,让AI真正成为你身边的“AI实习生”。
|
15天前
|
人工智能 JSON 自然语言处理
让教学更智慧:用阿里云百炼工作流,自动生成中小学教材内容#小有可为#有温度的AI
通过可视化工作流编排,将大模型推理能力转化为标准化的教学内容生成引擎。教师只需输入教材标题和适用学段,即可自动获得结构完整、符合课程标准的章节内容,大幅降低备课门槛,助力教育资源均衡化。
503 127
|
9天前
|
人工智能 编解码 物联网
2026 最新Stable Diffusion 本地部署教程 下载安装使用详细图解(含官网安装包)
Stable Diffusion(SD)是2022年发布的开源文生图模型,由Stability AI等联合开发。支持文生图、图生图、局部重绘等,依托VAE降低算力需求,可在消费级显卡运行。本文提供秋葉aaaki制作的Windows整合包(含图形界面与插件),开箱即用,零配置启动。
|
10天前
|
人工智能 安全 程序员
终于,Claude Code 封号的原因被曝光了!竟然针对中国用户,植入隐形代码?!
通俗易懂地揭秘 Claude Code 封号的手段,分享一些自己对 AI 编程困境的思考,Codex、Cursor、DeepSeek、智谱 GLM、甚至是豆包,都有所行动了
525 1
|
18天前
|
人工智能 弹性计算 API
什么是 AlibabaCloud Agent Toolkit
Alibaba Cloud Agent Toolkit 是面向AI Agent的阿里云智能工具套件,集成OpenAPI、Terraform、CLI与文档能力,提供MCP插件、场景化Skills及执行审计机制,助AI准确查API、生成代码、规划架构、校验部署,实现安全、可靠、可追溯的云上智能运维。
457 2