From 3d8eda1a9264f26c69e963244944fb00a107d31f Mon Sep 17 00:00:00 2001 From: Mike Wasson Date: Fri, 30 Mar 2018 21:34:35 -0700 Subject: [PATCH] Restructuring data guide (#475) * New structure for data guide * Add redirects --- .openpublishing.redirection.json | 74 ++- .../batch-processing.md | 2 +- .../images/batch-pipeline.png | Bin .../images/big-data-pipeline.png | Bin .../images/document.png | Bin .../{concepts => big-data}/images/kappa.png | Bin .../{concepts => big-data}/images/lambda.png | Bin ...learning-model-training-and-deployment.png | Bin .../{concepts => big-data}/images/object.png | Bin .../images/real-time-pipeline.png | Bin .../{concepts => big-data}/images/search.png | Bin .../images/time-series.png | Bin .../big-data.md => big-data/index.md} | 0 .../machine-learning-at-scale.md | 0 .../non-relational-data.md | 2 +- .../real-time-processing.md | 2 +- .../concepts/images/data-pipeline-ml.png | Bin 13434 -> 0 bytes .../images/machine-learning-model-options.png | Bin 42302 -> 0 bytes .../images/three-tier-application.png | Bin 3905 -> 0 bytes docs/data-guide/concepts/semantic-modeling.md | 61 -- .../data-guide/concepts/transactional-data.md | 44 -- .../images/control-flow-data-flow.png | Bin .../images/data-warehousing.png | Bin .../data-guide/{scenarios => }/images/elt.png | Bin .../data-guide/{scenarios => }/images/etl.png | Bin .../images/example-relational.png | Bin .../images/example-relational2.png | Bin docs/data-guide/images/guide-big-data.svg | 581 ++++++++++++++++++ docs/data-guide/images/guide-rdbms.svg | 267 ++++++++ docs/data-guide/images/guide-steps.svg | 239 ------- .../images/olap-data-pipeline.png | Bin .../images/semantic-modeling.png | Bin docs/data-guide/index.md | 54 +- .../data-warehousing.md} | 47 +- .../{scenarios => relational-data}/etl.md | 12 +- .../index.md} | 8 +- .../online-analytical-processing.md | 143 +++++ .../online-transaction-processing.md | 138 +++++ .../advanced-analytics.md | 0 .../{concepts => scenarios}/csv-and-json.md | 2 +- .../{concepts => scenarios}/data-lake.md | 6 +- docs/data-guide/scenarios/data-warehousing.md | 61 -- .../scenarios/images/oltp-data-pipeline.png | Bin 19260 -> 0 bytes .../scenarios/interactive-data-exploration.md | 2 +- .../scenarios/natural-language-processing.md | 2 +- .../scenarios/online-analytical-processing.md | 42 -- .../online-transaction-processing.md | 48 -- docs/data-guide/scenarios/time-series.md | 4 +- .../analytical-data-stores.md | 4 +- .../technology-choices/olap-data-stores.md | 72 --- .../technology-choices/oltp-data-stores.md | 92 --- .../technology-choices/stream-processing.md | 4 +- docs/data-guide/toc.yml | 138 ++--- 53 files changed, 1332 insertions(+), 819 deletions(-) rename docs/data-guide/{scenarios => big-data}/batch-processing.md (96%) rename docs/data-guide/{scenarios => big-data}/images/batch-pipeline.png (100%) rename docs/data-guide/{concepts => big-data}/images/big-data-pipeline.png (100%) rename docs/data-guide/{concepts => big-data}/images/document.png (100%) rename docs/data-guide/{concepts => big-data}/images/kappa.png (100%) rename docs/data-guide/{concepts => big-data}/images/lambda.png (100%) rename docs/data-guide/{concepts => big-data}/images/machine-learning-model-training-and-deployment.png (100%) rename docs/data-guide/{concepts => big-data}/images/object.png (100%) rename docs/data-guide/{scenarios => big-data}/images/real-time-pipeline.png (100%) rename docs/data-guide/{concepts => big-data}/images/search.png (100%) rename docs/data-guide/{concepts => big-data}/images/time-series.png (100%) rename docs/data-guide/{concepts/big-data.md => big-data/index.md} (100%) rename docs/data-guide/{concepts => big-data}/machine-learning-at-scale.md (100%) rename docs/data-guide/{concepts => big-data}/non-relational-data.md (97%) rename docs/data-guide/{scenarios => big-data}/real-time-processing.md (98%) delete mode 100644 docs/data-guide/concepts/images/data-pipeline-ml.png delete mode 100644 docs/data-guide/concepts/images/machine-learning-model-options.png delete mode 100644 docs/data-guide/concepts/images/three-tier-application.png delete mode 100644 docs/data-guide/concepts/semantic-modeling.md delete mode 100644 docs/data-guide/concepts/transactional-data.md rename docs/data-guide/{scenarios => }/images/control-flow-data-flow.png (100%) rename docs/data-guide/{scenarios => }/images/data-warehousing.png (100%) rename docs/data-guide/{scenarios => }/images/elt.png (100%) rename docs/data-guide/{scenarios => }/images/etl.png (100%) rename docs/data-guide/{concepts => }/images/example-relational.png (100%) rename docs/data-guide/{concepts => }/images/example-relational2.png (100%) create mode 100644 docs/data-guide/images/guide-big-data.svg create mode 100644 docs/data-guide/images/guide-rdbms.svg delete mode 100644 docs/data-guide/images/guide-steps.svg rename docs/data-guide/{scenarios => }/images/olap-data-pipeline.png (100%) rename docs/data-guide/{concepts => }/images/semantic-modeling.png (100%) rename docs/data-guide/{technology-choices/data-warehouses.md => relational-data/data-warehousing.md} (65%) rename docs/data-guide/{scenarios => relational-data}/etl.md (93%) rename docs/data-guide/{concepts/relational-data.md => relational-data/index.md} (92%) create mode 100644 docs/data-guide/relational-data/online-analytical-processing.md create mode 100644 docs/data-guide/relational-data/online-transaction-processing.md rename docs/data-guide/{concepts => scenarios}/advanced-analytics.md (100%) rename docs/data-guide/{concepts => scenarios}/csv-and-json.md (98%) rename docs/data-guide/{concepts => scenarios}/data-lake.md (82%) delete mode 100644 docs/data-guide/scenarios/data-warehousing.md delete mode 100644 docs/data-guide/scenarios/images/oltp-data-pipeline.png delete mode 100644 docs/data-guide/scenarios/online-analytical-processing.md delete mode 100644 docs/data-guide/scenarios/online-transaction-processing.md delete mode 100644 docs/data-guide/technology-choices/olap-data-stores.md delete mode 100644 docs/data-guide/technology-choices/oltp-data-stores.md diff --git a/.openpublishing.redirection.json b/.openpublishing.redirection.json index bb65e9511a1..3863e26b90b 100644 --- a/.openpublishing.redirection.json +++ b/.openpublishing.redirection.json @@ -50,6 +50,78 @@ { "source_path": "docs/elasticsearch/resilience-and-recover.md", "redirect_url": "/azure/architecture" - } + }, + { + "source_path": "docs/data-guide/scenarios/batch-processing.md", + "redirect_url": "/azure/architecture/data-guide/big-data/batch-processing" + }, + { + "source_path": "docs/data-guide/concepts/big-data.md", + "redirect_url": "/azure/architecture/data-guide/big-data" + }, + { + "source_path": "docs/data-guide/concepts/machine-learning-at-scale.md", + "redirect_url": "/azure/architecture/data-guide/big-data/machine-learning-at-scale" + }, + { + "source_path": "docs/data-guide/concepts/non-relational-data.md", + "redirect_url": "/azure/architecture/data-guide/big-data/non-relational-data" + }, + { + "source_path": "docs/data-guide/scenarios/real-time-processing.md", + "redirect_url": "/azure/architecture/data-guide/big-data/real-time-processing" + }, + { + "source_path": "docs/data-guide/technology-choices/data-warehouses.md", + "redirect_url": "/azure/architecture/data-guide/relational-data/data-warehousing" + }, + { + "source_path": "docs/data-guide/scenarios/etl.md", + "redirect_url": "/azure/architecture/data-guide/relational-data/etl" + }, + { + "source_path": "docs/data-guide/concepts/relational-data.md", + "redirect_url": "/azure/architecture/data-guide/relational-data" + }, + { + "source_path": "docs/data-guide/concepts/advanced-analytics.md", + "redirect_url": "/azure/architecture/data-guide/scenarios/advanced-analytics" + }, + { + "source_path": "docs/data-guide/concepts/csv-and-json.md", + "redirect_url": "/azure/architecture/data-guide/scenarios/csv-and-json" + }, + { + "source_path": "docs/data-guide/concepts/data-lake.md", + "redirect_url": "/azure/architecture/data-guide/scenarios/data-lake" + }, + { + "source_path": "docs/data-guide/concepts/semantic-modeling.md", + "redirect_url": "/azure/architecture/data-guide/relational-data/online-analytical-processing" + }, + { + "source_path": "docs/data-guide/concepts/transactional-data.md", + "redirect_url": "/azure/architecture/data-guide/relational-data/online-transaction-processing" + }, + { + "source_path": "docs/data-guide/scenarios/data-warehousing.md", + "redirect_url": "/azure/architecture/data-guide/relational-data/data-warehousing" + }, + { + "source_path": "docs/data-guide/scenarios/online-analytical-processing.md", + "redirect_url": "/azure/architecture/data-guide/relational-data/online-analytical-processing" + }, + { + "source_path": "docs/data-guide/scenarios/online-transaction-processing.md", + "redirect_url": "/azure/architecture/data-guide/relational-data/online-transaction-processing" + }, + { + "source_path": "docs/data-guide/technology-choices/olap-data-stores.md", + "redirect_url": "/azure/architecture/data-guide//relational-data/online-analytical-processing" + }, + { + "source_path": "docs/data-guide/technology-choices/oltp-data-stores.md", + "redirect_url": "/azure/architecture/data-guide/relational-data/online-transaction-processing" + } ] } \ No newline at end of file diff --git a/docs/data-guide/scenarios/batch-processing.md b/docs/data-guide/big-data/batch-processing.md similarity index 96% rename from docs/data-guide/scenarios/batch-processing.md rename to docs/data-guide/big-data/batch-processing.md index 39d0aad3420..a75331673c7 100644 --- a/docs/data-guide/scenarios/batch-processing.md +++ b/docs/data-guide/big-data/batch-processing.md @@ -15,7 +15,7 @@ For example, the logs from a web server might be copied to a folder and then pro ## When to use this solution -Batch processing is used in a variety of scenarios, from simple data transformations to a more complete ETL (extract-transform-load) pipeline. In a big data context, batch processing may operate over very large data sets, where the computation takes significant time. (For example, see [Lambda architecture](../concepts/big-data.md#lambda-architecture).) Batch processing typically leads to further interactive exploration, provides the modeling-ready data for machine learning, or writes the data to a data store that is optimized for analytics and visualization. +Batch processing is used in a variety of scenarios, from simple data transformations to a more complete ETL (extract-transform-load) pipeline. In a big data context, batch processing may operate over very large data sets, where the computation takes significant time. (For example, see [Lambda architecture](../big-data/index.md#lambda-architecture).) Batch processing typically leads to further interactive exploration, provides the modeling-ready data for machine learning, or writes the data to a data store that is optimized for analytics and visualization. One example of batch processing is transforming a large set of flat, semi-structured CSV or JSON files into a schematized and structured format that is ready for further querying. Typically the data is converted from the raw formats used for ingestion (such as CSV) into binary formats that are more performant for querying because they store data in a columnar format, and often provide indexes and inline statistics about the data. diff --git a/docs/data-guide/scenarios/images/batch-pipeline.png b/docs/data-guide/big-data/images/batch-pipeline.png similarity index 100% rename from docs/data-guide/scenarios/images/batch-pipeline.png rename to docs/data-guide/big-data/images/batch-pipeline.png diff --git a/docs/data-guide/concepts/images/big-data-pipeline.png b/docs/data-guide/big-data/images/big-data-pipeline.png similarity index 100% rename from docs/data-guide/concepts/images/big-data-pipeline.png rename to docs/data-guide/big-data/images/big-data-pipeline.png diff --git a/docs/data-guide/concepts/images/document.png b/docs/data-guide/big-data/images/document.png similarity index 100% rename from docs/data-guide/concepts/images/document.png rename to docs/data-guide/big-data/images/document.png diff --git a/docs/data-guide/concepts/images/kappa.png b/docs/data-guide/big-data/images/kappa.png similarity index 100% rename from docs/data-guide/concepts/images/kappa.png rename to docs/data-guide/big-data/images/kappa.png diff --git a/docs/data-guide/concepts/images/lambda.png b/docs/data-guide/big-data/images/lambda.png similarity index 100% rename from docs/data-guide/concepts/images/lambda.png rename to docs/data-guide/big-data/images/lambda.png diff --git a/docs/data-guide/concepts/images/machine-learning-model-training-and-deployment.png b/docs/data-guide/big-data/images/machine-learning-model-training-and-deployment.png similarity index 100% rename from docs/data-guide/concepts/images/machine-learning-model-training-and-deployment.png rename to docs/data-guide/big-data/images/machine-learning-model-training-and-deployment.png diff --git a/docs/data-guide/concepts/images/object.png b/docs/data-guide/big-data/images/object.png similarity index 100% rename from docs/data-guide/concepts/images/object.png rename to docs/data-guide/big-data/images/object.png diff --git a/docs/data-guide/scenarios/images/real-time-pipeline.png b/docs/data-guide/big-data/images/real-time-pipeline.png similarity index 100% rename from docs/data-guide/scenarios/images/real-time-pipeline.png rename to docs/data-guide/big-data/images/real-time-pipeline.png diff --git a/docs/data-guide/concepts/images/search.png b/docs/data-guide/big-data/images/search.png similarity index 100% rename from docs/data-guide/concepts/images/search.png rename to docs/data-guide/big-data/images/search.png diff --git a/docs/data-guide/concepts/images/time-series.png b/docs/data-guide/big-data/images/time-series.png similarity index 100% rename from docs/data-guide/concepts/images/time-series.png rename to docs/data-guide/big-data/images/time-series.png diff --git a/docs/data-guide/concepts/big-data.md b/docs/data-guide/big-data/index.md similarity index 100% rename from docs/data-guide/concepts/big-data.md rename to docs/data-guide/big-data/index.md diff --git a/docs/data-guide/concepts/machine-learning-at-scale.md b/docs/data-guide/big-data/machine-learning-at-scale.md similarity index 100% rename from docs/data-guide/concepts/machine-learning-at-scale.md rename to docs/data-guide/big-data/machine-learning-at-scale.md diff --git a/docs/data-guide/concepts/non-relational-data.md b/docs/data-guide/big-data/non-relational-data.md similarity index 97% rename from docs/data-guide/concepts/non-relational-data.md rename to docs/data-guide/big-data/non-relational-data.md index f9ed743cb11..1135d085866 100644 --- a/docs/data-guide/concepts/non-relational-data.md +++ b/docs/data-guide/big-data/non-relational-data.md @@ -9,7 +9,7 @@ ms:date: 02/12/2018 A *non-relational database* is a database that does not use the tabular schema of rows and columns found in most traditional database systems. Instead, non-relational databases use a storage model that is optimized for the specific requirements of the type of data being stored. For example, data may be stored as simple key/value pairs, as JSON documents, or as a graph consisting of edges and vertices. -What all of these data stores have in common is that they don't use a [relational model](./relational-data.md). Also, they tend to be more specific in the type of data they support and how data can be queried. For example, time series data stores are optimized for queries over time-based sequences of data, while graph data stores are optimized for exploring weighted relationships between entities. Neither format would generalize well to the task of managing transactional data. +What all of these data stores have in common is that they don't use a [relational model](../relational-data/index.md). Also, they tend to be more specific in the type of data they support and how data can be queried. For example, time series data stores are optimized for queries over time-based sequences of data, while graph data stores are optimized for exploring weighted relationships between entities. Neither format would generalize well to the task of managing transactional data. The term *NoSQL* refers to data stores that do not use SQL for queries, and instead use other programming languages and constructs to query the data. In practice, "NoSQL" means "non-relational database," even though many of these databases do support SQL-compatible queries. However, the underlying query execution strategy is usually very different from the way a traditional RDBMS would execute the same SQL query. diff --git a/docs/data-guide/scenarios/real-time-processing.md b/docs/data-guide/big-data/real-time-processing.md similarity index 98% rename from docs/data-guide/scenarios/real-time-processing.md rename to docs/data-guide/big-data/real-time-processing.md index 053b86870ca..39abc105c07 100644 --- a/docs/data-guide/scenarios/real-time-processing.md +++ b/docs/data-guide/big-data/real-time-processing.md @@ -45,7 +45,7 @@ For more information, see [Real-time message ingestion](../technology-choices/re ### Data storage -- **Azure Storage Blob Containers** or **Azure Data Lake Store**. Incoming real-time data is usually captured in a message broker (see above), but in some scenarios, it can make sense to monitor a folder for new files and process them as they are created or updated. Additionally, many real-time processing solutions combine streaming data with static reference data, which can be stored in a file store. Finally, file storage may be used as an output destination for captured real-time data for archiving, or for further batch processing in a [lambda architecture](../concepts/big-data.md#lambda-architecture). +- **Azure Storage Blob Containers** or **Azure Data Lake Store**. Incoming real-time data is usually captured in a message broker (see above), but in some scenarios, it can make sense to monitor a folder for new files and process them as they are created or updated. Additionally, many real-time processing solutions combine streaming data with static reference data, which can be stored in a file store. Finally, file storage may be used as an output destination for captured real-time data for archiving, or for further batch processing in a [lambda architecture](../big-data/index.md#lambda-architecture). For more information, see [Data storage](../technology-choices/data-storage.md). diff --git a/docs/data-guide/concepts/images/data-pipeline-ml.png b/docs/data-guide/concepts/images/data-pipeline-ml.png deleted file mode 100644 index 12444304d169de662d64e2ddd11b417fce05c628..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13434 zcmdUWbySq?`zIhn3<3iTB2oh?3=E-wQWArMfYi_+DIiF9mkdY?NQjgm-3UmRL8p?E zN=hTrCHoBes_%FAoZa7^J!g0SkY}FTJFol7&viW^XhmsK@Fg$~4i2fT3`zwD2X7b$ z2Ump%4`|V@BYy`xa2-{oC2@*->6d^Pd^4m15(lR=lH~Y42zV#9lhJm>!6AE({fFCT zn`?rD!%r@YLaMpxuce$u(zm4S9UwNJ8WNda54jK!%_i9x9AnKcj*=|Ly9PyY9o~ysJ+nL9=XKFjarl z*)vYtI4Zqxq7*9P%XbtLWm>kXve(jdY?gbPf@n7|YuPhE+^h_>O+hqns%X&r)VNs{ zd=fO!J?*al)V$Sqs(i}@xxCr{dBi<9uF>E=q@&gFl;%!{bg}L3Q+KBVL5D`coop{t zShGT_-g2Yce&P0mB%1LfgACY)k1l<~7oG$r3u)c`2A`Itg?$(MfC$`YQVmbv8~ZHx z6emjAvI`Og^+A<%IZX``MdjNQo$`((cbZPCjdvrTz=J)$(tEe?q#!JKGH+dQIEdUQ zq>r^dE!?_&kkZtFlcdQ=fb@2Qp&k^~4tl>7JD#Yw-i?lcx9178%rvCaZtWuuE7)ji z2`>f^_Ca}?EEPF;@{_i~@6lGea2J;zAJ&y*=M{h&swIgHnU}%eziBt2r{EOh8&5oE z=c-Pxj>I*L;c+4h%r+)<>I9D3kN3IC3p#{@T(xnA+G+?ZalUdPksN}}m0X0=SZ0Z{$%n9zo=(QaI)H`C<3wx;^(W9hBK zm`-y2y%pkD^i$HL41uE>3S~6z9S^npxGTi-iB(9Sl7gerXvjq{^a>bGghakegW-Yk z-2E{qTo5x{<{}g&frQzjqu^;Ud=Rleh6qkHM+&9{K?BlY_t6kskY7C#nf?d^fnGTe zW=VrZ3BYBbXb1)qfJEX$@xK#*Lh!(n=%{P(;71sVsWh0f1d<3$NdTfiL)z*7=ZjiK z?@f7b_>+rWQ(FG_?zCfcYn_&U9Bud>F6AV#{CmYR){o%y*^qy))SlR^4q-sB{CzB| z8A2&_ROfIHI4I4<6F#pZfF|RSPm+ng;d&U~A80#`F_b5ZwXe+<%7Ar%j z5&R;{9qF5KLwrr( z2R};>xopgK;Z#2=!f5typ$I_)H=f=$P3VS$Zo^)}K-#x5;&XM9U%TjBXlfeBZ288zC`lG%7H9}^zWF-l#jyrx^E=Qjj>G-xd zntQ!UnVsu7Nl-aQ5t#;SJu@wP;fz{_b4EqnLxs(o_fzjQjHj{vQ7!?S)N{*21q;fq ztc5U!&$>&y!+Io_?j7x@fD&($Rj3Q?8t3w4QD;tGOn&0AV{7xSD6lN~8BG!;Fa@P@ zRD);BQ7ZJS51T@#N4kF9*f|UFaHcap3@?H0efB+FSTNN>4T`iCm|#@YsnAiw z(cB((?{r>O=HGO+_fD^weD>s~M*l=WeDf(85hz3w40hOZ*_`7Em97dUyfmc4G-#>m zDX~UaA#mrX;HATZ6(vx>hIgg|G{hfre^M_Cp?ErMDQrzb0L}EycoN4sftmr7WN*Q-s_(q&Z@|*EkrJ`Mw_KjXS%GmUMeWxoabhE9w z(xNYd+U{BIpaDj+Lc{D%4q*>Eg1M zvu7IReW~X69G2V6F&LDPggy0KO+m{vpHG~`8dZha9g;H+{jt7bz;_`^qA*zg4szL^ zklX^KCV+MYZSB2Q--E!-b2*W1ljyJcmt4&Up_xiMYO(hR<5eD#e3U)D18EUP$e?C8 z+Eq&qcW`?aq{_qY{1lvM6$rysmd|zjahgiOQmV*o5Sa3DFu2UM#O>RICb2a4MS1%@ z%km5jhBK-GZ0-Rwq0E3;zT36JyUl>BkpuJStA4NOaW&R5R<{9GIedmPeeKn~tj)13vVM z0y@e`0vS*Z?vEvBfZ_)lWr1h((#s}mK0mFRG_nF$^-xa8@u_bwY*#;K1E)|SKzZsz zHm^≈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 diff --git a/docs/data-guide/concepts/images/three-tier-application.png b/docs/data-guide/concepts/images/three-tier-application.png deleted file mode 100644 index 8e9dd2c2b43cd3cb3f8e52fad1d33731328240a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3905 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 diff --git a/docs/data-guide/concepts/semantic-modeling.md b/docs/data-guide/concepts/semantic-modeling.md deleted file mode 100644 index 6ecbe94f2d7..00000000000 --- a/docs/data-guide/concepts/semantic-modeling.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Semantic modeling -description: -author: zoinerTejada -ms:date: 02/12/2018 ---- - -# Semantic modeling - -A semantic data model is a conceptual model that describes the meaning of the data elements it contains. Organizations often have their own terms for things, sometimes with synonyms, or even different meanings for the same term. For example, an inventory database might track a piece of equipment with an asset ID and a serial number, but a sales database might refer to the serial number as the asset ID. There is no simple way to relate these values without a model that describes the relationship. - -Semantic modeling provides a level of abstraction over the database schema, so that users don't need to know the underlying data structures. This makes it easier for end users to query data without performing aggregates and joins over the underlying schema. Also, usually columns are renamed to more user-friendly names, so that the context and meaning of the data are more obvious. - -Semantic modeling is predominately used for read-heavy scenarios, such as analytics and business intelligence (OLAP), as opposed to more write-heavy transactional data processing (OLTP). This is mostly due to the nature of a typical semantic layer: - -- Aggregation behaviors are set so that reporting tools display them properly. -- Business logic and calculations are defined. -- Time-oriented calculations are included. -- Data is often integrated from multiple sources. - -Traditionally, the semantic layer is placed over a data warehouse for these reasons. - -![Example diagram of a semantic layer between a data warehouse and a reporting tool](./images/semantic-modeling.png) - -There are two primary types of semantic models: - -* **Tabular**. Uses relational modeling constructs (model, tables, columns). Internally, metadata is inherited from OLAP modeling constructs (cubes, dimensions, measures). Code and script use OLAP metadata. -* **Multidimensional**. Uses traditional OLAP modeling constructs (cubes, dimensions, measures). - -Relevant Azure service: -- [Azure Analysis Services](https://azure.microsoft.com/services/analysis-services/) - -## Example use case - -An organization has data stored in a large database. It wants to make this data available to business users and customers to create their own reports and do some analysis. One option is just to give those users direct access to the database. However, there are several drawbacks to doing this, including managing security and controlling access. Also, the design of the database, including the names of tables and columns, may be hard for a user to understand. Users would need to know which tables to query, how those tables should be joined, and other business logic that must be applied to get the correct results. Users would also need to know a query language like SQL even to get started. Typically this leads to multiple users reporting the same metrics but with different results. - -Another option is to encapsulate all of the information that users need into a semantic model. The semantic model can be more easily queried by users with a reporting tool of their choice. The data provided by the semantic model is pulled from a data warehouse, ensuring that all users see a single version of the truth. The semantic model also provides friendly table and column names, relationships between tables, descriptions, calculations, and row-level security. - -## Typical traits of semantic modeling - -Semantic modeling and analytical processing tends to have the following traits: - -| Requirement | Description | -| --- | --- | -| Schema | Schema on write, strongly enforced| -| Uses Transactions | No | -| Locking Strategy | None | -| Updateable | No (typically requires recomputing cube) | -| Appendable | No (typically requires recomputing cube) | -| Workload | Heavy reads, read-only | -| Indexing | Multidimensional indexing | -| Datum size | Small to medium sized | -| Model | Multidimensional | -| Data shape:| Cube or star/snowflake schema | -| Query flexibility | Highly flexible | -| Scale: | Large (10s-100s GBs) | - -## See also - -- [Data warehousing](../scenarios/data-warehousing.md) -- [Online analytical processing (OLAP)](../scenarios/online-analytical-processing.md) diff --git a/docs/data-guide/concepts/transactional-data.md b/docs/data-guide/concepts/transactional-data.md deleted file mode 100644 index 7029d52ca66..00000000000 --- a/docs/data-guide/concepts/transactional-data.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: Transactional data -description: -author: zoinerTejada -ms:date: 02/12/2018 ---- - -# Transactional data - -Transactional data is information that tracks the interactions related to an organization's activities. These interactions are typically business transactions, such as payments received from customers, payments made to suppliers, products moving through inventory, orders taken, or services delivered. Transactional events, which represent the transactions themselves, typically contain a time dimension, some numerical values, and references to other data. - -Transactions typically need to be *atomic* and *consistent*. Atomicity means that an entire transaction always succeeds or fails as one unit of work, and is never left in a half-completed state. If a transaction cannot be completed, the database system must roll back any steps that were already done as part of that transaction. In a traditional RDBMS, this rollback happens automatically if a transaction cannot be completed. Consistency means that transactions always leave the data in a valid state. (These are very informal descriptions of atomicity and consistency. There are more formal definitions of these properties, such as [ACID](https://en.wikipedia.org/wiki/ACID).) - -Transactional databases can support strong consistency for transactions using various locking strategies, such as pessimistic locking, to ensure that all data is strongly consistent within the context of the enterprise, for all users and processes. - -The most common deployment architecture that uses transactional data is the data store tier in a 3-tier architecture. A 3-tier architecture typically consists of a presentation tier, business logic tier, and data store tier. A related deployment architecture is the [N-tier](/azure/architecture/guide/architecture-styles/n-tier) architecture, which may have multiple middle-tiers handling business logic. - -![Example of a 3-tier application](./images/three-tier-application.png) - -## Typical traits of transactional data - -Transactional data tends to have the following traits: - -| Requirement | Description | -| --- | --- | -| Normalization | Highly normalized | -| Schema | Schema on write, strongly enforced| -| Consistency | Strong consistency, ACID guarantees | -| Integrity | High integrity | -| Uses transactions | Yes | -| Locking strategy | Pessimistic or optimistic| -| Updateable | Yes | -| Appendable | Yes | -| Workload | Heavy writes, moderate reads | -| Indexing | Primary and secondary indexes | -| Datum size | Small to medium sized | -| Model | Relational | -| Data shape | Tabular | -| Query flexibility | Highly flexible | -| Scale | Small (MBs) to Large (a few TBs) | - -## See Also - -[Online Transaction Processing](../scenarios/online-transaction-processing.md) diff --git a/docs/data-guide/scenarios/images/control-flow-data-flow.png b/docs/data-guide/images/control-flow-data-flow.png similarity index 100% rename from docs/data-guide/scenarios/images/control-flow-data-flow.png rename to docs/data-guide/images/control-flow-data-flow.png diff --git a/docs/data-guide/scenarios/images/data-warehousing.png b/docs/data-guide/images/data-warehousing.png similarity index 100% rename from docs/data-guide/scenarios/images/data-warehousing.png rename to docs/data-guide/images/data-warehousing.png diff --git a/docs/data-guide/scenarios/images/elt.png b/docs/data-guide/images/elt.png similarity index 100% rename from docs/data-guide/scenarios/images/elt.png rename to docs/data-guide/images/elt.png diff --git a/docs/data-guide/scenarios/images/etl.png b/docs/data-guide/images/etl.png similarity index 100% rename from docs/data-guide/scenarios/images/etl.png rename to docs/data-guide/images/etl.png diff --git a/docs/data-guide/concepts/images/example-relational.png b/docs/data-guide/images/example-relational.png similarity index 100% rename from docs/data-guide/concepts/images/example-relational.png rename to docs/data-guide/images/example-relational.png diff --git a/docs/data-guide/concepts/images/example-relational2.png b/docs/data-guide/images/example-relational2.png similarity index 100% rename from docs/data-guide/concepts/images/example-relational2.png rename to docs/data-guide/images/example-relational2.png diff --git a/docs/data-guide/images/guide-big-data.svg b/docs/data-guide/images/guide-big-data.svg new file mode 100644 index 00000000000..a1090814f59 --- /dev/null +++ b/docs/data-guide/images/guide-big-data.svg @@ -0,0 +1,581 @@ + + + + + + + + + + Page-1 + + + Sheet.51 + + Sheet.4 + Storage + + + + Storage + + Sheet.3 + Processing + + + + Processing + + Sheet.2 + Ingestion + + + + Ingestion + + Sheet.21 + ML + + + + ML + + Sheet.22 + Reporting + + + + Reporting + + Sheet.50 + + + + Sheet.49 + + + + Event Hubs + + Sheet.8 + + + + Sheet.9 + + + + Sheet.10 + + + + Sheet.11 + + + + Sheet.12 + + + + Sheet.13 + + + + Sheet.14 + + + + Sheet.15 + + + + + Stream Analytics + + Sheet.17 + + + + Sheet.18 + + + + Sheet.19 + + + + Sheet.20 + + + + + Power BI (nc) + + Sheet.24 + + + + Sheet.25 + + + + Sheet.26 + + + + Sheet.27 + + + + Sheet.28 + + + + + Cognitive Services (opaque) (nc) + + Sheet.30 + + + + Sheet.31 + + + + + HDInsight (opaque) + + Sheet.34 + + + + + Sheet.35 + + Sheet.36 + + + + Sheet.37 + + + + Sheet.38 + + + + + + Cosmos DB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Storage blob (opaque) + + Sheet.41 + + + + Sheet.42 + + Sheet.43 + + + + Sheet.44 + + + + Sheet.45 + + + + Sheet.46 + + + + + + Data Lake Store (nc) + + + + + diff --git a/docs/data-guide/images/guide-rdbms.svg b/docs/data-guide/images/guide-rdbms.svg new file mode 100644 index 00000000000..5d45a743880 --- /dev/null +++ b/docs/data-guide/images/guide-rdbms.svg @@ -0,0 +1,267 @@ + + + + + + + + Page-1 + + Sheet.97 + + Sheet.1 + Data Warehouse + + Data Warehouse + + Sheet.2 + Analysis + + Analysis + + Sheet.3 + + + + Sheet.4 + Reporting + + Reporting + + Sheet.5 + OLTP + + OLTP + + Data Factory (opaque) + + Sheet.15 + + + + Sheet.16 + + + + + Power BI (nc).17 + + Sheet.18 + + + + Sheet.19 + + + + Sheet.20 + + + + Sheet.21 + + + + Sheet.22 + + + + + Analysis Service + + Sheet.24 + + + + + SQL database (generic) (opaque) + + Sheet.32 + + + + Sheet.33 + + Sheet.34 + + + + Sheet.35 + + + + + + Sheet.37 + + + + Sheet.38 + + + + SQL Data Warehouse (nc) + + + + Triangle.94 + + + + Sheet.96 + ETL + + ETL + + + diff --git a/docs/data-guide/images/guide-steps.svg b/docs/data-guide/images/guide-steps.svg deleted file mode 100644 index 99333077853..00000000000 --- a/docs/data-guide/images/guide-steps.svg +++ /dev/null @@ -1,239 +0,0 @@ - - - - - - Page-1 - - Sheet.98 - - Sheet.71 - RDBMS - - RDBMS - - - Simple Arrow.83 - - - - Simple Arrow.84 - - - - Sheet.94 - Technology choices - - Technology - choices - - - Sheet.95 - Solutions - - Scenarios - - - Sheet.96 - Concepts - - Concepts - - - - Sheet.99 - - Sheet.100 - NoSQL - - NoSQL - - - Simple Arrow.83 - - - - Simple Arrow.84 - - - - Sheet.103 - Technology choices - - Technology - choices - - - Sheet.104 - Solutions - - Scenarios - - - Sheet.105 - Concepts - - Concepts - - - - Sheet.46 - - Sheet.14 - - - - Sheet.15 - - - - Sheet.16 - - - - Sheet.17 - - - - Sheet.18 - - - - Sheet.19 - - - - Sheet.20 - - - - Sheet.21 - - - - Sheet.30 - - - - Sheet.31 - - - - Sheet.32 - - - - Sheet.33 - - - - Sheet.34 - - - - Sheet.35 - - - - Sheet.36 - - - - Sheet.37 - - - - Sheet.38 - - - - Sheet.39 - - - - Sheet.40 - - - - Sheet.41 - - - - Sheet.42 - - - - Sheet.43 - - - - Sheet.44 - - - - Sheet.45 - - - - - Sheet.61 - - Sheet.47 - - - - Sheet.48 - - - - Sheet.49 - - - - Sheet.51 - - - - Sheet.53 - - - - Sheet.54 - - - - Sheet.55 - - - - Sheet.56 - - - - Sheet.57 - - - - Sheet.58 - - - - Sheet.60 - - - - - diff --git a/docs/data-guide/scenarios/images/olap-data-pipeline.png b/docs/data-guide/images/olap-data-pipeline.png similarity index 100% rename from docs/data-guide/scenarios/images/olap-data-pipeline.png rename to docs/data-guide/images/olap-data-pipeline.png diff --git a/docs/data-guide/concepts/images/semantic-modeling.png b/docs/data-guide/images/semantic-modeling.png similarity index 100% rename from docs/data-guide/concepts/images/semantic-modeling.png rename to docs/data-guide/images/semantic-modeling.png diff --git a/docs/data-guide/index.md b/docs/data-guide/index.md index e443e24707a..327b7c496bb 100644 --- a/docs/data-guide/index.md +++ b/docs/data-guide/index.md @@ -16,58 +16,16 @@ The cloud is changing the way applications are designed, including how data is p ## How this guide is structured -This guide is structured around a basic pivot: The distinction between *relational* data and *non-relational* data. +This guide is structured around two general categories of data solution, *traditional RDMBS workloads* and *big data solutions*. -![](./images/guide-steps.svg) +**[Traditional RDBMS workloads](./relational-data/index.md)**. These workloads include online transaction processing (OLTP) and online analytical processing (OLAP). Data in OLTP systems is typically relational data with a pre-defined schema and a set of constraints to maintain referential integrity. Often, data from multiple sources in the organization may be consolidated into a data warehouse, using an ETL process to move and transform the source data. -Relational data is generally stored in a traditional RDBMS or a data warehouse. It has a pre-defined schema ("schema on write") with a set of constraints to maintain referential integrity. Most relational databases use Structured Query Language (SQL) for querying. Solutions that use relational databases include online transaction processing (OLTP) and online analytical processing (OLAP). +![](./images/guide-rdbms.svg) -Non-relational data is any data that does not use the [relational model](https://en.wikipedia.org/wiki/Relational_model) found in traditional RDBMS systems. This may include key-value data, JSON data, graph data, time series data, and other data types. The term *NoSQL* refers to databases that are designed to hold various types of non-relational data. However, the term is not entirely accurate, because many non-relational data stores support SQL compatible queries. Non-relational data and NoSQL databases often come up in discussions of *big data* solutions. A big data architecture is designed to handle the ingestion, processing, and analysis of data that is too large or complex for traditional database systems. +**[Big data solutions](./big-data/index.md)**. A big data architecture is designed to handle the ingestion, processing, and analysis of data that is too large or complex for traditional database systems. The data may be processed in batch or in real tme. Big data solutions typically involve a large amount of non-relational data, such as key-value data, JSON documents, or time series data. Often traditional RDBMS systems are not well-suited to store this type of data. The term *NoSQL* refers to a family of databases designed to hold non-relational data. (The term isn't quite accurate, because many non-relational data stores support SQL compatible queries.) -Within each of these two main categories, the Data Architecture Guide contains the following sections: +![](./images/guide-big-data.svg) -- **Concepts.** Overview articles that introduce the main concepts you need to understand when working with this type of data. -- **Scenarios.** A representative set of data scenarios, including a discussion of the relevant Azure services and the appropriate architecture for the scenario. -- **Technology choices.** Detailed comparisons of various data technologies available on Azure, including open source options. Within each category, we describe the key selection criteria and a capability matrix, to help you choose the right technology for your scenario. +These two categories are not mutually exclusive, and there is overlap between them, but we feel that it's a useful way to frame the discussion. Within each category, the guide discusses **common scenarios**, including relevant Azure services and the appropriate architecture for the scenario. In addition, the guide compares **technology choices** for data solutions in Azure, including open source options. Within each category, we describe the key selection criteria and a capability matrix, to help you choose the right technology for your scenario. This guide is not intended to teach you data science or database theory — you can find entire books on those subjects. Instead, the goal is to help you select the right data architecture or data pipeline for your scenario, and then select the Azure services and technologies that best fit your requirements. If you already have an architecture in mind, you can skip directly to the technology choices. - -## Traditional RDBMS - -### Concepts - -- [Relational data](./concepts/relational-data.md) -- [Transactional data](./concepts/transactional-data.md) -- [Semantic modeling](./concepts/semantic-modeling.md) - -### Scenarios - -- [Online analytical processing (OLAP)](./scenarios/online-analytical-processing.md) -- [Online transaction processing (OLTP)](./scenarios/online-transaction-processing.md) -- [Data warehousing and data marts](./scenarios/data-warehousing.md) -- [ETL](./scenarios/etl.md) - -## Big data and NoSQL - -### Concepts - -- [Non-relational data stores](./concepts/non-relational-data.md) -- [Working with CSV and JSON files](./concepts/csv-and-json.md) -- [Big data architectures](./concepts/big-data.md) -- [Advanced analytics](./concepts/advanced-analytics.md) -- [Machine learning at scale](./concepts/machine-learning-at-scale.md) - -### Scenarios - -- [Batch processing](./scenarios/batch-processing.md) -- [Real time processing](./scenarios/real-time-processing.md) -- [Free-form text search](./scenarios/search.md) -- [Interactive data exploration](./scenarios/interactive-data-exploration.md) -- [Natural language processing](./scenarios/natural-language-processing.md) -- [Time series solutions](./scenarios/time-series.md) - -## Cross-cutting concerns - -- [Data transfer](./scenarios/data-transfer.md) -- [Extending on-premises data solutions to the cloud](./scenarios/hybrid-on-premises-and-cloud.md) -- [Securing data solutions](./scenarios/securing-data-solutions.md) diff --git a/docs/data-guide/technology-choices/data-warehouses.md b/docs/data-guide/relational-data/data-warehousing.md similarity index 65% rename from docs/data-guide/technology-choices/data-warehouses.md rename to docs/data-guide/relational-data/data-warehousing.md index dd648f6892c..1f93c3f8635 100644 --- a/docs/data-guide/technology-choices/data-warehouses.md +++ b/docs/data-guide/relational-data/data-warehousing.md @@ -1,18 +1,49 @@ --- -title: Choosing a data warehouse +title: Data warehousing and data marts description: author: zoinerTejada ms:date: 02/12/2018 --- -# Choosing a data warehouse in Azure +# Data warehousing and data marts -A data warehouse is a central, organizational, relational repository of integrated data from one or more disparate sources. This topic compares options for data warehouses in Azure. +A data warehouse is a central, organizational, relational repository of integrated data from one or more disparate sources, across many or all subject areas. Data warehouses store current and historical data and are used for reporting and analysis of the data in different ways. -> [!NOTE] -> For more information about when to use a data warehouse, see [Data warehousing and data marts](../scenarios/data-warehousing.md). +![Data warehousing in Azure](../images/data-warehousing.png) -## What are your options when choosing a data warehouse? +To move data into a data warehouse, it is extracted on a periodic basis from various sources that contain important business information. As the data is moved, it can be formatted, cleaned, validated, summarized, and reorganized. Alternately, the data can be stored in the lowest level of detail, with aggregated views provided in the warehouse for reporting. In either case, the data warehouse becomes a permanent storage space for data used for reporting, analysis, and forming important business decisions using business intelligence (BI) tools. + +## Data marts and operational data stores + +Managing data at scale is complex, and it is becoming less common to have a single data warehouse that represents all data across the entire enterprise. Instead, organizations create smaller, more focused data warehouses, called *data marts*, that expose the desired data for analytics purposes. An orchestration process populates the data marts from data maintained in an operational data store. The operational data store acts as an intermediary between the source transactional system and the data mart. Data managed by the operational data store is a cleaned version of the data present in the source transactional system, and is typically a subset of the historical data that is maintained by the data warehouse or data mart. + +## When to use this solution + +Choose a data warehouse when you need to turn massive amounts of data from operational systems into a format that is easy to understand, current, and accurate. Data warehouses do not need to follow the same terse data structure you may be using in your operational/OLTP databases. You can use column names that make sense to business users and analysts, restructure the schema to simplify data relationships, and consolidate several tables into one. These steps help guide users who need to create ad hoc reports, or create reports and analyze the data in BI systems, without the help of a database administrator (DBA) or data developer. + +Consider using a data warehouse when you need to keep historical data separate from the source transaction systems for performance reasons. Data warehouses make it easy to access historical data from multiple locations, by providing a centralized location using common formats, common keys, common data models, and common access methods. + +Data warehouses are optimized for read access, resulting in faster report generation compared to running reports against the source transaction system. In addition, data warehouses provide the following benefits: + +* All historical data from multiple sources can be stored and accessed from a data warehouse as the single source of truth. +* You can improve data quality by cleaning up data as it is imported into the data warehouse, providing more accurate data as well as providing consistent codes and descriptions. +* Reporting tools do not compete with the transactional source systems for query processing cycles. A data warehouse allows the transactional system to focus predominantly on handling writes, while the data warehouse satisfies the majority of read requests. +* A data warehouse can help consolidate data from different software. +* Data mining tools can help you find hidden patterns using automatic methodologies against data stored in your warehouse. +* Data warehouses make it easier to provide secure access to authorized users, while restricting access to others. There is no need to grant business users access to the source data, thereby removing a potential attack vector against one or more production transaction systems. +* Data warehouses make it easier to create business intelligence solutions on top of the data, such as [OLAP cubes](online-analytical-processing.md). + +## Challenges + +Properly configuring a data warehouse to fit the needs of your business can bring some of the following challenges: + +* Committing the time required to properly model your business concepts. This is an important step, as data warehouses are information driven, where concept mapping drives the rest of the project. This involves standardizing business-related terms and common formats (such as currency and dates), and restructuring the schema in a way that makes sense to business users but still ensures accuracy of data aggregates and relationships. +* Planning and setting up your data orchestration. Consideration include how to copy data from the source transactional system to the data warehouse, and when to move historical data out of your operational data stores and into the warehouse. +* Maintaining or improving data quality by cleaning the data as it is imported into the warehouse. + +## Data warehousing in Azure + +In Azure, you may have one or more sources of data, whether from customer transactions, or from various business applications used by various departments. This data is traditionally stored in one or more [OLTP](online-transaction-processing.md) databases. The data could be persisted in other storage mediums such as network shares, Azure Storage Blobs, or a data lake. The data could also be stored by the data warehouse itself or in a relational database such as Azure SQL Database. The purpose of the analytical data store layer is to satisfy queries issued by analytics and reporting tools against the data warehouse or data mart. In Azure, this analytical store capability can be met with Azure SQL Data Warehouse, or with Azure HDInsight using Hive or Interactive Query. In addition, you will need some level of orchestration to periodically move or copy data from data storage to the data warehouse, which can be done using Azure Data Factory or Oozie on Azure HDInsight. There are several options for implementing a data warehouse in Azure, depending on your needs. The following lists are broken into two categories, [symmetric multiprocessing](https://en.wikipedia.org/wiki/Symmetric_multiprocessing) (SMP) and [massively parallel processing](https://en.wikipedia.org/wiki/Massively_parallel) (MPP). @@ -27,7 +58,7 @@ MPP: - [Apache Hive on HDInsight](/azure/hdinsight/hadoop/hdinsight-use-hive) - [Interactive Query (Hive LLAP) on HDInsight](/azure/hdinsight/interactive-query/apache-interactive-query-get-started) -As a general rule, SMP-based warehouses are best suited for small to medium data sets (up to 4-100 TB), while MPP is often used for big data. The delineation between small/medium and big data partly has to do with your organization's definition and supporting infrastructure. (See [Choosing an OLTP data store](oltp-data-stores.md#scalability-capabilities).) +As a general rule, SMP-based warehouses are best suited for small to medium data sets (up to 4-100 TB), while MPP is often used for big data. The delineation between small/medium and big data partly has to do with your organization's definition and supporting infrastructure. (See [Choosing an OLTP data store](online-transaction-processing.md#scalability-capabilities).) Beyond data sizes, the type of workload pattern is likely to be a greater determining factor. For example, complex queries may be too slow for an SMP solution, and require an MPP solution instead. MPP-based systems are likely to impose a performance penalty with small data sizes, due to the way jobs are distributed and consolidated across nodes. If your data sizes already exceed 1 TB and are expected to continually grow, consider selecting an MPP solution. However, if your data sizes are less than this, but your workloads are exceeding the available resources of your SMP solution, then MPP may be your best option as well. @@ -56,7 +87,7 @@ To narrow the choices, start by answering these questions: - For a large data set, is the data source structured or unstructured? Unstructured data may need to be processed in a big data environment such as Spark on HDInsight, Azure Databricks, Hive LLAP on HDInsight, or Azure Data Lake Analytics. All of these can serve as ELT (Extract, Load, Transform) and ETL (Extract, Transform, Load) engines. They can output the processed data into structured data, making it easier to load into SQL Data Warehouse or one of the other options. For structured data, SQL Data Warehouse has a performance tier called Optimized for Compute, for compute-intensive workloads requiring ultra-high performance. -- Do you want to separate your historical data from your current, operational data? If so, select one of the options where [orchestration](pipeline-orchestration-data-movement.md) is required. These are standalone warehouses optimized for heavy read access, and are best suited as a separate historical data store. +- Do you want to separate your historical data from your current, operational data? If so, select one of the options where [orchestration](../technology-choices/pipeline-orchestration-data-movement.md) is required. These are standalone warehouses optimized for heavy read access, and are best suited as a separate historical data store. - Do you need to integrate data from several sources, beyond your OLTP data store? If so, consider options that easily integrate multiple data sources. diff --git a/docs/data-guide/scenarios/etl.md b/docs/data-guide/relational-data/etl.md similarity index 93% rename from docs/data-guide/scenarios/etl.md rename to docs/data-guide/relational-data/etl.md index f7a9edd0939..426e7d00594 100644 --- a/docs/data-guide/scenarios/etl.md +++ b/docs/data-guide/relational-data/etl.md @@ -17,7 +17,7 @@ Extract, transform, and load (ETL) is a data pipeline used to collect data from The data transformation that takes place usually involves various operations, such as filtering, sorting, aggregating, joining data, cleaning data, deduplicating, and validating data. -![Extract-transform-load (ETL) process](./images/etl.png) +![Extract-transform-load (ETL) process](../images/etl.png) Often, the three ETL phases are run in parallel to save time. For example, while data is being extracted, a transformation process could be working on data already received and prepare it for loading, and a loading process can begin working on the prepared data, rather than waiting for the entire extraction process to complete. @@ -31,7 +31,7 @@ Other tools: Extract, load, and transform (ELT) differs from ETL solely in where the transformation takes place. In the ELT pipeline, the transformation occurs in the target data store. Instead of using a separate transformation engine, the processing capabilities of the target data store are used to transform data. This simplifies the architecture by removing the transformation engine from the pipeline. Another benefit to this approach is that scaling the target data store also scales the ELT pipeline performance. However, ELT only works well when the target system is powerful enough to transform the data efficiently. -![Extract-Load-Transform (ELT) process](./images/elt.png) +![Extract-Load-Transform (ELT) process](../images/elt.png) Typical use cases for ELT fall within the big data realm. For example, you might start by extracting all of the source data to flat files in scalable storage such as Hadoop distributed file system (HDFS) or Azure Data Lake Store. Technologies such as Spark, Hive, or PolyBase can then be used to query the source data. The key point with ELT is that the data store used to perform the transformation is the same data store where the data is ultimately consumed. This data store reads directly from the scalable storage, instead of loading the data into its own proprietary storage. This approach skips the data copy step present in ETL, which can be a time consuming operation for large data sets. @@ -58,7 +58,7 @@ In the context of data pipelines, the control flow ensures orderly processing of Control flows execute data flows as a task. In a data flow task, data is extracted from a source, transformed, or loaded into a data store. The output of one data flow task can be the input to the next data flow task, and data flowss can run in parallel. Unlike control flows, you cannot add constraints between tasks in a data flow. You can, however, add a data viewer to observe the data as it is processed by each task. -![Data Flow being executed as a task within a Control Flow](./images/control-flow-data-flow.png) +![Data Flow being executed as a task within a Control Flow](../images/control-flow-data-flow.png) In the diagram above, there are several tasks within the control flow, one of which is a data flow task. One of the tasks is nested within a container. Containers can be used to provide structure to tasks, providing a unit of work. One such example is for repeating elements within a collection, such as files in a folder or database statements. @@ -70,7 +70,7 @@ Other tools: ## Technology choices -- [Online Transaction Processing (OLTP) data stores](../technology-choices/oltp-data-stores.md) -- [Online Analytical Processing (OLAP) data stores](../technology-choices/olap-data-stores.md) -- [Data warehouses](../technology-choices/data-warehouses.md) +- [Online Transaction Processing (OLTP) data stores](./online-transaction-processing.md#oltp-in-azure) +- [Online Analytical Processing (OLAP) data stores](./online-analytical-processing.md#olap-in-azure) +- [Data warehouses](./data-warehousing.md) - [Pipeline orchestration](../technology-choices/pipeline-orchestration-data-movement.md) diff --git a/docs/data-guide/concepts/relational-data.md b/docs/data-guide/relational-data/index.md similarity index 92% rename from docs/data-guide/concepts/relational-data.md rename to docs/data-guide/relational-data/index.md index db63a11aa54..ec0d43686dc 100644 --- a/docs/data-guide/concepts/relational-data.md +++ b/docs/data-guide/relational-data/index.md @@ -5,17 +5,17 @@ author: zoinerTejada ms:date: 02/12/2018 --- -# Relational data +# Traditional relational database solutions Relational data is data modeled using the relational model. In this model, data is expressed as tuples. A *tuple* is a set of attribute/value pairs. For example, a tuple might be (itemid = 5, orderid = 1, item = "Chair", amount = 200.00). A set of tuples that all share the same attributes is called a *relation*. Relations are naturally represented as tables, where each tuple is exposed as a row in the table. However, rows have an explicit ordering, unlike tuples. The database schema defines the columns (headings) of each table. Each column is defined with a name and a data type for all values stored in that column across all rows in the table. -![Example showing data using a relational database](./images/example-relational.png) +![Example showing data using a relational database](../images/example-relational.png) A data store that organizes data using the relational model is referred to as a relational database. Primary keys uniquely identify rows within a table. Foreign key fields are used in one table to refer to a row in another table by referencing the primary key of the other table. Foreign keys are used to maintain referential integrity, ensuring that the referenced rows are not altered or deleted while the referencing row depends on them. -![Example showing data using a relational database](./images/example-relational2.png) +![Example showing data using a relational database](../images/example-relational2.png) Relational databases support various types of constraints that help to ensure data integrity: @@ -31,4 +31,4 @@ To improve query performance, relational databases use *indexes*. Primary indexe Because relational databases enforce referential integrity, scaling a relational database can become challenging. That's because any query or insert operation might touch any number of tables. You can scale out a relational database by *sharding* the data, but this requires careful design of the schema. For more information, see [Sharding pattern](../../patterns/sharding.md). -If data is non-relational or has requirements that are not suited to a relational database, consider a [Non-relational or NoSQL](./non-relational-data.md) data store. +If data is non-relational or has requirements that are not suited to a relational database, consider a [Non-relational or NoSQL](../big-data/non-relational-data.md) data store. diff --git a/docs/data-guide/relational-data/online-analytical-processing.md b/docs/data-guide/relational-data/online-analytical-processing.md new file mode 100644 index 00000000000..a41aede0519 --- /dev/null +++ b/docs/data-guide/relational-data/online-analytical-processing.md @@ -0,0 +1,143 @@ +--- +title: Online analytical processing (OLAP) +description: +author: zoinerTejada +ms:date: 02/12/2018 +--- + +# Online analytical processing (OLAP) + +Online analytical processing (OLAP) is a technology that organizes large business databases and supports complex analysis. It can be used to perform complex analytical queries without negatively affecting transactional systems. + +The databases that a business uses to store all its transactions and records are called [online transaction processing (OLTP)](online-transaction-processing.md) databases. These databases usually have records that are entered one at a time. Often they contain a great deal of information that is valuable to the organization. The databases that are used for OLTP, however, were not designed for analysis. Therefore, retrieving answers from these databases is costly in terms of time and effort. OLAP systems were designed to help extract this business intelligence information from the data in a highly performant way. This is because OLAP databases are optimized for heavy read, low write workloads. + +![OLAP in Azure](../images/olap-data-pipeline.png) + +## Semantic modeling + +A semantic data model is a conceptual model that describes the meaning of the data elements it contains. Organizations often have their own terms for things, sometimes with synonyms, or even different meanings for the same term. For example, an inventory database might track a piece of equipment with an asset ID and a serial number, but a sales database might refer to the serial number as the asset ID. There is no simple way to relate these values without a model that describes the relationship. + +Semantic modeling provides a level of abstraction over the database schema, so that users don't need to know the underlying data structures. This makes it easier for end users to query data without performing aggregates and joins over the underlying schema. Also, usually columns are renamed to more user-friendly names, so that the context and meaning of the data are more obvious. + +Semantic modeling is predominately used for read-heavy scenarios, such as analytics and business intelligence (OLAP), as opposed to more write-heavy transactional data processing (OLTP). This is mostly due to the nature of a typical semantic layer: + +- Aggregation behaviors are set so that reporting tools display them properly. +- Business logic and calculations are defined. +- Time-oriented calculations are included. +- Data is often integrated from multiple sources. + +Traditionally, the semantic layer is placed over a data warehouse for these reasons. + +![Example diagram of a semantic layer between a data warehouse and a reporting tool](../images/semantic-modeling.png) + +There are two primary types of semantic models: + +* **Tabular**. Uses relational modeling constructs (model, tables, columns). Internally, metadata is inherited from OLAP modeling constructs (cubes, dimensions, measures). Code and script use OLAP metadata. +* **Multidimensional**. Uses traditional OLAP modeling constructs (cubes, dimensions, measures). + +Relevant Azure service: +- [Azure Analysis Services](https://azure.microsoft.com/services/analysis-services/) + +## Example use case + +An organization has data stored in a large database. It wants to make this data available to business users and customers to create their own reports and do some analysis. One option is just to give those users direct access to the database. However, there are several drawbacks to doing this, including managing security and controlling access. Also, the design of the database, including the names of tables and columns, may be hard for a user to understand. Users would need to know which tables to query, how those tables should be joined, and other business logic that must be applied to get the correct results. Users would also need to know a query language like SQL even to get started. Typically this leads to multiple users reporting the same metrics but with different results. + +Another option is to encapsulate all of the information that users need into a semantic model. The semantic model can be more easily queried by users with a reporting tool of their choice. The data provided by the semantic model is pulled from a data warehouse, ensuring that all users see a single version of the truth. The semantic model also provides friendly table and column names, relationships between tables, descriptions, calculations, and row-level security. + +## Typical traits of semantic modeling + +Semantic modeling and analytical processing tends to have the following traits: + +| Requirement | Description | +| --- | --- | +| Schema | Schema on write, strongly enforced| +| Uses Transactions | No | +| Locking Strategy | None | +| Updateable | No (typically requires recomputing cube) | +| Appendable | No (typically requires recomputing cube) | +| Workload | Heavy reads, read-only | +| Indexing | Multidimensional indexing | +| Datum size | Small to medium sized | +| Model | Multidimensional | +| Data shape:| Cube or star/snowflake schema | +| Query flexibility | Highly flexible | +| Scale: | Large (10s-100s GBs) | + +## When to use this solution + +Consider OLAP in the following scenarios: + +- You need to execute complex analytical and ad hoc queries rapidly, without negatively affecting your OLTP systems. +- You want to provide business users with a simple way to generate reports from your data +- You want to provide a number of aggregations that will allow users to get fast, consistent results. + +OLAP is especially useful for applying aggregate calculations over large amounts of data. OLAP systems are optimized for read-heavy scenarios, such as analytics and business intelligence. OLAP allows users to segment multi-dimensional data into slices that can be viewed in two dimensions (such as a pivot table) or filter the data by specific values. This process is sometimes called "slicing and dicing" the data, and can be done regardless of whether the data is partitioned across several data sources. This helps users to find trends, spot patterns, and explore the data without having to know the details of traditional data analysis. + +Semantic models can help business users abstract relationship complexities and make it easier to analyze data quickly. + +## Challenges + +For all the benefits OLAP systems provide, they do produce a few challenges: + +- Whereas data in OLTP systems is constantly updated through transactions flowing in from various sources, OLAP data stores are typically refreshed at a much slower intervals, depending on business needs. This means OLAP systems are better suited for strategic business decisions, rather than immediate responses to changes. Also, some level of data cleansing and orchestration needs to be planned to keep the OLAP data stores up-to-date. +- Unlike traditional, normalized, relational tables found in OLTP systems, OLAP data models tend to be multidimensional. This makes it difficult or impossible to directly map to entity-relationship or object-oriented models, where each attribute is mapped to one column. Instead, OLAP systems typically use a star or snowflake schema in place of traditional normalization. + +## OLAP in Azure + +In Azure, data held in OLTP systems such as Azure SQL Database is copied into the OLAP system, such as [Azure Analysis Services](/azure/analysis-services/analysis-services-overview). Data exploration and visualization tools like [Power BI](https://powerbi.microsoft.com), Excel, and third-party options connect to Analysis Services servers and provide users with highly interactive and visually rich insights into the modeled data. The flow of data from OLTP data to OLAP is typically orchestrated using SQL Server Integration Services, which can be executed using [Azure Data Factory](/azure/data-factory/concepts-integration-runtime). + +In Azure, all of the following data stores will meet the core requirements for OLAP: + +- [SQL Server with Columnstore indexes](/sql/relational-databases/indexes/get-started-with-columnstore-for-real-time-operational-analytics) +- [Azure Analysis Services](/azure/analysis-services/analysis-services-overview) +- [SQL Server Analysis Services (SSAS)](/sql/analysis-services/analysis-services) + +SQL Server Analysis Services (SSAS) offers OLAP and data mining functionality for business intelligence applications. You can either install SSAS on local servers, or host within a virtual machine in Azure. Azure Analysis Services is a fully managed service that provides the same major features as SSAS. Azure Analysis Services supports connecting to [various data sources](/azure/analysis-services/analysis-services-datasource) in the cloud and on-premises in your organization. + +Clustered Columnstore indexes are available in SQL Server 2014 and above, as well as Azure SQL Database, and are ideal for OLAP workloads. However, beginning with SQL Server 2016 (including Azure SQL Database), you can take advantage of hybrid transactional/analytics processing (HTAP) through the use of updateable nonclustered columnstore indexes. HTAP enables you to perform OLTP and OLAP processing on the same platform, which removes the need to store multiple copies of your data, and eliminates the need for distinct OLTP and OLAP systems. For more information, see [Get started with Columnstore for real-time operational analytics](/sql/relational-databases/indexes/get-started-with-columnstore-for-real-time-operational-analytics). + +## Key selection criteria + +To narrow the choices, start by answering these questions: + +- Do you want a managed service rather than managing your own servers? + +- Do you require secure authentication using Azure Active Directory (Azure AD)? + +- Do you want to conduct real-time analytics? If so, narrow your options to those that support real-time analytics. + + *Real-time analytics* in this context applies to a single data source, such as an enterprise resource planning (ERP) application, that will run both an operational and an analytics workload. If you need to integrate data from multiple sources, or require extreme analytics performance by using pre-aggregated data such as cubes, you might still require a separate data warehouse. + +- Do you need to use pre-aggregated data, for example to provide semantic models that make analytics more business user friendly? If yes, choose an option that supports multidimensional cubes or tabular semantic models. + + Providing aggregates can help users consistently calculate data aggregates. Pre-aggregated data can also provide a large performance boost when dealing with several columns across many rows. Data can be pre-aggregated in multidimensional cubes or tabular semantic models. + +- Do you need to integrate data from several sources, beyond your OLTP data store? If so, consider options that easily integrate multiple data sources. + +## Capability matrix + +The following tables summarize the key differences in capabilities. + +### General capabilities + +| | Azure Analysis Services | SQL Server Analysis Services | SQL Server with Columnstore Indexes | Azure SQL Database with Columnstore Indexes | +| --- | --- | --- | --- | --- | +| Is managed service | Yes | No | No | Yes | +| Supports multidimensional cubes | No | Yes | No | No | +| Supports tabular semantic models | Yes | Yes | No | No | +| Easily integrate multiple data sources | Yes | Yes | No 1 | No 1 | +| Supports real-time analytics | No | No | Yes | Yes | +| Requires process to copy data from source(s) | Yes | Yes | No | No | +| Azure AD integration | Yes | No | No 2 | Yes | + +[1] Although SQL Server and Azure SQL Database cannot be used to query from and integrate multiple external data sources, you can still build a pipeline that does this for you using [SSIS](/sql/integration-services/sql-server-integration-services) or [Azure Data Factory](/azure/data-factory/). SQL Server hosted in an Azure VM has additional options, such as linked servers and [PolyBase](/sql/relational-databases/polybase/polybase-guide). For more information, see [Pipeline orchestration, control flow, and data movement](../technology-choices/pipeline-orchestration-data-movement.md). + +[2] Connecting to SQL Server running on an Azure Virtual Machine is not supported using an Azure AD account. Use a domain Active Directory account instead. + +### Scalability Capabilities + +| | Azure Analysis Services | SQL Server Analysis Services | SQL Server with Columnstore Indexes | Azure SQL Database with Columnstore Indexes | +| --- | --- | --- | --- | --- | +| Redundant regional servers for high availability | Yes | No | Yes | Yes | +| Supports query scale out | Yes | No | Yes | No | +| Dynamic scalability (scale up) | Yes | No | Yes | No | diff --git a/docs/data-guide/relational-data/online-transaction-processing.md b/docs/data-guide/relational-data/online-transaction-processing.md new file mode 100644 index 00000000000..9838797182b --- /dev/null +++ b/docs/data-guide/relational-data/online-transaction-processing.md @@ -0,0 +1,138 @@ +--- +title: Online transaction processing (OLTP) +description: +author: zoinerTejada +ms:date: 02/12/2018 +--- + +# Online transaction processing (OLTP) + +The management of transactional data using computer systems is referred to as Online Transaction Processing (OLTP). OLTP systems record business interactions as they occur in the day-to-day operation of the organization, and support querying of this data to make inferences. + +## Transactional data + +Transactional data is information that tracks the interactions related to an organization's activities. These interactions are typically business transactions, such as payments received from customers, payments made to suppliers, products moving through inventory, orders taken, or services delivered. Transactional events, which represent the transactions themselves, typically contain a time dimension, some numerical values, and references to other data. + +Transactions typically need to be *atomic* and *consistent*. Atomicity means that an entire transaction always succeeds or fails as one unit of work, and is never left in a half-completed state. If a transaction cannot be completed, the database system must roll back any steps that were already done as part of that transaction. In a traditional RDBMS, this rollback happens automatically if a transaction cannot be completed. Consistency means that transactions always leave the data in a valid state. (These are very informal descriptions of atomicity and consistency. There are more formal definitions of these properties, such as [ACID](https://en.wikipedia.org/wiki/ACID).) + +Transactional databases can support strong consistency for transactions using various locking strategies, such as pessimistic locking, to ensure that all data is strongly consistent within the context of the enterprise, for all users and processes. + +The most common deployment architecture that uses transactional data is the data store tier in a 3-tier architecture. A 3-tier architecture typically consists of a presentation tier, business logic tier, and data store tier. A related deployment architecture is the [N-tier](/azure/architecture/guide/architecture-styles/n-tier) architecture, which may have multiple middle-tiers handling business logic. + +## Typical traits of transactional data + +Transactional data tends to have the following traits: + +| Requirement | Description | +| --- | --- | +| Normalization | Highly normalized | +| Schema | Schema on write, strongly enforced| +| Consistency | Strong consistency, ACID guarantees | +| Integrity | High integrity | +| Uses transactions | Yes | +| Locking strategy | Pessimistic or optimistic| +| Updateable | Yes | +| Appendable | Yes | +| Workload | Heavy writes, moderate reads | +| Indexing | Primary and secondary indexes | +| Datum size | Small to medium sized | +| Model | Relational | +| Data shape | Tabular | +| Query flexibility | Highly flexible | +| Scale | Small (MBs) to Large (a few TBs) | + +## When to use this solution + +Choose OLTP when you need to efficiently process and store business transactions and immediately make them available to client applications in a consistent way. Use this architecture when any tangible delay in processing would have a negative impact on the day-to-day operations of the business. + +OLTP systems are designed to efficiently process and store transactions, as well as query transactional data. The goal of efficiently processing and storing individual transactions by an OLTP system is partly accomplished by data normalization — that is, breaking the data up into smaller chunks that are less redundant. This supports efficiency because it enables the OLTP system to process large numbers of transactions independently, and avoids extra processing needed to maintain data integrity in the presence of redundant data. + +## Challenges +Implementing and using an OLTP system can create a few challenges: + +- OLTP systems are not always good for handling aggregates over large amounts of data, although there are exceptions, such as a well-planned SQL Server-based solution. Analytics against the data, that rely on aggregate calculations over millions of individual transactions, are very resource intensive for an OLTP system. They can be slow to execute and can cause a slow-down by blocking other transactions in the database. +- When conducting analytics and reporting on data that is highly normalized, the queries tend to be complex, because most queries need to de-normalize the data by using joins. Also, naming conventions for database objects in OLTP systems tend to be terse and succinct. The increased normalization coupled with terse naming conventions makes OLTP systems difficult for business users to query, without the help of a DBA or data developer. +- Storing the history of transactions indefinitely and storing too much data in any one table can lead to slow query performance, depending on the number of transactions stored. The common solution is to maintain a relevant window of time (such as the current fiscal year) in the OLTP system and offload historical data to other systems, such as a data mart or [data warehouse](./data-warehousing.md). + +## OLTP in Azure + +Applications such as websites hosted in [App Service Web Apps](/azure/app-service/app-service-web-overview), REST APIs running in App Service, or mobile or desktop applications communicate with the OLTP system, typically via a REST API intermediary. + +In practice, most workloads are not purely OLTP. There tends to be an analytical component as well. In addition, there is an increasing demand for real-time reporting, such as running reports against the operational system. This is also referred to as HTAP (Hybrid Transactional and Analytical Processing). For more information, see [Online Analytical Processing (OLAP)](./online-analytical-processing.md). + +In Azure, all of the following data stores will meet the core requirements for OLTP and the management of transaction data: + +- [Azure SQL Database](/azure/sql-database/) +- [SQL Server in an Azure virtual machine](/azure/virtual-machines/windows/sql/virtual-machines-windows-sql-server-iaas-overview?toc=%2Fazure%2Fvirtual-machines%2Fwindows%2Ftoc.json) +- [Azure Database for MySQL](/azure/mysql/) +- [Azure Database for PostgreSQL](/azure/postgresql/) + +## Key selection criteria + +To narrow the choices, start by answering these questions: + +- Do you want a managed service rather than managing your own servers? + +- Does your solution have specific dependencies for Microsoft SQL Server, MySQL or PostgreSQL compatibility? Your application may limit the data stores you can choose based on the drivers it supports for communicating with the data store, or the assumptions it makes about which database is used. + +- Are your write throughput requirements particularly high? If yes, choose an option that provides in-memory tables. + +- Is your solution multi-tenant? If so, consider options that support capacity pools, where multiple database instances draw from an elastic pool of resources, instead of fixed resources per database. This can help you better distribute capacity across all database instances, and can make your solution more cost effective. + +- Does your data need to be readable with low latency in multiple regions? If yes, choose an option that supports readable secondary replicas. + +- Does your database need to be highly available across geo-graphic regions? If yes, choose an option that supports geographic replication. Also consider the options that support automatic failover from the primary replica to a secondary replica. + +- Does your database have specific security needs? If yes, examine the options that provide capabilities like row level security, data masking, and transparent data encryption. + +## Capability matrix + +The following tables summarize the key differences in capabilities. + +### General capabilities +| | Azure SQL Database | SQL Server in an Azure virtual machine | Azure Database for MySQL | Azure Database for PostgreSQL | +| --- | --- | --- | --- | --- | --- | +| Is Managed Service | Yes | No | Yes | Yes | +| Runs on Platform | N/A | Windows, Linux, Docker | N/A | N/A | +| Programmability 1 | T-SQL, .NET, R | T-SQL, .NET, R, Python | T-SQL, .NET, R, Python | SQL | SQL | + +[1] Not including client driver support, which allows many programming languages to connect to and use the OLTP data store. + +### Scalability capabilities +| | Azure SQL Database | SQL Server in an Azure virtual machine| Azure Database for MySQL | Azure Database for PostgreSQL| +| --- | --- | --- | --- | --- | --- | +| Maximum database instance size | [4 TB](/azure/sql-database/sql-database-resource-limits) | 256 TB | [1 TB](/azure/mysql/concepts-limits) | [1 TB](/azure/postgresql/concepts-limits) | +| Supports capacity pools | Yes | Yes | No | No | +| Supports clusters scale out | No | Yes | No | No | +| Dynamic scalability (scale up) | Yes | No | Yes | Yes | + +### Analytic workload capabilities +| | Azure SQL Database | SQL Server in an Azure virtual machine| Azure Database for MySQL | Azure Database for PostgreSQL| +| --- | --- | --- | --- | --- | --- | +| Temporal tables | Yes | Yes | No | No | +| In-memory (memory-optimized) tables | Yes | Yes | No | No | +| Columnstore support | Yes | Yes | No | No | +| Adaptive query processing | Yes | Yes | No | No | + +### Availability capabilities +| | Azure SQL Database | SQL Server in an Azure virtual machine| Azure Database for MySQL | Azure Database for PostgreSQL| +| --- | --- | --- | --- | --- | --- | +| Readable secondaries | Yes | Yes | No | No | +| Geographic replication | Yes | Yes | No | No | +| Automatic failover to secondary | Yes | No | No | No| +| Point-in-time restore | Yes | Yes | Yes | Yes | + +### Security capabilities +| | Azure SQL Database | SQL Server in an Azure virtual machine| Azure Database for MySQL | Azure Database for PostgreSQL| +| --- | --- | --- | --- | --- | --- | +| Row level security | Yes | Yes | Yes | Yes | +| Data masking | Yes | Yes | No | No | +| Transparent data encryption | Yes | Yes | Yes | Yes | +| Restrict access to specific IP addresses | Yes | Yes | Yes | Yes | +| Restrict access to allow VNET access only | Yes | Yes | No | No | +| Azure Active Directory authentication | Yes | Yes | No | No | +| Active Directory authentication | No | Yes | No | No | +| Multi-factor authentication | Yes | Yes | No | No | +| Supports [Always Encrypted](/sql/relational-databases/security/encryption/always-encrypted-database-engine) | Yes | Yes | Yes | No | No | +| Private IP | No | Yes | Yes | No | No | + diff --git a/docs/data-guide/concepts/advanced-analytics.md b/docs/data-guide/scenarios/advanced-analytics.md similarity index 100% rename from docs/data-guide/concepts/advanced-analytics.md rename to docs/data-guide/scenarios/advanced-analytics.md diff --git a/docs/data-guide/concepts/csv-and-json.md b/docs/data-guide/scenarios/csv-and-json.md similarity index 98% rename from docs/data-guide/concepts/csv-and-json.md rename to docs/data-guide/scenarios/csv-and-json.md index 7bdd87c61c9..c5e09599271 100644 --- a/docs/data-guide/concepts/csv-and-json.md +++ b/docs/data-guide/scenarios/csv-and-json.md @@ -40,7 +40,7 @@ CSV and JSON file formats both make it easy to exchange data between dissimilar Azure provides several solutions for working with CSV and JSON files, depending on your needs. The primary landing place for these files is either Azure Storage or Azure Data Lake Store. Most Azure services that work with these and other text-based files integrate with either object storage service. In some situations, however, you may opt to directly import the data into Azure SQL or some other data store. SQL Server has native support for storing and working with JSON documents, which makes it easy to [import and process those types of files](/sql/relational-databases/json/import-json-documents-into-sql-server). You can use a utility like SQL Bulk Import to easily [import CSV files](/sql/relational-databases/json/import-json-documents-into-sql-server). -Depending on the scenario, you may perform [batch processing](../scenarios/batch-processing.md) or [real-time processing](../scenarios/real-time-processing.md) of the data. +Depending on the scenario, you may perform [batch processing](../big-data/batch-processing.md) or [real-time processing](../big-data/real-time-processing.md) of the data. ## Challenges diff --git a/docs/data-guide/concepts/data-lake.md b/docs/data-guide/scenarios/data-lake.md similarity index 82% rename from docs/data-guide/concepts/data-lake.md rename to docs/data-guide/scenarios/data-lake.md index bbd186c6c94..16447bf683c 100644 --- a/docs/data-guide/concepts/data-lake.md +++ b/docs/data-guide/scenarios/data-lake.md @@ -1,6 +1,6 @@ # Data lakes -A data lake is a storage repository that holds a large amount of data in its native, raw format. Data lake stores are optimized for scaling to terabytes and petabytes of data. The data typically comes from multiple heterogeneous sources, and may be structured, semi-structured, or unstructured. The idea with a data lake is to store everything in its original, untransformed state. This approach differs from a traditional [data warehouse](../scenarios/data-warehousing.md), which transforms and processes the data at the time of ingestion. +A data lake is a storage repository that holds a large amount of data in its native, raw format. Data lake stores are optimized for scaling to terabytes and petabytes of data. The data typically comes from multiple heterogeneous sources, and may be structured, semi-structured, or unstructured. The idea with a data lake is to store everything in its original, untransformed state. This approach differs from a traditional [data warehouse](../relational-data/data-warehousing.md), which transforms and processes the data at the time of ingestion. Advantages of a data lake: @@ -13,9 +13,9 @@ A complete data lake solution consists of both storage and processing. Data lake ## When to use a data lake -Typical uses for a data lake include [data exploration](../scenarios/interactive-data-exploration.md), data analytics, and machine learning. +Typical uses for a data lake include [data exploration](./interactive-data-exploration.md), data analytics, and machine learning. -A data lake can also act as the data source for a data warehouse. With this approach, the raw data is ingested into the data lake and then transformed into a structured queryable format. Typically this transformation uses an [ELT](../scenarios/etl.md#extract-load-and-transform-elt) (extract-load-transform) pipeline, where the data is ingested and transformed in place. Source data that is already relational may go directly into the data warehouse, using an ETL process, skipping the data lake. +A data lake can also act as the data source for a data warehouse. With this approach, the raw data is ingested into the data lake and then transformed into a structured queryable format. Typically this transformation uses an [ELT](../relational-data/etl.md#extract-load-and-transform-elt) (extract-load-transform) pipeline, where the data is ingested and transformed in place. Source data that is already relational may go directly into the data warehouse, using an ETL process, skipping the data lake. Data lake stores are often used in event streaming or IoT scenarios, because they can persist large amounts of relational and nonrelational data without transformation or schema definition. They are built to handle high volumes of small writes at low latency, and are optimized for massive throughput. diff --git a/docs/data-guide/scenarios/data-warehousing.md b/docs/data-guide/scenarios/data-warehousing.md deleted file mode 100644 index 0c5916bc719..00000000000 --- a/docs/data-guide/scenarios/data-warehousing.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Data warehousing and data marts -description: -author: zoinerTejada -ms:date: 02/12/2018 ---- - -# Data warehousing and data marts - -A data warehouse is a central, organizational, relational repository of integrated data from one or more disparate sources, across many or all subject areas. Data warehouses store current and historical data and are used for reporting and analysis of the data in different ways. - -![Data warehousing in Azure](./images/data-warehousing.png) - -To move data into a data warehouse, it is extracted on a periodic basis from various sources that contain important business information. As the data is moved, it can be formatted, cleaned, validated, summarized, and reorganized. Alternately, the data can be stored in the lowest level of detail, with aggregated views provided in the warehouse for reporting. In either case, the data warehouse becomes a permanent storage space for data used for reporting, analysis, and forming important business decisions using business intelligence (BI) tools. - -## Data marts and operational data stores - -Managing data at scale is complex, and it is becoming less common to have a single data warehouse that represents all data across the entire enterprise. Instead, organizations create smaller, more focused data warehouses, called *data marts*, that expose the desired data for analytics purposes. An orchestration process populates the data marts from data maintained in an operational data store. The operational data store acts as an intermediary between the source transactional system and the data mart. Data managed by the operational data store is a cleaned version of the data present in the source transactional system, and is typically a subset of the historical data that is maintained by the data warehouse or data mart. - -## When to use this solution - -Choose a data warehouse when you need to turn massive amounts of data from operational systems into a format that is easy to understand, current, and accurate. Data warehouses do not need to follow the same terse data structure you may be using in your operational/OLTP databases. You can use column names that make sense to business users and analysts, restructure the schema to simplify data relationships, and consolidate several tables into one. These steps help guide users who need to create ad hoc reports, or create reports and analyze the data in BI systems, without the help of a database administrator (DBA) or data developer. - -Consider using a data warehouse when you need to keep historical data separate from the source transaction systems for performance reasons. Data warehouses make it easy to access historical data from multiple locations, by providing a centralized location using common formats, common keys, common data models, and common access methods. - -Data warehouses are optimized for read access, resulting in faster report generation compared to running reports against the source transaction system. In addition, data warehouses provide the following benefits: - -* All historical data from multiple sources can be stored and accessed from a data warehouse as the single source of truth. -* You can improve data quality by cleaning up data as it is imported into the data warehouse, providing more accurate data as well as providing consistent codes and descriptions. -* Reporting tools do not compete with the transactional source systems for query processing cycles. A data warehouse allows the transactional system to focus predominantly on handling writes, while the data warehouse satisfies the majority of read requests. -* A data warehouse can help consolidate data from different software. -* Data mining tools can help you find hidden patterns using automatic methodologies against data stored in your warehouse. -* Data warehouses make it easier to provide secure access to authorized users, while restricting access to others. There is no need to grant business users access to the source data, thereby removing a potential attack vector against one or more production transaction systems. -* Data warehouses make it easier to create business intelligence solutions on top of the data, such as [OLAP cubes](online-analytical-processing.md). - -## Challenges - -Properly configuring a data warehouse to fit the needs of your business can bring some of the following challenges: - -* Committing the time required to properly model your business concepts. This is an important step, as data warehouses are information driven, where concept mapping drives the rest of the project. This involves standardizing business-related terms and common formats (such as currency and dates), and restructuring the schema in a way that makes sense to business users but still ensures accuracy of data aggregates and relationships. -* Planning and setting up your data orchestration. Consideration include how to copy data from the source transactional system to the data warehouse, and when to move historical data out of your operational data stores and into the warehouse. -* Maintaining or improving data quality by cleaning the data as it is imported into the warehouse. - -## Data warehousing in Azure - -In Azure, you may have one or more sources of data, whether from customer transactions, or from various business applications used by various departments. This data is traditionally stored in one or more [OLTP](online-transaction-processing.md) databases. The data could be persisted in other storage mediums such as network shares, Azure Storage Blobs, or a data lake. The data could also be stored by the data warehouse itself or in a relational database such as Azure SQL Database. The purpose of the analytical data store layer is to satisfy queries issued by analytics and reporting tools against the data warehouse or data mart. In Azure, this analytical store capability can be met with Azure SQL Data Warehouse, or with Azure HDInsight using Hive or Interactive Query. In addition, you will need some level of orchestration to periodically move or copy data from data storage to the data warehouse, which can be done using Azure Data Factory or Oozie on Azure HDInsight. - -Related services: - -* [Azure SQL Database](/azure/sql-database/) -* [SQL Server in a VM](/sql/sql-server/sql-server-technical-documentation) -* [Azure Data Warehouse](/azure/sql-data-warehouse/sql-data-warehouse-overview-what-is) -* [Apache Hive on HDInsight](/azure/hdinsight/hadoop/hdinsight-use-hive) -* [Interactive Query (Hive LLAP) on HDInsight](/azure/hdinsight/interactive-query/apache-interactive-query-get-started) - - -## Technology choices - -- [Data warehouses](../technology-choices/data-warehouses.md) -- [Pipeline orchestration](../technology-choices/pipeline-orchestration-data-movement.md) - diff --git a/docs/data-guide/scenarios/images/oltp-data-pipeline.png b/docs/data-guide/scenarios/images/oltp-data-pipeline.png deleted file mode 100644 index deeadfcb8068ed5b1de53b9e42a75047a805887b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19260 zcmeIaWl&sO&^F4zAcGC=GB^Q(1cJLKSP}?9f_s8Pa2Z^Kg&@HbEWsfmxC|cL-QC^o z4kYKi=e%FtzqfAPd!~w_X4jt8y?U+g)lWaYcgQnkIV^NCbOZzhtS9o)FAxw=#1Rkx zo@hw$D{rIK%;EolW)eyg2nZ#S7*__!2na|B&lJ^U__T|K)Auwp=Zp$B%*%GIDvpYZ zib_jMgH!twzKtXmjAs3qEUudkYduNoIZf$3%^5nYYF#WHKQEs=ubDY-YHDh2Z5RIg^+UOqH9Gu*4UbyI9xg6TKoS5I6*uL7_+?-!IT-i8Y*t=Rgyx!hF+c~*D zJv}`*zBoF+xwyDEzqmTTy1Bi*h3om>=RXVlKW2gTm-**#VIW(1O$P)7`qjHXz)?XS z3j89eql|{5s*S0mvw^({f~|ptwIjQ=i6exEos*qQU}&V&7y&`9;EA+^nv3ps%3G<) zx}RB>NuA#MP^t+7_N6|=AY0OesNLIb)1m?f%{uz1q4%`kQ;C0ke^K&TsdhJZJ66lxbN)K70e*Wq9msm^J)g|BWYeTsH%8Id4h_v5);CK9g^V=3j zsqU@mS~`K?HkG`%^kZAw$B}}*eIeH}zD&2Zb>My}3BdSv4XO=86g2qF+}ssBlRdi1W@eLb4XdfY#)Vk``a~}yXL#k6wBeg5Rcu^_m`+IL*oq0I-RFvp)kdV0v zlyM(bO_2ttAuKNGN`;VcfdfgQFJYR5@rxseOOlJppaogH`=)a++L7U zkQb+QG%Pc?*thSn)qe#@?7E#^GWxlkm7-kzmfTDRu@pa>8f;g)zV)tF6r=IAIAS6L zii+-N5f#LF^JOw@YQG|SAEf2~XRlbYclFnEk|fHATaWIlA3roolR$*s9_WR?P2%Q6 z(_Nex%mFS#*(6@0{|#qcYle1I2t=c$c|ZSLQ!1Z9dF8yg9`0*ess3I}XlYba1LHN}VZq z8M$vC74^eGnI0mfuZmWv8I8*R)Kg3Rz_Mr)HL$^#pAS=AWU@A+`s38g}%($b8l4b^n%Q6S5lCwmTN+%!bGS*p1=}bVsx&)h2zl#71MYnhamnxx)I8`Ot-# zi$TPg&0fRWI@7-P=5_imwPFRZp!57!u>~W2(WH`JyOKknTJbF2F6ZI0tK`z5rHm;G zD+!}0q;)l^Bq5CnFH}!=UFuf5uKnmHW#1W;QtuBkdksul&N$R9q8{Z??{3*Wg&-O! zA(v&(w^|t5B{vt+hnM8 zWk^E3o>OS)(@9p0S*=R#A_(rPLPFI>PeEU0%D5>d^IO%}ig0G(i-w%VLX-0YQz>_S=s}fFZ2W4fl#frwsyAYK{NJ(X z(QM_-oi9YSeP0S=H#9H?f#iLaEg56zdgQ4{g7hrjZ@SwyTj1$$;85MBEz_Y@-HFzYnuY4O4T_&L@iIbjge!I5kH&e;rJR`9 zp1!U)5I|w86;xdkEciUW)mA!=NiW^&fg6@#t$Ub-W~A_YaTNJ)%`t*#Z;_j1UpLQhN`2o@=HbGVD*cDkOE0_+svXRXKg5yZ{@)gaA2S6lKBy$eYiW zg+_CXVbC2v3Pr8k{xFk9p$wvfc?noS`89A_wx`xtLk9I+J1 z!0N%`2X{!%o2E%$UTzReb7D}pbWM+H8He9@5BfSqc>av=M}q3%Ffk4P*kY5zU+4Gbm-FJ2O=BH)^(2pFp5?cFfc-k9x%tAoPzq z+irwc8ni}SZwG67CCXkO7G%OY(9#eK~)X7q#*1GVV9q8 zt&W4vW!*^qs8vWcFNQTME#D9f)pUwP9PcHnYXK@E}!om122k11xaZrw9*7Fh*cUecHR;

=o)A6O=K{L<6 zFmm260+fX@$ab1-Aweb~SZhUAN`ZAGe}(r$1M~wg?{}`Q=bKzZ%0Zn-GfS-)i?3|v zhm6{;zI)YQ;Ii0BcPsa=ltlz3fPs|Ft#p0(rUE%y7*QQD+=w8jpf*1wLqJxu%kLW9QrYfJA1`RM(MKGz!LGwX5BFR8yEXNIQNI^!3-e zlt#bSLZa?0IoFTIq%|fnUC&#ur@Xu=#cqGE^HSVn@=B&iuhG}`5W$-aqnq`wR6sj) zamk^BRyWDV@W9AUHONYnoOF1$Dm??3WR9Pysd(BIgZ!&qf{Yr0A@;W`}e=)mY zX3a!#*y};sWy-To=+O2mKI(L%gFgNA$5bkV`e@1=@yw-5bsN<$=eJ08c|w9_@t1t| z_05qeW+0vWO<-?d+q{Yy&o}-;wZdFnYNwg+{P07|fSz=(H?HTfmED=eKyOysq<;|g zu1J%dn;v!G9ad`{Y4_QKR$gi9|ff#%q!ZsH2W+6%YQ@aQrMM>x=!Ll?DoFO=%9MgB+wI41$Miza)I@2>SAp}so2i*y<$^5UYhh^44vRkN{p zs(a#$Y$!BuS9%)Q2r6f^&A@%oQv|`H^Kib z@!u}M`G5H?Xvd!WMM8kQ_uHkpo<|4*m#%h5f3WX*_32;PPQG#Vl=Sma#Kaa4J*=t` z$gwhemMZZa;T8!UB!7oLzn}mFyiE#FlxB%o$-;#uL>VCZKhodHJ&U`$YZ0Ej-QR@> zIByiBobZs0aS_QP#YI7Nsf!pU-8Sm6(IqAGiNOp-JWEr)M>wA;+BhI)xx4S|oSdAz z%0A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 TAMv~Q3q6rhmM)ak_x-;BV%v71 diff --git a/docs/data-guide/scenarios/interactive-data-exploration.md b/docs/data-guide/scenarios/interactive-data-exploration.md index 7345ec86aee..14fe70bb5b2 100644 --- a/docs/data-guide/scenarios/interactive-data-exploration.md +++ b/docs/data-guide/scenarios/interactive-data-exploration.md @@ -48,7 +48,7 @@ Relevant Azure services: ## Architecture -Although the goal of this scenario is to support interactive data analysis, the data cleansing, sampling, and structuring tasks involved in data science often include long-running processes. That makes a [batch processing](./batch-processing.md) architecture appropriate. +Although the goal of this scenario is to support interactive data analysis, the data cleansing, sampling, and structuring tasks involved in data science often include long-running processes. That makes a [batch processing](../big-data/batch-processing.md) architecture appropriate. ## Technology choices diff --git a/docs/data-guide/scenarios/natural-language-processing.md b/docs/data-guide/scenarios/natural-language-processing.md index 30551a66847..d5744b182cc 100644 --- a/docs/data-guide/scenarios/natural-language-processing.md +++ b/docs/data-guide/scenarios/natural-language-processing.md @@ -30,7 +30,7 @@ When using NLP to extract information and insight from free-form text, the start ## Architecture -In an NLP solution, free-form text processing is performed against documents containing paragraphs of text. The overall architecture can be a [batch processing](./batch-processing.md) or [real-time stream processing](./real-time-processing.md) architecture. +In an NLP solution, free-form text processing is performed against documents containing paragraphs of text. The overall architecture can be a [batch processing](../big-data/batch-processing.md) or [real-time stream processing](../big-data/real-time-processing.md) architecture. The actual processing varies based on the desired outcome, but in terms of the pipeline, NLP may be applied in a batch or real-time fashion. For example, sentiment analysis can be used against blocks of text to produce a sentiment score. This can could be done by running a batch process against data in storage, or in real time using smaller chunks of data flowing through a messaging service. diff --git a/docs/data-guide/scenarios/online-analytical-processing.md b/docs/data-guide/scenarios/online-analytical-processing.md deleted file mode 100644 index 466bb32219d..00000000000 --- a/docs/data-guide/scenarios/online-analytical-processing.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Online analytical processing (OLAP) -description: -author: zoinerTejada -ms:date: 02/12/2018 ---- - -# Online analytical processing (OLAP) - -Online analytical processing (OLAP) is a technology that organizes large business databases and supports complex analysis. It can be used to perform complex analytical queries without negatively affecting transactional systems. - -The databases that a business uses to store all its transactions and records are called [online transaction processing (OLTP)](online-transaction-processing.md) databases. These databases usually have records that are entered one at a time. Often they contain a great deal of information that is valuable to the organization. The databases that are used for OLTP, however, were not designed for analysis. Therefore, retrieving answers from these databases is costly in terms of time and effort. OLAP systems were designed to help extract this business intelligence information from the data in a highly performant way. This is because OLAP databases are optimized for heavy read, low write workloads. - -![OLAP in Azure](./images/olap-data-pipeline.png) - -## When to use this solution - -Consider OLAP in the following scenarios: - -- You need to execute complex analytical and ad hoc queries rapidly, without negatively affecting your OLTP systems. -- You want to provide business users with a simple way to generate reports from your data -- You want to provide a number of aggregations that will allow users to get fast, consistent results. - -OLAP is especially useful for applying aggregate calculations over large amounts of data. OLAP systems are optimized for read-heavy scenarios, such as analytics and business intelligence. OLAP allows users to segment multi-dimensional data into slices that can be viewed in two dimensions (such as a pivot table) or filter the data by specific values. This process is sometimes called "slicing and dicing" the data, and can be done regardless of whether the data is partitioned across several data sources. This helps users to find trends, spot patterns, and explore the data without having to know the details of traditional data analysis. - -[Semantic models](../concepts/semantic-modeling.md) can help business users abstract relationship complexities and make it easier to analyze data quickly. - -## Challenges - -For all the benefits OLAP systems provide, they do produce a few challenges: - -- Whereas data in OLTP systems is constantly updated through transactions flowing in from various sources, OLAP data stores are typically refreshed at a much slower intervals, depending on business needs. This means OLAP systems are better suited for strategic business decisions, rather than immediate responses to changes. Also, some level of data cleansing and orchestration needs to be planned to keep the OLAP data stores up-to-date. -- Unlike traditional, normalized, relational tables found in OLTP systems, OLAP data models tend to be multidimensional. This makes it difficult or impossible to directly map to entity-relationship or object-oriented models, where each attribute is mapped to one column. Instead, OLAP systems typically use a star or snowflake schema in place of traditional normalization. - -## OLAP in Azure - -In Azure, data held in OLTP systems such as Azure SQL Database is copied into the OLAP system, such as [Azure Analysis Services](/azure/analysis-services/analysis-services-overview). Data exploration and visualization tools like [Power BI](https://powerbi.microsoft.com), Excel, and third-party options connect to Analysis Services servers and provide users with highly interactive and visually rich insights into the modeled data. The flow of data from OLTP data to OLAP is typically orchestrated using SQL Server Integration Services, which can be executed using [Azure Data Factory](/azure/data-factory/concepts-integration-runtime). - -## Technology choices - -- [Online Analytical Processing (OLAP) data stores](../technology-choices/olap-data-stores.md) - diff --git a/docs/data-guide/scenarios/online-transaction-processing.md b/docs/data-guide/scenarios/online-transaction-processing.md deleted file mode 100644 index 37e7bb4f483..00000000000 --- a/docs/data-guide/scenarios/online-transaction-processing.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: Online transaction processing (OLTP) -description: -author: zoinerTejada -ms:date: 02/12/2018 ---- - -# Online transaction processing (OLTP) - -The management of [transactional data](../concepts/transactional-data.md) using computer systems is referred to as Online Transaction Processing (OLTP). OLTP systems record business interactions as they occur in the day-to-day operation of the organization, and support querying of this data to make inferences. - -![OLTP in Azure](./images/oltp-data-pipeline.png) - -## When to use this solution - -Choose OLTP when you need to efficiently process and store business transactions and immediately make them available to client applications in a consistent way. Use this architecture when any tangible delay in processing would have a negative impact on the day-to-day operations of the business. - -OLTP systems are designed to efficiently process and store transactions, as well as query transactional data. The goal of efficiently processing and storing individual transactions by an OLTP system is partly accomplished by data normalization — that is, breaking the data up into smaller chunks that are less redundant. This supports efficiency because it enables the OLTP system to process large numbers of transactions independently, and avoids extra processing needed to maintain data integrity in the presence of redundant data. - -## Challenges -Implementing and using an OLTP system can create a few challenges: - -- OLTP systems are not always good for handling aggregates over large amounts of data, although there are exceptions, such as a well-planned SQL Server-based solution. Analytics against the data, that rely on aggregate calculations over millions of individual transactions, are very resource intensive for an OLTP system. They can be slow to execute and can cause a slow-down by blocking other transactions in the database. -- When conducting analytics and reporting on data that is highly normalized, the queries tend to be complex, because most queries need to de-normalize the data by using joins. Also, naming conventions for database objects in OLTP systems tend to be terse and succinct. The increased normalization coupled with terse naming conventions makes OLTP systems difficult for business users to query, without the help of a DBA or data developer. -- Storing the history of transactions indefinitely and storing too much data in any one table can lead to slow query performance, depending on the number of transactions stored. The common solution is to maintain a relevant window of time (such as the current fiscal year) in the OLTP system and offload historical data to other systems, such as a data mart or [data warehouse](../technology-choices/data-warehouses.md). - -## OLTP in Azure - -Applications such as websites hosted in [App Service Web Apps](/azure/app-service/app-service-web-overview), REST APIs running in App Service, or mobile or desktop applications communicate with the OLTP system, typically via a REST API intermediary. - -In practice, most workloads are not purely OLTP. There tends to be an [analytical component](../scenarios/online-analytical-processing.md) as well. In addition, there is an increasing demand for real-time reporting, such as running reports against the operational system. This is also referred to as HTAP (Hybrid Transactional and Analytical Processing). For more information, see [Online Analytical Processing (OLAP) data stores](../technology-choices/olap-data-stores.md). - -## Technology choices - -Data storage: - -- [Azure SQL Database](/azure/sql-database/) -- [SQL Server in an Azure VM](/azure/virtual-machines/windows/sql/virtual-machines-windows-sql-server-iaas-overview?toc=%2Fazure%2Fvirtual-machines%2Fwindows%2Ftoc.json) -- [Azure Database for MySQL](/azure/mysql/) -- [Azure Database for PostgreSQL](/azure/postgresql/) - -For more information, see [Choosing an OLTP data store](../technology-choices/oltp-data-stores.md) - -Data sources: - -- [App service](/azure/app-service/) -- [Mobile Apps](/azure/app-service-mobile/) - diff --git a/docs/data-guide/scenarios/time-series.md b/docs/data-guide/scenarios/time-series.md index 50a8dce3fd0..f25cb8a2d5b 100644 --- a/docs/data-guide/scenarios/time-series.md +++ b/docs/data-guide/scenarios/time-series.md @@ -38,7 +38,7 @@ Using time series offers the following benefits: Data collected by IoT devices is a natural fit for time series storage and analysis. The incoming data is inserted and rarely, if ever, updated. The data is time stamped and inserted in the order it was received, and this data is typically displayed in chronological order, enabling users to discover trends, spot anomalies, and use the information for predictive analysis. -For more information, see [Internet of Things](../concepts/big-data.md#internet-of-things-iot). +For more information, see [Internet of Things](../big-data/index.md#internet-of-things-iot). ### Real-time analytics @@ -53,7 +53,7 @@ Ideally, you would have a stream processing layer that can handle the incoming d ## Architecture -In many scenarios that involve time series data, such as IoT, the data is captured in real time. As such, a [real-time processing](./real-time-processing.md) architecture is appropriate. +In many scenarios that involve time series data, such as IoT, the data is captured in real time. As such, a [real-time processing](../big-data/real-time-processing.md) architecture is appropriate. Data from one or more data sources is ingested into the stream buffering layer by [IoT Hub](/azure/iot-hub/), [Event Hubs](/azure/event-hubs/), or [Kafka on HDInsight](/azure/hdinsight/kafka/apache-kafka-introduction). Next, the data is processed in the stream processing layer that can optionally hand off the processed data to a machine learning service for predictive analytics. The processed data is stored in an analytical data store, such as [HBase](/azure/hdinsight/hbase/apache-hbase-overview), [Azure Cosmos DB](/azure/cosmos-db/), Azure Data Lake, or Blob Storage. An analytics and reporting application or service, like Power BI or OpenTSDB (if stored in HBase) can be used to display the time series data for analysis. diff --git a/docs/data-guide/technology-choices/analytical-data-stores.md b/docs/data-guide/technology-choices/analytical-data-stores.md index e88a309f11e..2a60a7ee039 100644 --- a/docs/data-guide/technology-choices/analytical-data-stores.md +++ b/docs/data-guide/technology-choices/analytical-data-stores.md @@ -7,9 +7,9 @@ ms:date: 02/12/2018 # Choosing an analytical data store in Azure -In a [big data](../concepts/big-data.md) architecture, there is often a need for an analytical data store that serves processed data in a structured format that can be queried using analytical tools. Analytical data stores that support querying of both hot-path and cold-path data are collectively referred to as the serving layer, or data serving storage. +In a [big data](../big-data/index.md) architecture, there is often a need for an analytical data store that serves processed data in a structured format that can be queried using analytical tools. Analytical data stores that support querying of both hot-path and cold-path data are collectively referred to as the serving layer, or data serving storage. -The serving layer deals with processed data from both the hot path and cold path. In the [lambda architecture](../concepts/big-data.md#lambda-architecture), the serving layer is subdivided into a _speed serving_ layer, which stores data that has been processed incrementally, and a _batch serving_ layer, which contains the batch-processed output. The serving layer requires strong support for random reads with low latency. Data storage for the speed layer should also support random writes, because batch loading data into this store would introduce undesired delays. On the other hand, data storage for the batch layer does not need to support random writes, but batch writes instead. +The serving layer deals with processed data from both the hot path and cold path. In the [lambda architecture](../big-data/index.md#lambda-architecture), the serving layer is subdivided into a _speed serving_ layer, which stores data that has been processed incrementally, and a _batch serving_ layer, which contains the batch-processed output. The serving layer requires strong support for random reads with low latency. Data storage for the speed layer should also support random writes, because batch loading data into this store would introduce undesired delays. On the other hand, data storage for the batch layer does not need to support random writes, but batch writes instead. There is no single best data management choice for all data storage tasks. Different data management solutions are optimized for different tasks. Most real-world cloud apps and big data processes have a variety of data storage requirements and often use a combination of data storage solutions. diff --git a/docs/data-guide/technology-choices/olap-data-stores.md b/docs/data-guide/technology-choices/olap-data-stores.md deleted file mode 100644 index 41bf6636738..00000000000 --- a/docs/data-guide/technology-choices/olap-data-stores.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: Choosing an OLAP data store -description: -author: zoinerTejada -ms:date: 02/12/2018 ---- - -# Choosing an OLAP data store in Azure - -Online analytical processing (OLAP) is a technology that organizes large business databases and supports complex analysis. This topic compares the options for OLAP solutions in Azure. - -> [!NOTE] -> For more information about when to use an OLAP data store, see [Online analytical processing](../scenarios/online-analytical-processing.md). - -## What are your options when choosing an OLAP data store? - -In Azure, all of the following data stores will meet the core requirements for OLAP: - -- [SQL Server with Columnstore indexes](/sql/relational-databases/indexes/get-started-with-columnstore-for-real-time-operational-analytics) -- [Azure Analysis Services](/azure/analysis-services/analysis-services-overview) -- [SQL Server Analysis Services (SSAS)](/sql/analysis-services/analysis-services) - -SQL Server Analysis Services (SSAS) offers OLAP and data mining functionality for business intelligence applications. You can either install SSAS on local servers, or host within a virtual machine in Azure. Azure Analysis Services is a fully managed service that provides the same major features as SSAS. Azure Analysis Services supports connecting to [various data sources](/azure/analysis-services/analysis-services-datasource) in the cloud and on-premises in your organization. - -Clustered Columnstore indexes are available in SQL Server 2014 and above, as well as Azure SQL Database, and are ideal for OLAP workloads. However, beginning with SQL Server 2016 (including Azure SQL Database), you can take advantage of hybrid transactional/analytics processing (HTAP) through the use of updateable nonclustered columnstore indexes. HTAP enables you to perform OLTP and OLAP processing on the same platform, which removes the need to store multiple copies of your data, and eliminates the need for distinct OLTP and OLAP systems. For more information, see [Get started with Columnstore for real-time operational analytics](/sql/relational-databases/indexes/get-started-with-columnstore-for-real-time-operational-analytics). - -## Key selection criteria - -To narrow the choices, start by answering these questions: - -- Do you want a managed service rather than managing your own servers? - -- Do you require secure authentication using Azure Active Directory (Azure AD)? - -- Do you want to conduct real-time analytics? If so, narrow your options to those that support real-time analytics. - - *Real-time analytics* in this context applies to a single data source, such as an enterprise resource planning (ERP) application, that will run both an operational and an analytics workload. If you need to integrate data from multiple sources, or require extreme analytics performance by using pre-aggregated data such as cubes, you might still require a separate data warehouse. - -- Do you need to use pre-aggregated data, for example to provide semantic models that make analytics more business user friendly? If yes, choose an option that supports multidimensional cubes or tabular semantic models. - - Providing aggregates can help users consistently calculate data aggregates. Pre-aggregated data can also provide a large performance boost when dealing with several columns across many rows. Data can be pre-aggregated in multidimensional cubes or tabular semantic models. - -- Do you need to integrate data from several sources, beyond your OLTP data store? If so, consider options that easily integrate multiple data sources. - -## Capability matrix - -The following tables summarize the key differences in capabilities. - -### General capabilities - -| | Azure Analysis Services | SQL Server Analysis Services | SQL Server with Columnstore Indexes | Azure SQL Database with Columnstore Indexes | -| --- | --- | --- | --- | --- | -| Is managed service | Yes | No | No | Yes | -| Supports multidimensional cubes | No | Yes | No | No | -| Supports tabular semantic models | Yes | Yes | No | No | -| Easily integrate multiple data sources | Yes | Yes | No 1 | No 1 | -| Supports real-time analytics | No | No | Yes | Yes | -| Requires process to copy data from source(s) | Yes | Yes | No | No | -| Azure AD integration | Yes | No | No 2 | Yes | - -[1] Although SQL Server and Azure SQL Database cannot be used to query from and integrate multiple external data sources, you can still build a pipeline that does this for you using [SSIS](/sql/integration-services/sql-server-integration-services) or [Azure Data Factory](/azure/data-factory/). SQL Server hosted in an Azure VM has additional options, such as linked servers and [PolyBase](/sql/relational-databases/polybase/polybase-guide). For more information, see [Pipeline orchestration, control flow, and data movement](../technology-choices/pipeline-orchestration-data-movement.md). - -[2] Connecting to SQL Server running on an Azure Virtual Machine is not supported using an Azure AD account. Use a domain Active Directory account instead. - -### Scalability Capabilities - -| | Azure Analysis Services | SQL Server Analysis Services | SQL Server with Columnstore Indexes | Azure SQL Database with Columnstore Indexes | -| --- | --- | --- | --- | --- | -| Redundant regional servers for high availability | Yes | No | Yes | Yes | -| Supports query scale out | Yes | No | Yes | No | -| Dynamic scalability (scale up) | Yes | No | Yes | No | - diff --git a/docs/data-guide/technology-choices/oltp-data-stores.md b/docs/data-guide/technology-choices/oltp-data-stores.md deleted file mode 100644 index 24213c8fea2..00000000000 --- a/docs/data-guide/technology-choices/oltp-data-stores.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: Choosing an OLTP data store -description: -author: zoinerTejada -ms:date: 02/12/2018 ---- - -# Choosing an OLTP data store in Azure - -Online transaction processing (OLTP) is the management of transactional data and transaction processing. This topic compares options for OLTP solutions in Azure. - -> [!NOTE] -> For more information about when to use an OLTP data store, see [Online transaction processing](../scenarios/online-analytical-processing.md). - -## What are your options when choosing an OLTP data store? - -In Azure, all of the following data stores will meet the core requirements for OLTP and the management of transaction data: - -- [Azure SQL Database](/azure/sql-database/) -- [SQL Server in an Azure virtual machine](/azure/virtual-machines/windows/sql/virtual-machines-windows-sql-server-iaas-overview?toc=%2Fazure%2Fvirtual-machines%2Fwindows%2Ftoc.json) -- [Azure Database for MySQL](/azure/mysql/) -- [Azure Database for PostgreSQL](/azure/postgresql/) - -## Key selection criteria - -To narrow the choices, start by answering these questions: - -- Do you want a managed service rather than managing your own servers? - -- Does your solution have specific dependencies for Microsoft SQL Server, MySQL or PostgreSQL compatibility? Your application may limit the data stores you can choose based on the drivers it supports for communicating with the data store, or the assumptions it makes about which database is used. - -- Are your write throughput requirements particularly high? If yes, choose an option that provides in-memory tables. - -- Is your solution multi-tenant? If so, consider options that support capacity pools, where multiple database instances draw from an elastic pool of resources, instead of fixed resources per database. This can help you better distribute capacity across all database instances, and can make your solution more cost effective. - -- Does your data need to be readable with low latency in multiple regions? If yes, choose an option that supports readable secondary replicas. - -- Does your database need to be highly available across geo-graphic regions? If yes, choose an option that supports geographic replication. Also consider the options that support automatic failover from the primary replica to a secondary replica. - -- Does your database have specific security needs? If yes, examine the options that provide capabilities like row level security, data masking, and transparent data encryption. - -## Capability matrix - -The following tables summarize the key differences in capabilities. - -### General capabilities -| | Azure SQL Database | SQL Server in an Azure virtual machine | Azure Database for MySQL | Azure Database for PostgreSQL | -| --- | --- | --- | --- | --- | --- | -| Is Managed Service | Yes | No | Yes | Yes | -| Runs on Platform | N/A | Windows, Linux, Docker | N/A | N/A | -| Programmability 1 | T-SQL, .NET, R | T-SQL, .NET, R, Python | T-SQL, .NET, R, Python | SQL | SQL | - -[1] Not including client driver support, which allows many programming languages to connect to and use the OLTP data store. - -### Scalability capabilities -| | Azure SQL Database | SQL Server in an Azure virtual machine| Azure Database for MySQL | Azure Database for PostgreSQL| -| --- | --- | --- | --- | --- | --- | -| Maximum database instance size | [4 TB](/azure/sql-database/sql-database-resource-limits) | 256 TB | [1 TB](/azure/mysql/concepts-limits) | [1 TB](/azure/postgresql/concepts-limits) | -| Supports capacity pools | Yes | Yes | No | No | -| Supports clusters scale out | No | Yes | No | No | -| Dynamic scalability (scale up) | Yes | No | Yes | Yes | - -### Analytic workload capabilities -| | Azure SQL Database | SQL Server in an Azure virtual machine| Azure Database for MySQL | Azure Database for PostgreSQL| -| --- | --- | --- | --- | --- | --- | -| Temporal tables | Yes | Yes | No | No | -| In-memory (memory-optimized) tables | Yes | Yes | No | No | -| Columnstore support | Yes | Yes | No | No | -| Adaptive query processing | Yes | Yes | No | No | - -### Availability capabilities -| | Azure SQL Database | SQL Server in an Azure virtual machine| Azure Database for MySQL | Azure Database for PostgreSQL| -| --- | --- | --- | --- | --- | --- | -| Readable secondaries | Yes | Yes | No | No | -| Geographic replication | Yes | Yes | No | No | -| Automatic failover to secondary | Yes | No | No | No| -| Point-in-time restore | Yes | Yes | Yes | Yes | - -### Security capabilities -| | Azure SQL Database | SQL Server in an Azure virtual machine| Azure Database for MySQL | Azure Database for PostgreSQL| -| --- | --- | --- | --- | --- | --- | -| Row level security | Yes | Yes | Yes | Yes | -| Data masking | Yes | Yes | No | No | -| Transparent data encryption | Yes | Yes | Yes | Yes | -| Restrict access to specific IP addresses | Yes | Yes | Yes | Yes | -| Restrict access to allow VNET access only | Yes | Yes | No | No | -| Azure Active Directory authentication | Yes | Yes | No | No | -| Active Directory authentication | No | Yes | No | No | -| Multi-factor authentication | Yes | Yes | No | No | -| Supports [Always Encrypted](/sql/relational-databases/security/encryption/always-encrypted-database-engine) | Yes | Yes | Yes | No | No | -| Private IP | No | Yes | Yes | No | No | - diff --git a/docs/data-guide/technology-choices/stream-processing.md b/docs/data-guide/technology-choices/stream-processing.md index 42818a9524f..82c4cd4f56d 100644 --- a/docs/data-guide/technology-choices/stream-processing.md +++ b/docs/data-guide/technology-choices/stream-processing.md @@ -10,7 +10,7 @@ ms:date: 02/12/2018 This article compares technology choices for real-time stream processing in Azure. -Real-time stream processing consumes messages from either queue or file-based storage, process the messages, and forward the result to another message queue, file store, or database. Processing may include querying, filtering, and aggregating messages. Stream processing engines must be able to consume an endless streams of data and produce results with minimal latency. For more information, see [Real time processing](../scenarios/real-time-processing.md). +Real-time stream processing consumes messages from either queue or file-based storage, process the messages, and forward the result to another message queue, file store, or database. Processing may include querying, filtering, and aggregating messages. Stream processing engines must be able to consume an endless streams of data and produce results with minimal latency. For more information, see [Real time processing](../big-data/real-time-processing.md). ## What are your options when choosing a technology for real-time processing? In Azure, all of the following data stores will meet the core requirements supporting real-time processing: @@ -62,4 +62,4 @@ See also: - [Choosing a real-time message ingestion technology](./real-time-ingestion.md) - [Comparing Apache Storm and Azure Stream Analytics](/azure/stream-analytics/stream-analytics-comparison-storm) -- [Real time processing](../scenarios/real-time-processing.md) +- [Real time processing](../big-data/real-time-processing.md) diff --git a/docs/data-guide/toc.yml b/docs/data-guide/toc.yml index 9b3e0d5a109..3887c018d40 100644 --- a/docs/data-guide/toc.yml +++ b/docs/data-guide/toc.yml @@ -3,88 +3,70 @@ - name: Data Architecture Guide href: index.md items: - - name: Traditional RDBMS + - name: Traditional RDBMS workloads items: - - name: Concepts - items: - - name: Relational data - href: concepts/relational-data.md - - name: Transactional data - href: concepts/transactional-data.md - - name: Semantic modeling - href: concepts/semantic-modeling.md - - name: Scenarios - items: - - name: Online transaction processing (OLTP) - href: scenarios/online-transaction-processing.md - - name: Online analytical processing (OLAP) - href: scenarios/online-analytical-processing.md - - name: Data warehousing - href: scenarios/data-warehousing.md - - name: Extract, transform, and load (ETL) - href: scenarios/etl.md - - name: Technology choices - items: - - name: Data warehouses - href: technology-choices/data-warehouses.md - - name: Online analytical processing (OLAP) - href: technology-choices/olap-data-stores.md - - name: Online transaction processing (OLTP) - href: technology-choices/oltp-data-stores.md - - name: Big Data and NoSQL + - name: Overview + href: relational-data/index.md + - name: Online transaction processing (OLTP) + href: relational-data/online-transaction-processing.md + - name: Data warehousing + href: relational-data/data-warehousing.md + - name: Online analytical processing (OLAP) + href: relational-data/online-analytical-processing.md + - name: Extract, transform, and load (ETL) + href: relational-data/etl.md + - name: Big data architectures items: - - name: Concepts - items: - - name: Non-relational data stores - href: concepts/non-relational-data.md - - name: Working with CSV and JSON files - href: concepts/csv-and-json.md - - name: Data lakes - href: concepts/data-lake.md - - name: Big data architectures - href: concepts/big-data.md - - name: Advanced analytics - href: concepts/advanced-analytics.md - - name: Machine learning at scale - href: concepts/machine-learning-at-scale.md - - name: Scenarios - items: + - name: Overview + href: big-data/index.md - name: Batch processing - href: scenarios/batch-processing.md + href: big-data/batch-processing.md - name: Real time processing - href: scenarios/real-time-processing.md - - name: Free-form text search - href: scenarios/search.md - - name: Interactive data exploration - href: scenarios/interactive-data-exploration.md - - name: Natural language processing - href: scenarios/natural-language-processing.md - - name: Time series solutions - href: scenarios/time-series.md - - name: Technology choices - items: - - name: Analytical data stores - href: technology-choices/analytical-data-stores.md - - name: Analytics and reporting - href: technology-choices/analysis-visualizations-reporting.md - - name: Batch processing - href: technology-choices/batch-processing.md - - name: Cognitive services - href: technology-choices/cognitive-services.md - - name: Data storage - href: technology-choices/data-storage.md - - name: Machine learning - href: technology-choices/data-science-and-machine-learning.md - - name: Natural language processing - href: technology-choices/natural-language-processing.md - - name: Pipeline orchestration - href: technology-choices/pipeline-orchestration-data-movement.md - - name: Real-time message ingestion - href: technology-choices/real-time-ingestion.md - - name: Search data stores - href: technology-choices/search-options.md - - name: Stream processing - href: technology-choices/stream-processing.md + href: big-data/real-time-processing.md + - name: Machine learning at scale + href: big-data/machine-learning-at-scale.md + - name: Non-relational data stores + href: big-data/non-relational-data.md + - name: Scenarios + items: + - name: Advanced analytics + href: scenarios/advanced-analytics.md + - name: Data lakes + href: scenarios/data-lake.md + - name: Free-form text search + href: scenarios/search.md + - name: Interactive data exploration + href: scenarios/interactive-data-exploration.md + - name: Natural language processing + href: scenarios/natural-language-processing.md + - name: Time series solutions + href: scenarios/time-series.md + - name: Working with CSV and JSON files + href: scenarios/csv-and-json.md + - name: Technology choices + items: + - name: Analytical data stores + href: technology-choices/analytical-data-stores.md + - name: Analytics and reporting + href: technology-choices/analysis-visualizations-reporting.md + - name: Batch processing + href: technology-choices/batch-processing.md + - name: Cognitive services + href: technology-choices/cognitive-services.md + - name: Data storage + href: technology-choices/data-storage.md + - name: Machine learning + href: technology-choices/data-science-and-machine-learning.md + - name: Natural language processing + href: technology-choices/natural-language-processing.md + - name: Pipeline orchestration + href: technology-choices/pipeline-orchestration-data-movement.md + - name: Real-time message ingestion + href: technology-choices/real-time-ingestion.md + - name: Search data stores + href: technology-choices/search-options.md + - name: Stream processing + href: technology-choices/stream-processing.md - name: Cross-cutting concerns items: - name: Data transfer