Cloud Data Platforms and Managed Services Questions
Evaluating and choosing among managed cloud data platform PRODUCTS: cloud data warehouses (Snowflake, BigQuery, Redshift, Synapse) as vendor options, the storage-and-compute-separation model as a purchasing and operating decision, serverless versus provisioned compute models, warehouse and streaming-service sizing and capacity planning, concurrency and workload management as a platform operating concern, pricing-model comparison and platform-level cost trade-offs, vendor lock-in and portability, platform-to-platform migration, and the recurring managed-versus-self-managed decision applied to warehouses, databases, streaming, and ETL/orchestration services. Focuses on platform SELECTION and operation as a product, not designing the ingestion pipelines, ETL transform patterns, or streaming processing logic that run on top of a chosen platform, and not a single vendor's certification trivia.
You are ingesting 10,000 events per second, averaging 2KB each, into a managed streaming service such as Kinesis Data Streams. Calculate how many shards you need, showing your assumptions and arithmetic, and describe how you would scale shard count up without losing data or disrupting consumers.
Sample Answer
Direct answer. At 10,000 events/second averaging 2KB each, you need 20 shards, and the binding constraint is throughput, not record count.
Structured elaboration. Each Kinesis shard has two independent write limits, and whichever one you hit first is the one that matters:
limit1=1,000 records/sec
limit2=1 MiB/sec
With a 2KB average record size, the throughput limit binds well before the record-count limit does. Convert the throughput limit into an equivalent records/sec figure at this record size:
records/sec before hitting the 1 MiB/sec cap=2 KB1×1024 KB=512 records/sec per shard
Since 512 records/sec is well below the 1,000 records/sec cap, throughput is the binding constraint per shard, not record count. Total required shard count:
shards=⌈512 events/sec per shard10,000 events/sec⌉=20
Cross-checking directly in raw bytes: total ingest is $10{,}000 \times 2\text{KB} = 20{,}000 \text{ KB/sec} \approx 19.53 \text{ MiB/sec}$, and $19.53 / 1 = 19.53$, which rounds up to 20 shards, matching the record-based calculation exactly (both approaches must agree, since they measure the same binding constraint two ways).
events_per_sec = 10_000
avg_kb = 2
bytes_per_sec = events_per_sec * avg_kb * 1024
mb_per_sec = bytes_per_sec / (1024 * 1024)
print(f"total throughput: {mb_per_sec:.2f} MiB/sec") # 19.53 MiB/sec
shard_mb_limit = 1.0
shard_record_limit = 1000
records_per_shard_before_mb_cap = (shard_mb_limit * 1024) / avg_kb
effective_capacity_per_shard = min(records_per_shard_before_mb_cap, shard_record_limit)
print(f"binding per-shard capacity: {effective_capacity_per_shard:.0f} records/sec") # 512
import math
shards_needed = math.ceil(events_per_sec / effective_capacity_per_shard)
print(f"shards needed: {shards_needed}") # 20
Running this script prints total throughput: 19.53 MiB/sec, binding per-shard capacity: 512 records/sec, and shards needed: 20, confirming both derivations.
Worked example: scaling shard count without losing data. To scale up, split individual shards (a shard-split operation) rather than tearing down and rebuilding the stream. A split takes one shard and divides its hash-key range into two child shards, each inheriting half the original's capacity; Kinesis keeps the parent shard readable until all its existing records have been consumed, so no data is lost during the transition. Well-behaved consumers using the Kinesis Client Library detect the parent shard's CLOSED status, finish draining it, then automatically discover and start consuming the new child shards, so a properly implemented consumer experiences no data loss and only a brief period of reduced parallelism while it catches up on the closing parent shard. Plan splits ahead of an anticipated growth event (do not wait until you are already throttling), since a split takes a small amount of time to propagate and briefly affects write availability on the shard being split.
Trade-offs and pitfalls. This calculation assumes traffic is spread evenly across shards, but an uneven partition-key distribution can create a hot shard that throttles well before the stream's aggregate 20-shard capacity is reached; monitor per-shard WriteProvisionedThroughputExceeded metrics, not just aggregate throughput, to catch this. Also budget headroom above the bare-minimum 20 shards, since traffic bursts above the 2KB average or above 10,000 events/sec will throttle a stream sized to the exact average; many teams provision 20-30% above the calculated minimum specifically to absorb normal variance without constant resharding.
You're evaluating managed cloud data warehouse platforms (Snowflake, BigQuery, and Redshift) for a fast-growing analytics team. Walk through the criteria you would use to compare them (architecture model, concurrency handling, pricing model, storage format support, and operational overhead) and make a recommendation for a specific team size and query pattern.
Sample Answer
Direct answer. Compare Snowflake, BigQuery, and Redshift on five axes: architecture model (how compute and storage separate), concurrency handling, pricing model, storage format support, and operational overhead. There is no universal winner; the right choice depends on your team's existing cloud, your query concurrency profile, and how predictable your workload is.
Structured elaboration.
| Criterion | Snowflake | BigQuery | Redshift |
|---|---|---|---|
| Architecture | Multi-cluster, shared-data: storage fully decoupled from compute "virtual warehouses" | Fully serverless: no clusters to manage, Google allocates slots per query | Cluster-based (or Serverless): nodes hold both compute and a share of storage, RA3 nodes decouple storage |
| Concurrency | Scale out via multi-cluster warehouses, each query set can get its own warehouse | Handled by Google's shared slot pool; reservations isolate teams | Managed via WLM queues and Concurrency Scaling (temporary extra clusters) |
| Pricing | Per-second compute credits while a warehouse runs, separate storage cost | On-demand per-byte-scanned or capacity-based slot reservations (BigQuery Editions) | Per-node-hour (provisioned) or per-RPU (Serverless) |
| Storage format | Proprietary micro-partitions, but supports external tables over open formats | Proprietary columnar storage, plus native support for querying Iceberg/external tables | Proprietary columnar, Redshift Spectrum for querying S3 directly |
| Operational overhead | Low: auto-suspend, auto-resume, minimal tuning knobs | Lowest: nothing to provision or pause | Higher: cluster sizing, vacuum/analyze maintenance (provisioned mode) |
Three platform-specific units in that table are worth defining plainly, since the question is explicitly asking about concurrency handling and pricing: a Snowflake compute credit is its per-second billing unit for warehouse compute, so a bigger or longer-running warehouse simply burns credits faster. A BigQuery slot is the platform's unit of parallel query-processing capacity; the "shared slot pool" is the pot of these units Google draws from to run your query, and a slot reservation just reserves a guaranteed number of them for you instead of sharing the pool with every other BigQuery customer. A Redshift WLM (Workload Management) queue is a named lane that routes a query to a specific, bounded share of the cluster's memory and concurrency; hitting a concurrency limit means that particular queue's lane is full, not that the whole cluster is out of capacity.
Worked example. For a fast-growing team with roughly 500 analysts running around 10,000 BI queries a day against a 10TB active dataset, concurrency handling is the deciding factor more than raw performance: Snowflake's ability to spin up independent warehouses per team or workload avoids one group's heavy queries starving another's dashboard, and its per-second billing means idle warehouses cost nothing when auto-suspended. BigQuery is an equally strong fit if the team is already GCP-native and wants zero cluster management, especially if the query pattern is bursty rather than continuously heavy, since on-demand pricing avoids paying for idle capacity at all. Redshift becomes the stronger choice when the workload is large and steady enough that reserved/provisioned capacity is cheaper than pay-per-use, or when the team already has deep AWS-ecosystem integration (IAM, Glue, Lake Formation) that reduces the value of switching platforms. At petabyte scale with a high-concurrency BI user base, total cost of ownership becomes the deciding axis rather than raw price-per-query, since the storage-versus-compute separation and auto-scaling behavior of Snowflake or BigQuery tend to avoid the manual capacity-planning overhead that a large provisioned Redshift cluster requires, while a spiky, bursty query pattern specifically favors either platform's auto-scaling over a fixed-size cluster.
Trade-offs and pitfalls. Benchmarking these platforms fairly is hard: comparing default settings without tuning distribution/clustering keys, using a dataset too small to expose real concurrency behavior, or ignoring egress and data-transfer cost between your existing systems and the new platform will all produce misleading conclusions. Vendor lock-in is real in all three directions (proprietary SQL extensions, proprietary storage formats, ecosystem integrations), so weigh switching cost alongside today's price and performance, not just today's benchmark numbers.
As a senior data engineer, you are asked to lead a cross-functional migration from an on-prem data warehouse to BigQuery. Describe a plan that covers stakeholder alignment, training for analysts and engineers, cost governance, phased data migration and validation, and how you would handle resistance from teams and demonstrate business impact.
Sample Answer
Direct answer. Leading a cross-functional migration from an on-prem data warehouse to BigQuery requires securing stakeholder alignment before any technical work starts, running the technical migration in validated phases, and actively managing the organizational change, since resistance from teams whose workflows are disrupted is usually a bigger risk to the migration's success than any technical obstacle.
Structured elaboration.
- Stakeholder alignment. Before migration begins, identify every team whose workflow depends on the current warehouse (BI, data science, finance reporting, any downstream application), and get explicit agreement on the migration timeline, the acceptable disruption window, and what success looks like for each of them specifically, not just for the platform team running the migration.
- Training. Analysts and engineers accustomed to the on-prem platform's SQL dialect and tooling need structured training before their workflows depend on BigQuery, not documentation handed out after cutover; run hands-on sessions using each team's own real reports and queries, not generic training material, so the training directly addresses the workflows people will actually use.
- Cost governance. Establish budget alerts, cost-attribution tagging, and a review cadence from day one of the migration, since cloud warehouse billing is unfamiliar territory for a team used to a largely fixed on-prem hardware cost, and an unexpected bill is one of the fastest ways to lose executive sponsorship for the migration.
- Phased migration and validation. Migrate in phases, starting with a lower-risk, well-understood workload to build confidence and surface unknowns cheaply, before moving the highest-visibility, highest-risk workloads; validate each phase's data and query results against the on-prem system in parallel before declaring it complete and moving to the next phase.
- Handling resistance. Resistance usually comes from real, specific pain points, a report that is now slower, a workflow that broke, a number that looks different, not from abstract change-aversion; treat each piece of resistance as a signal pointing at a genuine gap to close (a missing training session, an unmigrated edge case, an unaddressed performance regression) rather than an obstacle to push through.
- Demonstrating business impact. Track and communicate concrete before-and-after metrics (query latency, report freshness, cost, analyst-reported satisfaction) throughout the migration, not just at the end, so stakeholders see continuous evidence the migration is delivering value rather than only hearing about it once everything is finished.
Worked example. When the finance team's month-end close reports, the organization's highest-stakes and most scrutinized numbers, showed resistance to migrating even after other teams had successfully moved, the underlying cause was a legitimate one: an early validation pass had surfaced a rounding-behavior difference between the on-prem platform's and BigQuery's aggregate functions that finance had good reason not to trust yet. Rather than pushing the migration forward on schedule, the team paused finance's migration specifically, root-caused and fixed the rounding discrepancy, ran an extended parallel-run period specifically for finance's reports with finance's own sign-off criteria, and only then completed their migration, weeks behind the original plan but with finance's full confidence intact, which mattered more for the migration's long-term credibility than hitting the original date.
Trade-offs and pitfalls. The most consequential leadership mistake in this kind of migration is treating resistance as a communication problem to manage rather than a signal to investigate; the finance example above only resolved well because the team took the resistance seriously as evidence of a real gap rather than pushing through on schedule. Sequencing also matters: migrating the lowest-risk workload first builds organizational trust and surfaces technical unknowns cheaply, while starting with the highest-visibility workload risks a visible, damaging failure early in the process when the organization's confidence in the migration is still fragile.
How would you troubleshoot an Azure Data Factory pipeline that intermittently fails while copying large files to ADLS with a 403 Forbidden error? List the diagnostic steps, logs to check, and remediation actions.
Sample Answer
Direct answer
An intermittent, not constant, 403 Forbidden error on an Azure Data Factory (ADF) pipeline copying to Azure Data Lake Storage (ADLS) almost always points to a permission or network-path issue that is itself intermittent, since a genuinely wrong role assignment would fail every single run, not just some of them. Start by reading the copy activity's actual error sub-code, not just the generic 403, then work through the specific intermittent causes in order: multiple integration runtimes with different network paths, a storage firewall rule that only sometimes matches the calling runtime's egress address, and credential or token expiry mid-window.
Structured elaboration
Diagnostic steps, in order.
- Open the failed run in ADF's monitoring view and read the copy activity's actual error message and error code. Azure typically returns a specific sub-code, such as
AuthorizationPermissionMismatch,AuthorizationFailure, or a firewall-specific denial message, that narrows the cause immediately, far more than the generic "403 Forbidden" alone. - Check which specific runs failed versus succeeded: the same file size and time of day every time, or apparently random; the same integration runtime every time, or does the pipeline use more than one (a self-hosted runtime alongside an Azure-managed one) with potentially different network paths and therefore different authorization outcomes.
- Check the managed identity's actual role assignment on the target storage account, for example Storage Blob Data Contributor, against what the specific operation actually needs; a copy that also has to list or create the destination path needs more than a read-only role.
- Check the storage account's network rules: firewall rules, virtual network rules, and private endpoint configuration. If the storage account restricts access to specific address ranges, an integration runtime whose egress address is not always the same, a shared, non-static Azure-managed runtime, for example, can pass the firewall check on some runs and fail on others purely from which address it happened to egress from.
- Check credential and token expiry. If authentication uses a shared access signature or a service principal secret with an expiry date, a pipeline that ran fine for weeks and then starts failing intermittently, especially clustered around a specific calendar date, points directly at an expiring or recently rotated credential that has not yet propagated everywhere it is used.
Logs to check. The ADF pipeline run's own activity-level error output is the first and most direct source. Azure Storage's diagnostic logs, if enabled, for the specific failed requests, filtered by the correlation or request identifier from the ADF error, show the storage side's own recorded reason for denying the request. Azure Monitor or Log Analytics, if the storage account's diagnostic settings feed into it, gives a searchable history of 403s over time, which is what actually establishes the real failure pattern from step 2 rather than guessing from a handful of anecdotal failures.
Remediation actions.
- Grant the correct, specific role to the managed identity or service principal actually in use, rather than a broader role granted "just in case," which trades security posture for a fix that may not even address the real cause.
- Add the integration runtime's actual egress address range to the storage firewall's allow list, or move to a managed virtual network integration runtime with a private endpoint so the network path is consistent and no longer depends on a shared, changing public address.
- Rotate credentials, and, more importantly, monitor their expiry with an alert well before the actual expiry date, not only after failures have already started.
- Standardize on a single integration runtime, or a known, fixed set, for this pipeline if multiple runtimes with different authorization outcomes turn out to be the root cause, rather than letting ADF route between them unpredictably.
Worked example
A pipeline fails on 8 of its last 100 runs over the past month, an 8 percent failure rate, and all 8 failures land in a 15-minute window each morning between roughly 06:00 and 06:15. Investigation shows the pipeline uses the default Azure integration runtime, not self-hosted and not a fixed private-endpoint path, drawing from a shared, Microsoft-managed address pool that is not guaranteed static. On those 8 mornings, the runtime happened to egress from an address not yet reflected in the storage account's allow list, which had been updated the day before for a different, narrower range.
Remediation moves the pipeline to a managed virtual network integration runtime with a private endpoint to ADLS, removing any dependency on a public-address allow list entirely. After the change, 0 of the next 60 runs fail with a 403, versus the prior 8 percent rate.
Trade-offs and pitfalls
Broadening the storage firewall to allow a wide address range simply to make the errors stop trades away real security posture for convenience, and should be treated as a last resort, not the first fix reached for. The private-endpoint-based remediation used above is the more durable long-term fix, because it removes the address-matching fragility structurally rather than papering over it with a wider allow list.
Assuming "403 always means the role assignment is wrong" and re-granting broader roles without first reading the actual sub-code wastes remediation cycles chasing the wrong fix, and can also over-provision access that was never the actual problem.
You need to scale ADF copy pipelines to perform 1000 parallel file copies between storage accounts without overwhelming network egress or hitting service limits. Provide an architecture and configuration plan including Integration Runtime sizing, parallelism throttles, retries/backoff, and monitoring.
Sample Answer
Direct answer
Scaling Azure Data Factory (ADF) to 1,000 parallel file copies safely means the real constraint is not ADF's own orchestration capacity, it is the Integration Runtime's throughput ceiling and the target storage account's own service limits. The design has to size Integration Runtime capacity deliberately, cap parallelism below what would trip a service-level throttle rather than as high as possible, and build in backoff specifically for throttling responses, not just generic failure retries.
Structured elaboration
Integration Runtime sizing. For a copy-heavy workload at this scale, size either an Azure-managed Integration Runtime, with appropriately allocated data integration units per copy activity, or a self-hosted Integration Runtime cluster, if network path or security requirements demand it, for sustained throughput at the target parallelism, not just burst capacity. Under-provisioned Integration Runtime capacity becomes the bottleneck regardless of how high the pipeline's own parallelism setting is configured.
Parallelism throttles. Cap actual concurrent copy activity executions at a level tested against the specific target storage account's documented request-rate limits, not all 1,000 simultaneously, since a storage account's documented request-per-second limits can plausibly be exceeded by truly simultaneous copy operations depending on file size and request pattern. The safe design processes the 1,000 files in controlled batches, 50 concurrent at a time, for example, rather than launching all 1,000 as one unbounded burst.
Retries and backoff. Handle storage-service throttling responses specifically with exponential backoff tied to the service's own retry-after guidance where it is provided, distinct from a generic fixed-delay policy used for other failure types. Retrying a throttled request immediately or aggressively just extends the throttling window rather than recovering from it.
Monitoring. Track actual throughput and request rate against the target storage account's documented limits continuously, not only alert after a batch of copies has already failed from throttling, so the batch size or concurrency setting can be tuned proactively as volumes grow, rather than reactively after an incident. Monitor network egress specifically if the copy crosses regions or accounts with real bandwidth-cost implications, not only success and failure counts.
Worked example
As a reference point, not a currently-verified exact figure since Azure's specific limits vary by account tier and should always be confirmed against current documentation, a storage account's documented request-rate ceiling is on the order of tens of thousands of requests per second. A single moderately sized file copy typically issues a handful of underlying storage requests, listing, reading blocks, writing blocks, roughly 5 to 10 as an illustrative estimate.
Batching 50 concurrent copies, each issuing up to 10 requests within a similar short window, produces a burst of up to:
50×10=500 requests
comfortably under a request-rate ceiling on the order of tens of thousands, with wide margin. The same arithmetic for a naive, fully simultaneous 1,000-copy approach:
1000×10=10000 requests
sits far closer to that ceiling, and combined with normal variance and any other concurrent traffic against the same account, risks tripping throttling, exactly the risk the controlled-batching design avoids.
Trade-offs and pitfalls
Batching trades total wall-clock completion time for safety: processing 50 at a time necessarily takes longer than a hypothetical, riskier all-1,000-at-once approach, a deliberate trade of speed for reliability that should be sized against the actual deadline the 1,000-file copy needs to meet, not minimized purely for its own sake.
A fixed batch size chosen once at design time can become wrong later, either because the target storage account's own limits change with a tier upgrade, or because the file-size distribution being copied changes, larger files issue more underlying requests per copy, changing the request-rate arithmetic above. Batch size should be a periodically revisited, monitored parameter, not a permanent constant set once and forgotten.
Retry logic that does not distinguish throttling from other failure types, a genuine file-not-found error, for instance, wastes retry budget and backoff time on a failure category that backoff cannot fix at all.
Unlock Full Question Bank
Get access to all 36 Cloud Data Platforms and Managed Services interview questions and detailed answers.
Sign in to ContinueJoin thousands of developers preparing for their dream job.