🏢 公司NewsroomSNOWCodex · 实盘不做把握 4/10不做原因:证据不足
北京时间·🕒 发布 03:58:00待核·⟳ 抓取 08-27 11:45:41·⚡ 决策 08-25 02:46:29 −2d08h·63.7 天前
Snowflake发布Snowpipe Streaming写入Iceberg的百万TPS演示方案
Snowflake产品能力叙事利好,但正文只是技术演示与教程,不是商业订单、客户采用或财务指引上调;直接载体扫描未发现除SNOW.US外的可验证直接产品,现有证据不足以交易。
📄 原文SNOW↗ 原文
Streaming Data into Apache Iceberg with Snowflake
Full-scale streaming evaluation without the infrastructure lift For a team trying to find out whether Snowpipe Streamin…
不做 Snowflake(SNOW.US)
官方技术博客利好产品叙事,但没有订单、客户采用、收入或指引增量;相对约1153亿美元市值量级不足,缺少短线正期望。
展开详情(成交明细 / 研究档案 / 原文全文 / 决策记录链)
研究档案
结论摘要
Snowflake官方博客展示Snowpipe Streaming写入Iceberg的百万TPS级演示,说明产品能力和开发者采用路径改善;但事件没有新增订单、客户承诺、ARR/RPO、消费用量或指引变化。对SNOW.US这种大市值软件公司,未量化的官方技术博客更像产品教育而非短线可交易预期差,因此回避。
🔎 新鲜度:最早出现 2026-08-24 · 扩散 low · price-in 风险 medium ↗
消息传播链
- 公司官方博客发布Snowpipe Streaming写入Iceberg的1M+ TPS演示与代码路径。
关键理由
- Snowpipe Streaming与Iceberg互操作增强Snowflake开放数据湖叙事,但当前仅是技术演示。
- 正文没有客户采购、合同金额、ARR/RPO或收入指引,无法量化对Snowflake收入或市值的增量。
- 直接载体扫描未发现除SNOW.US外的已验证ADR或单股杠杆/反向产品,交易结论集中于普通股。
主要风险
- 若后续出现大型客户采购、Snowpipe Streaming消费加速或管理层上调产品采用指引,本次AVOID需要重评。
- 相关能力此前已有产品与文档铺垫,软催化容易被视为既有路线延续。
反向证据
- 做多前查反向 · 来源 web · 日期 2026-08-24 · 影响 weakens
未在官方博客正文中看到客户采购、合同金额、ARR/RPO或收入指引上调。
检索:Snowflake Snowpipe Streaming Iceberg 1M TPS customer order revenue guidance 原文 ↗ - 做多前查反向 · 来源 filing · 日期 2026-08-24 · 影响 weakens
本次材料定位为demo和开发者实践,不是正式商业合同或财务披露。
检索:Snowflake Snowpipe Streaming Iceberg demo commercial adoption 原文 ↗
先例如何影响了这次决策
对本次决策的影响:先例不足与量级缺失共同压低置信度,并将SNOW.US从做多候选降为回避。
方向:未形成可用的同市场高相似先例;软件公司技术博客或demo通常需要客户采用或财务指标确认后才有强交易意义。
涨幅量级:无高相似、锚点干净的先例可用于设定涨幅目标。
形态:本次更接近既有产品能力教育,软催化存在见光即淡化风险。
原文全文
展开原文 · 10,112 字
Full-scale streaming evaluation without the infrastructure lift
For a team trying to find out whether Snowpipe Streaming holds up at 1M+ TPS, you want the shortest path to a real answer. Streaming at scale has a reputation. It's the workload teams put off, because standing it up entails S3 buckets, an EKS cluster, Kafka topics, IAM policies, a security review and sign-off from three platform teams who each have their own backlogs. That setup can require additional infrastructure provisioning and coordination before testing begins. Proving these pipelines work at the scale and handle production volume is usually its own project.
In our demo environment, we were able to set up and run this evaluation in an afternoon. You can use our Snowpipe Streaming High-Performance Architecture to stream data into Apache Iceberg™ format at over 1M TPS, entirely inside Snowflake infrastructure. A container running in Snowpark Container Services (SPCS) generates the load, streams it through the SDK and lands it in a Snowflake-managed Iceberg table. That makes it ready to query in Snowflake right away, with role-based access control (RBAC), lineage and masking all applied as it arrives. In our test environment, we stood up the demo, tested it end to end, measured throughput and tore it down in an afternoon, as we did in our test.
This post will walk you through how to actually build an end to end streaming to Iceberg demo, using this GitHub Repo. This example is in python but you can test the SDK options (Java, Python, Node, REST), so that you can credibly recommend this to your business with real results to show.
Architecture diagram: The pattern
We wanted to build a demo where everything runs inside Snowflake infrastructure. Multiple Docker containers running in Snowpark Container Services (SPCS) generate synthetic test data at your target transactions per second and stream it using the Snowpipe Streaming SDK. It lands in a Snowflake-managed Iceberg table: open format, queryable within seconds of landing, governed in Snowflake. Authentication is easy: SPCS injects a short-lived OAuth token into the container telling the Streaming SDK to use it. You don't need to manage any secrets.
Why SPCS to generate the load?
To be clear, Snowpipe Streaming doesn't need SPCS. The SDK runs anywhere: your laptop, an EC2 box, a Kubernetes pod.
Putting it in SPCS is what gets you to the test faster since the service runs entirely on infrastructure Snowflake already manages, with nothing new to provision or additional sign-offs to manage for the test itself.
Landing directly into Iceberg
The target is a Snowflake-managed Iceberg table. Rows stream in through the SDK and land as Parquet with Iceberg metadata, managed by Snowflake. Point it at your own S3 external volume later if you want, or leave it managed after the evaluation. The code stays the same either way.
For the evaluation it means less setup. A table on Snowflake managed storage skips the external volume, storage integration and cloud storage permissions you'd otherwise have to configure first.
When you're ready to productionize, you've got three clear paths:
- Snowflake-managed Iceberg with an external volume: Parquet files are stored in your S3 bucket. An external engine reads the Parquet files directly from S3, using the Horizon REST Catalog for metadata.
- Snowflake-managed Iceberg on Snowflake storage: The files are in Snowflake's internal storage. This option avoids configuring an external volume and associated cloud storage. Leverages Iceberg features for compatibility going forward.
- Native Snowflake table: No separately managed external storage infrastructure is required for this configuration.
Demo: See it running
When you run the demo script you can see the SPCS service starts, the producer begins generating the load, and the consumer streams it into the Iceberg table.
You can switch to Snowsight, and see the row count climb here as well — millions of rows, queryable as they land.
The code: Building it yourself
To help understand how this all works, here is some pseudocode to help visualize how this works. The full code is in the repo, and there are several alternative demos linked below.
Start with a Snowflake-managed Iceberg table and a pipe:
-- 1. The target table
CREATE OR REPLACE ICEBERG TABLE events (
event_id STRING,
event_ts TIMESTAMP_NTZ,
payload VARIANT
)
CATALOG = 'SNOWFLAKE'
BASE_LOCATION = 'events/'
ICEBERG_VERSION = 3;
-- 2. The streaming pipe (extracts typed fields from the SDK's VARIANT payload)
CREATE OR REPLACE PIPE events_pipe
AS COPY INTO events (event_id, event_ts, payload)
FROM (
SELECT $1:event_id::STRING,
$1:event_ts::TIMESTAMP_NTZ,
$1:payload::VARIANT
FROM TABLE(DATA_SOURCE(TYPE => 'STREAMING'))
);
Snowpipe Streaming’s high-performance architecture supports both v2 and v3, but omitting the parameter defaults the table to v2.
Next, the consumer:
from snowflake.ingest.streaming import StreamingIngestClient
# SPCS injects credentials automatically - no keys, no secrets
props = {
"account": "YOUR_ACCOUNT",
"user": "YOUR_USER",
"role": "STREAMING_SERVICE_ROLE",
"url": "https://YOUR_ACCOUNT.snowflakecomputing.com",
"authorization_type": "SPCS",
"spcs_token_path": "/snowflake/session/token",
}
# Connect to the pipe
client = StreamingIngestClient(
client_name="my_consumer",
db_name="STREAMING_DEMO",
schema_name="PUBLIC",
pipe_name="events_pipe",
properties=props,
)
# Open a channel and stream rows
channel, status = client.open_channel("ch_1")
for i, row in enumerate(generate_load()):
channel.append_row(row, offset_token=str(i))
# Close cleanly
channel.close()
client.close()
Then you deploy the consumer to SPCS with a short service spec. And you watch it land:
SELECT
COUNT(*) AS rows_landed,
MAX(event_ts) AS latest_event
FROM
streaming_demo.public.events;
Java, Node and the REST interface follow the same shape: open a channel, insert rows, flush. There's a working example for each in the repo, so you can test whichever matches your stack.
To try this yourself you can check out the repo.
But be aware that the Streaming SDK uses a separate ingest endpoint over HTTPS, so even if you are running inside Snowflake you need to grant an external access integration that allows egress back to *.snowflakecomputing.com
.
Best practices
Snowpipe Streaming batches for you
Snowpipe Streaming doesn't write a file per row. The SDK sends rows as soon as you call appendRows
, but a server-side buffering tier absorbs them and decides commit timing on its own, batching under the hood so you're never shipping a file per row.
On top of that, Snowflake runs automatic compaction in the background for Snowflake-managed Iceberg tables where Snowflake is the sole writer: Small Parquet files get merged into larger ones, and small manifests get compacted too. You don't schedule it or run it; it's bundled into normal operation.
What you can do:
- Batch rows client-side before calling
appendRows
: Sending rows one at a time still means one roundtrip per row; batching them into a single call amortizes that overhead, the same principle behind Snowflake's own guidance to compress and send more data per request. - Keep channels long-lived: Open a channel once per source partition and leave it open for the life of the job instead of opening and closing per micro-batch. It's Snowflake's documented best practice for Snowpipe Streaming, and it cuts overhead without fighting the batching already happening underneath.
- Set
TARGET_FILE_SIZE
on the table: This is a table-level property, independent of the SDK, that tells Snowflake what size to target for both new writes and background compaction, no matter how the data got there. - Let throughput do the work: The higher your sustained TPS, the faster the server-side buffer fills and flushes on its own, which effectively results in a trade off between throughput and latency for a given file size.
What's coming: Iceberg v4
Snowpipe Streaming and automatic compaction address the physical small-files problem, but frequent commits can still create overhead in Iceberg’s metadata tree. Each commit currently writes a new metadata JSON, manifest list and manifest — even when it contains only one small file. For workloads that commit every few seconds, that repeated metadata work can become the bottleneck.
The Iceberg v4 proposal introduces an Adaptive Metadata Tree to reduce that write amplification. Instead of creating a new manifest for every small commit, the root manifest can inline those commits. A single Parquet write and an atomic pointer swap replace the current chain, keeping metadata I/O per commit constant rather than scaling with manifest count. For high-frequency streaming workloads, that can dramatically improve streaming latency.
Streaming is one of the hero scenarios for Iceberg v4: Workloads that commit every few seconds expose metadata-write amplification directly, making the benefits of the Adaptive Metadata Tree especially relevant. The v4 spec is still evolving, but it’s worth watching if Iceberg streaming is on your roadmap. Snowflake is proud to participate actively in shaping the future of the format.
What this means for your architecture
In this post, we demonstrated how effective Snowpipe Streaming into Iceberg can be. At the kind of load at which a serious media or telco platform runs, with with no S3 bucket, EKS cluster, Kafka topic, or IAM role required for this test setup, the workload ran inside Snowflake and could be torn down after the evaluation.
The infrastructure that normally sits between a team and a streaming test, the buckets and clusters and auth and sign-offs, isn't a prerequisite. You can answer, "Does this meet our requirements quickly?".
If you're on the Site Reliability Engineering (SRE) or Data Engineering side of a large media or telco platform and Iceberg streaming is on the roadmap, start with the test, not the procurement cycle. We invite you to clone the repo, deploy to SPCS and watch it run.
- Try it now with the GitHub repo
- Go deeper by exploring the Snowpipe Streaming High-Performance Architecture documentation
For a team trying to find out whether Snowpipe Streaming holds up at 1M+ TPS, you want the shortest path to a real answer. Streaming at scale has a reputation. It's the workload teams put off, because standing it up entails S3 buckets, an EKS cluster, Kafka topics, IAM policies, a security review and sign-off from three platform teams who each have their own backlogs. That setup can require additional infrastructure provisioning and coordination before testing begins. Proving these pipelines work at the scale and handle production volume is usually its own project.
In our demo environment, we were able to set up and run this evaluation in an afternoon. You can use our Snowpipe Streaming High-Performance Architecture to stream data into Apache Iceberg™ format at over 1M TPS, entirely inside Snowflake infrastructure. A container running in Snowpark Container Services (SPCS) generates the load, streams it through the SDK and lands it in a Snowflake-managed Iceberg table. That makes it ready to query in Snowflake right away, with role-based access control (RBAC), lineage and masking all applied as it arrives. In our test environment, we stood up the demo, tested it end to end, measured throughput and tore it down in an afternoon, as we did in our test.
This post will walk you through how to actually build an end to end streaming to Iceberg demo, using this GitHub Repo. This example is in python but you can test the SDK options (Java, Python, Node, REST), so that you can credibly recommend this to your business with real results to show.
Architecture diagram: The pattern
We wanted to build a demo where everything runs inside Snowflake infrastructure. Multiple Docker containers running in Snowpark Container Services (SPCS) generate synthetic test data at your target transactions per second and stream it using the Snowpipe Streaming SDK. It lands in a Snowflake-managed Iceberg table: open format, queryable within seconds of landing, governed in Snowflake. Authentication is easy: SPCS injects a short-lived OAuth token into the container telling the Streaming SDK to use it. You don't need to manage any secrets.
Why SPCS to generate the load?
To be clear, Snowpipe Streaming doesn't need SPCS. The SDK runs anywhere: your laptop, an EC2 box, a Kubernetes pod.
Putting it in SPCS is what gets you to the test faster since the service runs entirely on infrastructure Snowflake already manages, with nothing new to provision or additional sign-offs to manage for the test itself.
Landing directly into Iceberg
The target is a Snowflake-managed Iceberg table. Rows stream in through the SDK and land as Parquet with Iceberg metadata, managed by Snowflake. Point it at your own S3 external volume later if you want, or leave it managed after the evaluation. The code stays the same either way.
For the evaluation it means less setup. A table on Snowflake managed storage skips the external volume, storage integration and cloud storage permissions you'd otherwise have to configure first.
When you're ready to productionize, you've got three clear paths:
- Snowflake-managed Iceberg with an external volume: Parquet files are stored in your S3 bucket. An external engine reads the Parquet files directly from S3, using the Horizon REST Catalog for metadata.
- Snowflake-managed Iceberg on Snowflake storage: The files are in Snowflake's internal storage. This option avoids configuring an external volume and associated cloud storage. Leverages Iceberg features for compatibility going forward.
- Native Snowflake table: No separately managed external storage infrastructure is required for this configuration.
Demo: See it running
When you run the demo script you can see the SPCS service starts, the producer begins generating the load, and the consumer streams it into the Iceberg table.
You can switch to Snowsight, and see the row count climb here as well — millions of rows, queryable as they land.
The code: Building it yourself
To help understand how this all works, here is some pseudocode to help visualize how this works. The full code is in the repo, and there are several alternative demos linked below.
Start with a Snowflake-managed Iceberg table and a pipe:
-- 1. The target table
CREATE OR REPLACE ICEBERG TABLE events (
event_id STRING,
event_ts TIMESTAMP_NTZ,
payload VARIANT
)
CATALOG = 'SNOWFLAKE'
BASE_LOCATION = 'events/'
ICEBERG_VERSION = 3;
-- 2. The streaming pipe (extracts typed fields from the SDK's VARIANT payload)
CREATE OR REPLACE PIPE events_pipe
AS COPY INTO events (event_id, event_ts, payload)
FROM (
SELECT $1:event_id::STRING,
$1:event_ts::TIMESTAMP_NTZ,
$1:payload::VARIANT
FROM TABLE(DATA_SOURCE(TYPE => 'STREAMING'))
);
Snowpipe Streaming’s high-performance architecture supports both v2 and v3, but omitting the parameter defaults the table to v2.
Next, the consumer:
from snowflake.ingest.streaming import StreamingIngestClient
# SPCS injects credentials automatically - no keys, no secrets
props = {
"account": "YOUR_ACCOUNT",
"user": "YOUR_USER",
"role": "STREAMING_SERVICE_ROLE",
"url": "https://YOUR_ACCOUNT.snowflakecomputing.com",
"authorization_type": "SPCS",
"spcs_token_path": "/snowflake/session/token",
}
# Connect to the pipe
client = StreamingIngestClient(
client_name="my_consumer",
db_name="STREAMING_DEMO",
schema_name="PUBLIC",
pipe_name="events_pipe",
properties=props,
)
# Open a channel and stream rows
channel, status = client.open_channel("ch_1")
for i, row in enumerate(generate_load()):
channel.append_row(row, offset_token=str(i))
# Close cleanly
channel.close()
client.close()
Then you deploy the consumer to SPCS with a short service spec. And you watch it land:
SELECT
COUNT(*) AS rows_landed,
MAX(event_ts) AS latest_event
FROM
streaming_demo.public.events;
Java, Node and the REST interface follow the same shape: open a channel, insert rows, flush. There's a working example for each in the repo, so you can test whichever matches your stack.
To try this yourself you can check out the repo.
But be aware that the Streaming SDK uses a separate ingest endpoint over HTTPS, so even if you are running inside Snowflake you need to grant an external access integration that allows egress back to *.snowflakecomputing.com
.
Best practices
Snowpipe Streaming batches for you
Snowpipe Streaming doesn't write a file per row. The SDK sends rows as soon as you call appendRows
, but a server-side buffering tier absorbs them and decides commit timing on its own, batching under the hood so you're never shipping a file per row.
On top of that, Snowflake runs automatic compaction in the background for Snowflake-managed Iceberg tables where Snowflake is the sole writer: Small Parquet files get merged into larger ones, and small manifests get compacted too. You don't schedule it or run it; it's bundled into normal operation.
What you can do:
- Batch rows client-side before calling
appendRows
: Sending rows one at a time still means one roundtrip per row; batching them into a single call amortizes that overhead, the same principle behind Snowflake's own guidance to compress and send more data per request. - Keep channels long-lived: Open a channel once per source partition and leave it open for the life of the job instead of opening and closing per micro-batch. It's Snowflake's documented best practice for Snowpipe Streaming, and it cuts overhead without fighting the batching already happening underneath.
- Set
TARGET_FILE_SIZE
on the table: This is a table-level property, independent of the SDK, that tells Snowflake what size to target for both new writes and background compaction, no matter how the data got there. - Let throughput do the work: The higher your sustained TPS, the faster the server-side buffer fills and flushes on its own, which effectively results in a trade off between throughput and latency for a given file size.
What's coming: Iceberg v4
Snowpipe Streaming and automatic compaction address the physical small-files problem, but frequent commits can still create overhead in Iceberg’s metadata tree. Each commit currently writes a new metadata JSON, manifest list and manifest — even when it contains only one small file. For workloads that commit every few seconds, that repeated metadata work can become the bottleneck.
The Iceberg v4 proposal introduces an Adaptive Metadata Tree to reduce that write amplification. Instead of creating a new manifest for every small commit, the root manifest can inline those commits. A single Parquet write and an atomic pointer swap replace the current chain, keeping metadata I/O per commit constant rather than scaling with manifest count. For high-frequency streaming workloads, that can dramatically improve streaming latency.
Streaming is one of the hero scenarios for Iceberg v4: Workloads that commit every few seconds expose metadata-write amplification directly, making the benefits of the Adaptive Metadata Tree especially relevant. The v4 spec is still evolving, but it’s worth watching if Iceberg streaming is on your roadmap. Snowflake is proud to participate actively in shaping the future of the format.
What this means for your architecture
In this post, we demonstrated how effective Snowpipe Streaming into Iceberg can be. At the kind of load at which a serious media or telco platform runs, with with no S3 bucket, EKS cluster, Kafka topic, or IAM role required for this test setup, the workload ran inside Snowflake and could be torn down after the evaluation.
The infrastructure that normally sits between a team and a streaming test, the buckets and clusters and auth and sign-offs, isn't a prerequisite. You can answer, "Does this meet our requirements quickly?".
If you're on the Site Reliability Engineering (SRE) or Data Engineering side of a large media or telco platform and Iceberg streaming is on the roadmap, start with the test, not the procurement cycle. We invite you to clone the repo, deploy to SPCS and watch it run.
- Try it now with the GitHub repo
- Go deeper by exploring the Snowpipe Streaming High-Performance Architecture documentation
决策记录链 · 只追加
每次领取产生一条记录,重新决策追加一条并以 supersedes 指向被替代的记录(ADR 0014)。
这条决策早于决策账本(2026-10-08 起逐条追加),没有追加记录。