Telemetry — MANDATORY. Every api.fabric.microsoft.com call must carry
x-ms-fabric-skill: hdinsight-migration (az rest: --headers "x-ms-fabric-skill=hdinsight-migration"),
including every LRO poll, fabric_lro and retry. Snippets omit it — add it anyway.
CRITICAL NOTES
- To find workspace details (including its ID) from a workspace name: list all workspaces, then use JMESPath filtering
- To find item details (including its ID) from workspace ID, item type, and item name: list all items of that type in that workspace, then use JMESPath filtering
- HDInsight has no
mssparkutils or dbutils equivalent — notebookutils is net-new capability being introduced
HiveContext and SQLContext are legacy Spark 1.x/2.x APIs — Fabric uses Spark 3.x SparkSession exclusively
wasb:// paths are deprecated and require a Storage Account key or SAS — replace with OneLake shortcuts
- Fabric cannot read or shortcut
hdfs:// directly. Its Pipeline HDFS connector supports Anonymous authentication only; export or bridge Kerberos sources to supported storage first.
HDInsight → Microsoft Fabric Migration
Prerequisite Knowledge
Read these companion documents before executing migration tasks:
- COMMON-CORE.md — Fabric REST API patterns, authentication, token audiences, item discovery
- COMMON-CLI.md —
az rest, az login, token acquisition, Fabric REST via CLI
- SPARK-AUTHORING-CORE.md — Notebook deployment, lakehouse creation, Spark job execution
For notebook and Lakehouse creation, see spark-cli.
For Fabric Warehouse DDL/DML authoring, see sqldw-cli.
Table of Contents
Migration Workload Map
| HDInsight Component |
Fabric Target |
Notes |
| Spark cluster (notebooks, scripts) |
Fabric Spark (Lakehouse / Notebooks / SJD) |
No persistent cluster — Starter Pool or Custom Pool provides on-demand Spark |
| Hive / HiveServer2 |
Lakehouse SQL Endpoint + Lakehouse schemas |
Delta Lake replaces Hive metastore; schemas provide namespace equivalent |
| HBase |
Fabric Warehouse or Azure Cosmos DB (separate from Fabric) |
HBase has no direct Fabric equivalent — assess workload access patterns |
| Oozie workflows |
Fabric Data Pipelines |
Map Oozie actions to Fabric activities; see § Oozie → Fabric Pipelines |
| YARN Resource Manager |
Fabric Spark monitoring (Spark UI, Monitoring Hub) |
No YARN — Fabric manages compute automatically |
| Ambari |
Fabric Monitoring Hub + Admin Portal |
Cluster health, capacity, and job monitoring |
| WASB / ABFS storage |
OneLake Shortcuts → abfss://workspace@onelake.dfs.fabric.microsoft.com/ |
See path-migration.md |
| Ranger policies |
Fabric workspace roles + OneLake data access roles |
Map Ranger row/column filters to Lakehouse row-level security |
| Livy REST server |
Fabric Livy API |
Compatible endpoint — see SPARK-AUTHORING-CORE.md |
SparkSession & Context API Changes
HDInsight Spark clusters often use legacy Spark 1.x / 2.x API styles. Replace all of these with the unified SparkSession:
| Legacy HDInsight Pattern |
Fabric Spark 3.x Replacement |
from pyspark import SparkContext; sc = SparkContext() |
Not needed — sc = spark.sparkContext (pre-instantiated) |
from pyspark.sql import HiveContext; hc = HiveContext(sc) |
Not needed — spark session has Hive-compatible SQL support via Delta schemas |
from pyspark.sql import SQLContext; sqlc = SQLContext(sc) |
Not needed — use spark.sql(...) directly |
SparkSession.builder.enableHiveSupport().getOrCreate() |
Not needed in Fabric — spark is pre-built and available |
sc.textFile("wasb://container@account.blob.core.windows.net/path") |
spark.read.text("abfss://workspace@onelake.dfs.fabric.microsoft.com/lh.Lakehouse/Files/path") |
sqlContext.sql("CREATE TABLE ... STORED AS ORC") |
See hive-to-delta.md for Delta DDL equivalent |
In Fabric notebooks, spark (SparkSession) and sc (SparkContext) are pre-instantiated — do not call SparkContext() or SparkSession.builder...getOrCreate() at the top of migrated notebooks.
Oozie → Fabric Pipelines
Map Oozie workflow actions to Fabric Data Pipeline activities:
| Oozie Action Type |
Fabric Pipeline Activity |
Notes |
<spark> action |
Notebook activity or Spark Job Definition activity |
Pass parameters via notebook cell parameters or SJD arguments |
<hive> action |
Script activity (SQL) against Lakehouse SQL Endpoint |
Convert HiveQL to Spark SQL or Delta SQL |
<shell> action |
Azure Function activity or Web activity |
Shell scripts must be refactored; no direct shell execution in Fabric Pipelines |
<java> action |
Azure Batch activity (external) or refactor to PySpark |
Java MapReduce jobs must be rewritten |
<sqoop> action |
Copy Data activity (Fabric Data Factory connector) |
Sqoop import/export maps to Fabric Copy Data with JDBC source/sink |
<coordinator> (time-based schedule) |
Pipeline schedule trigger |
Set recurrence in pipeline trigger; supports cron-like expressions |
<coordinator> (data-triggered) |
Storage Event trigger |
Trigger on OneLake file arrival |
Delegate to spark-cli for notebook and SJD creation after mapping pipeline activities.
Introducing notebookutils
HDInsight Spark had no built-in utility framework equivalent to mssparkutils or dbutils. When migrating to Fabric, introduce notebookutils for common operations:
| Operation |
Old HDInsight Approach |
notebookutils Equivalent |
| List files |
dbutils (N/A) / HDFS CLI |
notebookutils.fs.ls("abfss://...") |
| Copy file |
HDFS API / shutil |
notebookutils.fs.cp(src, dest) |
| Read secret |
Azure Key Vault REST call |
notebookutils.credentials.getSecret(keyVaultUrl, secretName) |
| Get notebook context |
Not available |
notebookutils.runtime.context — returns workspace ID, notebook ID, etc. |
| Run child notebook |
Not available |
notebookutils.notebook.run("notebook_name", timeout, {"param": "value"}) |
| Exit notebook with value |
sys.exit() |
notebookutils.notebook.exit("value") |
| Mount storage |
WASB config in spark-defaults.conf |
OneLake Shortcut (no runtime mount needed) |
Spark Configuration Differences
| HDInsight Concept |
Fabric Spark Equivalent |
Migration Action |
spark-defaults.conf (cluster-wide) |
Fabric Spark Workspace Settings + Environment item |
Move config properties to Environment or use %%configure in notebooks |
%%configure magic |
%%configure magic — identical |
No change needed |
| YARN queue / resource allocation |
Fabric Spark pool node size and autoscale settings |
Map queue SLAs to Custom Pool configuration |
| Ambari service configs (HDFS, YARN tuning) |
Not applicable — Fabric manages infrastructure |
Remove; focus on application-level Spark configs |
| HDI Spark version (e.g., Spark 2.4) |
Fabric Runtime 1.3 = Spark 3.5 (latest) |
Test for deprecated API removals (e.g., HiveContext, RDD-style ML) |
Conda environment / bootstrap.sh |
Fabric Environment item with custom libraries |
Recreate conda/pip dependencies in a Fabric Environment |
hive-site.xml (metastore connection) |
Not needed — Delta Lake IS the metastore in Fabric |
Remove metastore config; use Lakehouse schemas for namespace organization |
Must / Prefer / Avoid
MUST DO
- Replace all
wasb:// / wasbs:// paths with OneLake abfss:// paths or OneLake Shortcuts — wasb:// requires storage account keys which are not the Fabric-preferred auth model
- Replace
HiveContext, SQLContext, and standalone SparkContext() — use the pre-instantiated spark session in Fabric notebooks
- Migrate Hive DDL (
STORED AS ORC, LOCATION, TBLPROPERTIES) to Delta Lake DDL — see hive-to-delta.md
- Introduce
notebookutils for file system operations, secret retrieval, and child notebook orchestration where HDInsight used custom scripts or direct API calls
- Replace Oozie XML workflows with Fabric Data Pipelines — see § Oozie → Fabric Pipelines
- Align library management to Fabric Environments — remove
bootstrap.sh, conda envs, and runtime %pip install patterns for production workloads
- Treat
hdfs:// as source-cluster-only — export or ingest into ADLS Gen2 or OneLake; do not claim that a gateway adds Kerberos support to Fabric's Anonymous-only HDFS connector
PREFER
- OneLake Shortcuts over copying data — mount existing ADLS Gen2 containers as shortcuts to avoid re-ingestion during migration
- Delta Lake for all tables migrated from Hive ORC/Parquet — ACID guarantees, time travel, and schema enforcement improve data quality
- Fabric Starter Pool for initial migration validation — no pool configuration overhead, fast session startup
- Lakehouse schemas (database namespaces) for organizing migrated Hive databases — one schema per Hive database within a single Lakehouse
- Medallion architecture for restructuring migrated data layers during migration — align Bronze/Silver/Gold with raw Hive → validated Delta → serving Gold patterns
AVOID
- Do not use
SparkContext() or HiveContext() constructors in Fabric notebooks — they conflict with the pre-instantiated spark session and will raise errors
- Do not use
hive-site.xml or external Hive metastore configuration — Fabric's Delta Lake-backed Lakehouse IS the metastore
- Do not assume YARN queue mappings translate to Fabric pools — re-design resource allocation based on Fabric Spark pool SLAs
- Do not attempt to run Oozie shell actions or Java MapReduce jobs directly in Fabric — these must be refactored (see § Oozie → Fabric Pipelines)
- Do not use
%sh magic for file system operations in production notebooks — use notebookutils.fs.* for portability and OneLake token-based auth
Examples
See code-patterns.md for full before/after examples. Key quick references:
Legacy context → Fabric pre-instantiated session
# HDInsight (remove entirely)
from pyspark.sql import HiveContext
hc = HiveContext(sc)
# Fabric — use pre-instantiated spark directly
df = spark.sql("SELECT * FROM sales.fact_orders")
WASB path → OneLake path (after shortcut creation)
# HDInsight
df = spark.read.parquet("wasb://raw@myaccount.blob.core.windows.net/orders/")
# Fabric
df = spark.read.parquet("Files/raw/orders/")
Hive DDL → Delta DDL
-- HDInsight
CREATE TABLE sales_db.fact_orders (...) STORED AS ORC LOCATION 'wasb://...';
-- Fabric
CREATE SCHEMA IF NOT EXISTS sales_db;
CREATE TABLE sales_db.fact_orders (...) USING DELTA;
1---2name: hdinsight-migration3description: Ports HDInsight Spark and Hive workloads to Fabric, converting HiveContext and SparkContext to SparkSession, WASB and ABFS paths to OneLake shortcuts, Hive DDL to Delta tables in a Lakehouse, and Oozie coordinators and actions to pipeline activities and triggers. Use when the source workload is HDInsight.4---5
6> **Telemetry — MANDATORY.** Every `api.fabric.microsoft.com` call must carry
7> `x-ms-fabric-skill: hdinsight-migration` (`az rest`: `--headers "x-ms-fabric-skill=hdinsight-migration"`),
8> including every LRO poll, `fabric_lro` and retry. Snippets omit it — add it anyway.
9
10> **CRITICAL NOTES**
11> 1. To find workspace details (including its ID) from a workspace name: list all workspaces, then use JMESPath filtering
12> 2. To find item details (including its ID) from workspace ID, item type, and item name: list all items of that type in that workspace, then use JMESPath filtering
13> 3. HDInsight has no `mssparkutils` or `dbutils` equivalent — `notebookutils` is net-new capability being introduced
14> 4. `HiveContext` and `SQLContext` are legacy Spark 1.x/2.x APIs — Fabric uses Spark 3.x `SparkSession` exclusively
15> 5. `wasb://` paths are deprecated and require a Storage Account key or SAS — replace with OneLake shortcuts
16> 6. Fabric cannot read or shortcut `hdfs://` directly. Its Pipeline HDFS connector supports Anonymous authentication only; export or bridge Kerberos sources to supported storage first.
17
18# HDInsight → Microsoft Fabric Migration
19
20## Prerequisite Knowledge
21
22Read these companion documents before executing migration tasks:
23
24- [COMMON-CORE.md](../../common/COMMON-CORE.md) — Fabric REST API patterns, authentication, token audiences, item discovery
25- [COMMON-CLI.md](../../common/COMMON-CLI.md) — `az rest`, `az login`, token acquisition, Fabric REST via CLI
26- [SPARK-AUTHORING-CORE.md](../../common/SPARK-AUTHORING-CORE.md) — Notebook deployment, lakehouse creation, Spark job execution
27
28For notebook and Lakehouse creation, see [spark-cli](../spark-cli/SKILL.md).
29For Fabric Warehouse DDL/DML authoring, see [sqldw-cli](../sqldw-cli/SKILL.md).
30
31---
32
33## Table of Contents
34
35| Topic | Reference |
36|---|---|
37| Migration Workload Map | [§ Migration Workload Map](#migration-workload-map) |
38| SparkSession & Context API Changes | [§ SparkSession API Changes](#sparksession--context-api-changes) |
39| WASB / ABFS → OneLake Path Migration | [path-migration.md](resources/path-migration.md) |
40| Hive DDL → Delta Lake / Lakehouse Schemas | [hive-to-delta.md](resources/hive-to-delta.md) |
41| Oozie → Fabric Pipelines | [§ Oozie → Fabric Pipelines](#oozie--fabric-pipelines) |
42| Introducing `notebookutils` | [§ Introducing notebookutils](#introducing-notebookutils) |
43| Before/After Code Patterns | [code-patterns.md](resources/code-patterns.md) |
44| Spark Configuration Differences | [§ Spark Configuration Differences](#spark-configuration-differences) |
45| Must / Prefer / Avoid | [§ Must / Prefer / Avoid](#must--prefer--avoid) |
46| Authentication & Token Acquisition | [COMMON-CORE.md § Authentication](../../common/COMMON-CORE.md#authentication--token-acquisition) |
47| Lakehouse Management | [SPARK-AUTHORING-CORE.md § Lakehouse Management](../../common/SPARK-AUTHORING-CORE.md#lakehouse-management) |
48
49---
50
51## Migration Workload Map
52
53| HDInsight Component | Fabric Target | Notes |
54|---|---|---|
55| **Spark cluster** (notebooks, scripts) | Fabric Spark (Lakehouse / Notebooks / SJD) | No persistent cluster — Starter Pool or Custom Pool provides on-demand Spark |
56| **Hive / HiveServer2** | **Lakehouse SQL Endpoint** + Lakehouse schemas | Delta Lake replaces Hive metastore; schemas provide namespace equivalent |
57| **HBase** | **Fabric Warehouse** or **Azure Cosmos DB** (separate from Fabric) | HBase has no direct Fabric equivalent — assess workload access patterns |
58| **Oozie workflows** | **Fabric Data Pipelines** | Map Oozie actions to Fabric activities; see [§ Oozie → Fabric Pipelines](#oozie--fabric-pipelines) |
59| **YARN Resource Manager** | **Fabric Spark monitoring** (Spark UI, Monitoring Hub) | No YARN — Fabric manages compute automatically |
60| **Ambari** | **Fabric Monitoring Hub** + **Admin Portal** | Cluster health, capacity, and job monitoring |
61| **WASB / ABFS storage** | **OneLake Shortcuts** → `abfss://workspace@onelake.dfs.fabric.microsoft.com/` | See [path-migration.md](resources/path-migration.md) |
62| **Ranger policies** | **Fabric workspace roles** + **OneLake data access roles** | Map Ranger row/column filters to Lakehouse row-level security |
63| **Livy REST server** | **Fabric Livy API** | Compatible endpoint — see SPARK-AUTHORING-CORE.md |
64
65---
66
67## SparkSession & Context API Changes
68
69HDInsight Spark clusters often use legacy Spark 1.x / 2.x API styles. Replace all of these with the unified `SparkSession`:
70
71| Legacy HDInsight Pattern | Fabric Spark 3.x Replacement |
72|---|---|
73| `from pyspark import SparkContext; sc = SparkContext()` | Not needed — `sc = spark.sparkContext` (pre-instantiated) |
74| `from pyspark.sql import HiveContext; hc = HiveContext(sc)` | Not needed — `spark` session has Hive-compatible SQL support via Delta schemas |
75| `from pyspark.sql import SQLContext; sqlc = SQLContext(sc)` | Not needed — use `spark.sql(...)` directly |
76| `SparkSession.builder.enableHiveSupport().getOrCreate()` | Not needed in Fabric — `spark` is pre-built and available |
77| `sc.textFile("wasb://container@account.blob.core.windows.net/path")` | `spark.read.text("abfss://workspace@onelake.dfs.fabric.microsoft.com/lh.Lakehouse/Files/path")` |
78| `sqlContext.sql("CREATE TABLE ... STORED AS ORC")` | See [hive-to-delta.md](resources/hive-to-delta.md) for Delta DDL equivalent |
79
80> In Fabric notebooks, `spark` (SparkSession) and `sc` (SparkContext) are **pre-instantiated** — do not call `SparkContext()` or `SparkSession.builder...getOrCreate()` at the top of migrated notebooks.
81
82---
83
84## Oozie → Fabric Pipelines
85
86Map Oozie workflow actions to Fabric Data Pipeline activities:
87
88| Oozie Action Type | Fabric Pipeline Activity | Notes |
89|---|---|---|
90| `<spark>` action | **Notebook activity** or **Spark Job Definition activity** | Pass parameters via notebook cell parameters or SJD arguments |
91| `<hive>` action | **Script activity** (SQL) against Lakehouse SQL Endpoint | Convert HiveQL to Spark SQL or Delta SQL |
92| `<shell>` action | **Azure Function activity** or **Web activity** | Shell scripts must be refactored; no direct shell execution in Fabric Pipelines |
93| `<java>` action | **Azure Batch activity** (external) or refactor to PySpark | Java MapReduce jobs must be rewritten |
94| `<sqoop>` action | **Copy Data activity** (Fabric Data Factory connector) | Sqoop import/export maps to Fabric Copy Data with JDBC source/sink |
95| `<coordinator>` (time-based schedule) | **Pipeline schedule trigger** | Set recurrence in pipeline trigger; supports cron-like expressions |
96| `<coordinator>` (data-triggered) | **Storage Event trigger** | Trigger on OneLake file arrival |
97
98> **Delegate to `spark-cli`** for notebook and SJD creation after mapping pipeline activities.
99
100---
101
102## Introducing `notebookutils`
103
104HDInsight Spark had no built-in utility framework equivalent to `mssparkutils` or `dbutils`. When migrating to Fabric, introduce `notebookutils` for common operations:
105
106| Operation | Old HDInsight Approach | `notebookutils` Equivalent |
107|---|---|---|
108| List files | `dbutils` (N/A) / HDFS CLI | `notebookutils.fs.ls("abfss://...")` |
109| Copy file | HDFS API / `shutil` | `notebookutils.fs.cp(src, dest)` |
110| Read secret | Azure Key Vault REST call | `notebookutils.credentials.getSecret(keyVaultUrl, secretName)` |
111| Get notebook context | Not available | `notebookutils.runtime.context` — returns workspace ID, notebook ID, etc. |
112| Run child notebook | Not available | `notebookutils.notebook.run("notebook_name", timeout, {"param": "value"})` |
113| Exit notebook with value | `sys.exit()` | `notebookutils.notebook.exit("value")` |
114| Mount storage | WASB config in `spark-defaults.conf` | OneLake Shortcut (no runtime mount needed) |
115
116---
117
118## Spark Configuration Differences
119
120| HDInsight Concept | Fabric Spark Equivalent | Migration Action |
121|---|---|---|
122| `spark-defaults.conf` (cluster-wide) | Fabric **Spark Workspace Settings** + **Environment** item | Move config properties to Environment or use `%%configure` in notebooks |
123| `%%configure` magic | `%%configure` magic — **identical** | No change needed |
124| YARN queue / resource allocation | **Fabric Spark pool** node size and autoscale settings | Map queue SLAs to Custom Pool configuration |
125| Ambari service configs (HDFS, YARN tuning) | Not applicable — Fabric manages infrastructure | Remove; focus on application-level Spark configs |
126| HDI Spark version (e.g., Spark 2.4) | Fabric Runtime 1.3 = Spark 3.5 (latest) | Test for deprecated API removals (e.g., `HiveContext`, RDD-style ML) |
127| Conda environment / `bootstrap.sh` | **Fabric Environment** item with custom libraries | Recreate conda/pip dependencies in a Fabric Environment |
128| `hive-site.xml` (metastore connection) | Not needed — Delta Lake IS the metastore in Fabric | Remove metastore config; use Lakehouse schemas for namespace organization |
129
130---
131
132## Must / Prefer / Avoid
133
134### MUST DO
135- **Replace all `wasb://` / `wasbs://` paths** with OneLake `abfss://` paths or OneLake Shortcuts — `wasb://` requires storage account keys which are not the Fabric-preferred auth model
136- **Replace `HiveContext`, `SQLContext`, and standalone `SparkContext()`** — use the pre-instantiated `spark` session in Fabric notebooks
137- **Migrate Hive DDL** (`STORED AS ORC`, `LOCATION`, `TBLPROPERTIES`) to Delta Lake DDL — see [hive-to-delta.md](resources/hive-to-delta.md)
138- **Introduce `notebookutils`** for file system operations, secret retrieval, and child notebook orchestration where HDInsight used custom scripts or direct API calls
139- **Replace Oozie XML workflows** with Fabric Data Pipelines — see [§ Oozie → Fabric Pipelines](#oozie--fabric-pipelines)
140- **Align library management** to Fabric Environments — remove `bootstrap.sh`, conda envs, and runtime `%pip install` patterns for production workloads
141- **Treat `hdfs://` as source-cluster-only** — export or ingest into ADLS Gen2 or OneLake; do not claim that a gateway adds Kerberos support to Fabric's Anonymous-only HDFS connector
142
143### PREFER
144- **OneLake Shortcuts** over copying data — mount existing ADLS Gen2 containers as shortcuts to avoid re-ingestion during migration
145- **Delta Lake** for all tables migrated from Hive ORC/Parquet — ACID guarantees, time travel, and schema enforcement improve data quality
146- **Fabric Starter Pool** for initial migration validation — no pool configuration overhead, fast session startup
147- **Lakehouse schemas** (database namespaces) for organizing migrated Hive databases — one schema per Hive database within a single Lakehouse
148- **Medallion architecture** for restructuring migrated data layers during migration — align Bronze/Silver/Gold with raw Hive → validated Delta → serving Gold patterns
149
150### AVOID
151- **Do not use `SparkContext()` or `HiveContext()` constructors** in Fabric notebooks — they conflict with the pre-instantiated `spark` session and will raise errors
152- **Do not use `hive-site.xml` or external Hive metastore configuration** — Fabric's Delta Lake-backed Lakehouse IS the metastore
153- **Do not assume YARN queue mappings translate to Fabric pools** — re-design resource allocation based on Fabric Spark pool SLAs
154- **Do not attempt to run Oozie shell actions or Java MapReduce jobs** directly in Fabric — these must be refactored (see [§ Oozie → Fabric Pipelines](#oozie--fabric-pipelines))
155- **Do not use `%sh` magic for file system operations** in production notebooks — use `notebookutils.fs.*` for portability and OneLake token-based auth
156
157---
158
159## Examples
160
161See [code-patterns.md](resources/code-patterns.md) for full before/after examples. Key quick references:
162
163**Legacy context → Fabric pre-instantiated session**
164
165```python
166# HDInsight (remove entirely)
167from pyspark.sql import HiveContext
168hc = HiveContext(sc)
169
170# Fabric — use pre-instantiated spark directly
171df = spark.sql("SELECT * FROM sales.fact_orders")
172```
173
174**WASB path → OneLake path (after shortcut creation)**
175
176```python
177# HDInsight
178df = spark.read.parquet("wasb://raw@myaccount.blob.core.windows.net/orders/")
179
180# Fabric
181df = spark.read.parquet("Files/raw/orders/")
182```
183
184**Hive DDL → Delta DDL**
185
186```sql
187-- HDInsight
188CREATE TABLE sales_db.fact_orders (...) STORED AS ORC LOCATION 'wasb://...';
189
190-- Fabric
191CREATE SCHEMA IF NOT EXISTS sales_db;
192CREATE TABLE sales_db.fact_orders (...) USING DELTA;
193```