<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Orrin Edenfield</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/orrinedenfield/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/orrinedenfield/feed.xml</link>
    <description>Our mission: to explore new data (big and small), to seek out new knowledge and new insights, to boldly go where no data nerd has gone before.</description>
    <lastBuildDate>Tue, 16 Apr 2019 05:24:17 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>SQL Server on Linux on Docker quick and easy</title>
      <link>https://docs.microsoft.com/archive/blogs/orrinedenfield/sql-server-on-linux-on-docker-quick-and-easy</link>
      <pubDate>Mon, 30 Oct 2017 12:35:57 GMT</pubDate>
      <dc:creator><![CDATA[Orrin E]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/orrinedenfield/?p=445</guid>
      <description><![CDATA[Often in conversations with healthcare customers the topic of architecture evolutions or roadmaps...]]></description>
      <content:encoded><![CDATA[<p>Often in conversations with healthcare customers the topic of architecture evolutions or roadmaps come up and in every conversation, is mention of a hybrid strategy – one where use of both on premise and cloud technologies need to be factored into the solution (sometimes both near-term &amp; long-term solutions).  In addition to those situations sometimes you just want to quickly stand up SQL Server (for use with a demo of <a href="https://docs.microsoft.com/en-us/azure/machine-learning/preview/quickstart-installation">Azure ML Workbench (preview)</a>, this happened to me recently).  Below is the script I use to get SQL Server up and running quickly using Docker. I usually use a combination of <a href="https://code.visualstudio.com/">vscode</a>, PowerShell &amp; the appropriate extensions (<a href="https://github.com/PowerShell/PowerShell/blob/master/docs/learning-powershell/using-vscode.md">PowerShell Extension</a> &amp; <a href="https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-develop-use-vscode">mssql</a>) to make this easy.
</p><h2>Prerequisites:
</h2><ol><li>Docker for Windows (this should work the same on Linux as well with some slight modifications of source paths &amp; maybe syntax)
</li></ol><p>Optional:
</p><ol><li>Visual Studio Code
</li><li>SQL Server Management Studio (may not be needed if you use mssql extension for vscode).
</li></ol><h2>Install
</h2><ol><li>Install Docker for Windows. This is a simple wizard install. Make sure you have enough memory to run SQL Server in Docker – see this: <a href="https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker">https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker</a>
		</li></ol><p>Optionally install the other software. Technically you could run the TSQL code from <strong>sqlcmd</strong> inside the Docker container but in my setup, I don't usually do that because I want to externalize any data &amp; code from the running container that way I can easily upgrade to new releases of SQL Server as they come and do things like check in my code to a code repository.  The rest of the steps can be done when you want to run an instance and serve data but making sure Docker is setup and operational is a good thing to have ready to go.
</p><h2>Start Docker and Run the container
</h2><p>I usually keep Docker turned off and start it up when I need to run a container.
</p><ol><li>Launch Docker and wait about 30 seconds for it to start up.
</li><li>Launch vscode and open the PowerShell script with my saved commands.
</li><li><div>Run the commands per the script (except the last one).  Note that the first time you do the pull it may take a minute or two to download the container image. When you run this the second time docker will check to see if you have the proper image or if a new one needs to be downloaded, if not then docker will save you time and not download the image again.
</div><p style="margin-left: 36pt"><br /><span style="color:green"><span style="font-family:Consolas;font-size:10pt"># Confirm that Docker is running<br /><span style="color:black">docker ps</span></span>
				</span></p><p style="background: white;margin-left: 36pt"><span style="color:green;font-family:Consolas;font-size:10pt"># Start container<span style="color:black">
					</span></span></p><p style="background: white;margin-left: 36pt"><span style="color:black;font-family:Consolas;font-size:10pt">docker pull microsoft/mssql-server-linux:<span style="color:#09885a">2017<span style="color:black">-GA
</span></span></span></p><p style="background: white;margin-left: 36pt"><span style="color:black;font-family:Consolas;font-size:10pt">docker run -e <span style="color:#a31515">"ACCEPT_EULA=Y"<span style="color:black"> -e <span style="color:#a31515">"SA_PASSWORD=***************"<span style="color:black"> -p <span style="color:#09885a">1433<span style="color:black">:<span style="color:#09885a">1433<span style="color:black"> --name sql1 -d microsoft/mssql-server-linux:<span style="color:#09885a">2017<span style="color:black">-GA
</span></span></span></span></span></span></span></span></span></span></span></p><p style="background: white;margin-left: 36pt">
 </p><p style="background: white;margin-left: 36pt"><span style="color:green;font-family:Consolas;font-size:10pt"># Confirm that the container is running. SQL Server should be up and running now and ready to host data <span style="color:black">
					</span></span></p><p style="background: white;margin-left: 36pt"><span style="color:black;font-family:Consolas;font-size:10pt">docker ps
</span></p><p style="background: white;margin-left: 36pt">
 </p><p style="background: white;margin-left: 36pt"><span style="color:green;font-family:Consolas;font-size:10pt"># Copy sample DB MDF file into container, make sure you change the attach database files to location:<span style="color:black">
					</span></span></p><p style="background: white;margin-left: 36pt"><span style="color:black;font-family:Consolas;font-size:10pt">docker cp C:\Users\username\SampleData\AdventureWorks\AdventureWorksLT2012_Data.mdf sql1:/<span style="color:blue">var<span style="color:black">/opt/mssql/<span style="color:blue">data<span style="color:black">/AdventureWorksLT2012_Data.mdf
</span></span></span></span></span></p></li></ol><p>
 </p><ol><li><div>Open the .sql file containing the code needed to attach the database and run the command:
</div><p style="margin-left: 36pt"><span style="color:green;font-family:Consolas;font-size:9pt">-- Attach the MDF file copied into the container<span style="color:black">
					</span></span></p><p style="margin-left: 36pt"><span style="color:blue;font-family:Consolas;font-size:9pt">USE<span style="color:black"> [master]
</span></span></p><p style="margin-left: 36pt"><span style="color:blue;font-family:Consolas;font-size:9pt">GO<span style="color:black">
					</span></span></p><p style="margin-left: 36pt"><span style="color:blue;font-family:Consolas;font-size:9pt">CREATE<span style="color:black">
						<span style="color:blue">DATABASE<span style="color:black"> [AdventureWorksLT2012] <span style="color:blue">ON<span style="color:black">
									</span></span></span></span></span></span></p><p style="margin-left: 36pt"><span style="color:gray;font-family:Consolas;font-size:9pt">(<span style="color:blue">FILENAME<span style="color:black">
							<span style="color:gray">=<span style="color:black">
									<span style="color:red">N'/var/opt/mssql/data/AdventureWorksLT2012_Data.mdf'<span style="color:gray">)<span style="color:black">
											</span></span></span></span></span></span></span></span></p><p style="margin-left: 36pt"><span style="color:blue;font-family:Consolas;font-size:9pt">FOR<span style="color:black">
						<span style="color:blue">ATTACH;
</span></span></span></p><p style="margin-left: 36pt"><span style="color:blue;font-family:Consolas;font-size:9pt">GO
</span></p><p>
 </p></li><li>Open console in vscode by pressing <strong>Ctrl + Shift + P</strong>
		</li><li><div>Type "connect" and you should see the option <strong>MS SQL: Connect</strong>, select it and press Enter.
</div><ol><li>Follow steps to create a connection profile for this locally running SQL Server, once saved you'll just select the profile
</li></ol></li><li>Select the code in the script and execute it by pressing <strong>Ctrl + Shift + E</strong>
		</li><li>You might see response saying that the database has been upgraded in version (I'm seeing upgrade from version 864 to 863 for my MDF file) but as long as the MDF file is in working order the attach should work as planned.
</li><li>To confirm the attach run <span style="color:blue"><span style="font-family:Consolas;font-size:9pt">SELECT<span style="color:black">
						<span style="color:blue">name<span style="color:gray">,<span style="color:black"> database_id<span style="color:gray">,<span style="color:black"> create_date <span style="color:blue">FROM<span style="color:black">
													<span style="color:lime">sys<span style="color:gray">.<span style="color:lime">databases<span style="color:gray">; </span></span></span></span></span></span></span></span></span></span></span></span></span>and you should see your database listed there. From that point you can </span>run USE command and query as needed.
</li><li><div>When finished close all client connections to the server and then go back to cleanup your docker container by running the last line in the script:
</div><p style="background: white;margin-left: 36pt"><span style="color:green;font-family:Consolas;font-size:10pt"># When finished with SQL Server, use this to stop the container<span style="color:black">
					</span></span></p><p style="background: white;margin-left: 36pt"><span style="color:black;font-family:Consolas;font-size:10pt">docker stop sql1
</span></p></li></ol><p>
 </p><p>So, there you have it, SQL Server on Linux on Docker on Windows in 10 easy steps. These very simple scripts are saved in <a href="https://github.com/oedenfield/SQL-Server-on-Linux-on-Docker-on-Windows">this GitHub repo</a> but it's probably easier to just copy and paste or memorize.  
</p><p>
 </p>]]></content:encoded>
    </item>
    <item>
      <title>Hadoop in the Cloud or: the evolution of Hadoop into an API, Storage &amp; Processing at Scale</title>
      <link>https://docs.microsoft.com/archive/blogs/orrinedenfield/hadoop-in-the-cloud-or-the-evolution-of-hadoop-into-an-api-storage-processing-at-scale</link>
      <pubDate>Wed, 07 Jun 2017 08:39:26 GMT</pubDate>
      <dc:creator><![CDATA[Orrin E]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/orrinedenfield/?p=435</guid>
      <description><![CDATA[Note: In an effort to share more often and react to feedback I might receive, I'm going to break...]]></description>
      <content:encoded><![CDATA[<p><strong>Note:</strong> In an effort to share more often and react to feedback I might receive, I'm going to break this up into a series of posts rather than writing a book.
</p><p style="margin-left: 36pt">Part 1: <a href="https://blogs.msdn.microsoft.com/orrinedenfield/2017/05/hadoop-in-the-cloud-or-the-evolution-of-hadoop-into-an-api-an-introduction/">An Introduction</a><br />Part 2: <a href="https://blogs.msdn.microsoft.com/orrinedenfield/2017/05/hadoop-in-the-cloud-or-the-evolution-of-hadoop-into-an-api-capabilities-and-components/">Capabilities and Components</a><br />Part 3: <a href="https://blogs.msdn.microsoft.com/orrinedenfield/2017/06/hadoop-in-the-cloud-or-the-evolution-of-hadoop-into-an-api-storage-processing-at-scale/">Storage &amp; Processing at Scale</a> (you are here)
</p><p>Hadoop provides many benefits when it comes to storing substantial amounts of data as well as providing a framework for efficient mass-scale processing of data stored in the storage layer of a Hadoop cluster.  Given the popularity of Hadoop and the foundation of innovation in the Hadoop ecosystem, we have many tools we can use to meet many needs, using tools besides Hadoop but often using tools <em>beyond</em> Hadoop.
</p><p>Much of the information below is not new and I'll only go into it to ensure all readers understand the value components like HDFS &amp; YARN can bring (remember capabilities from <a href="https://blogs.msdn.microsoft.com/orrinedenfield/2017/05/hadoop-in-the-cloud-or-the-evolution-of-hadoop-into-an-api-capabilities-and-components/">the last post in this series</a>?), which is critical in the conversation about running them in the cloud. Why run ANY technology system ANYWHERE if there is no clear value coming from it? I'm going to assume some knowledge of Hadoop is known but if anything is not clear, please ask questions in the comments and I will refine.
</p><h1>HDFS
</h1><p>The Hadoop Distributed File System (HDFS) provides a storage environment that allows for any data type of virtually any size, type or characteristic in a general-purpose file service. There are some limitations of the features, for example small files aren't typically stored efficiently in an HDFS as well as the read-only nature of the file system that can complicate some scenarios but many times these are solved for in the larger architecture of a solution or implementation (out of scope in this case, you'll understand why in the next post).
</p><p>I would say that HDFS is mostly what enables the traditional ETL workload to become an ELT workload. ETL stands for Extract, Transform and Load which was a widespread practice in data warehousing and analytics in previous decades. It involved reading data from sources, transforming it (either in an expensive data store like a data warehouse appliance or at least an SMP RDBMS that used expensive storage) and then writing it out to a data store that was consumable for analytics purposes by a business unit that needed answers yesterday. ELT enabled a change in workflow that allows the same process to unlock value for the business, answer questions but do so in a more flexible and agile fashion. For example, in the ETL method one always has to know the structure of your data before you can write it into or transform it in the expensive RDBMS while ELT at least allows you to get datasets into a store and enables exploration of data beyond samples.
</p><p>HDFS like many enterprise technologies has been built with the expectation that hardware <em>will</em> fail. The solution in HDFS was to make multiple copies of the data (usually 3 by default) and this usually allows inexpensive disks to be used to store data rather than typical expensive disks which occupy Enterprise-class storage systems. Multiple copies of the data are also key in giving the option for any processing that needs the data to have the option of fault tolerance, you can't continue processing data if there is only 1 copy of the data and a cluster node storing that data goes offline. 
</p><p>Another key capability of HDFS is that data is usually split into multiple chunks of data to allow reading of that data (and subsequent transformation or processing) on multiple nodes. Since we're already storing data on multiple computers why not also process data on multiple computers, so we can breakup large processing jobs into smaller jobs running on as many nodes in the cluster as possible. When taking this approach overall processing time goes down. That brings us to negotiating resources across many computer nodes in a cluster.
</p><h1>YARN
</h1><p>When operating large-scale processing across many computers it can be a challenge to ensure the processing running on that cluster is operating efficiently. Yet Another Resource Negotiator (or YARN for short) was created to give Hadoop operators the capability of maximizing the resources across a cluster of computer nodes that can both store and process data. YARN allows different workloads to run across the same cluster of storage and compute resources and each have fine-grained control over the resources available for processing. For example, if a Hadoop cluster is used by the data warehousing team for reading data from source line of business data stores and writing into an enterprise data warehouse the administrators of the cluster can give them 70% of the overall compute resources (CPU cores &amp; memory) while also ensuring the application R&amp;D department has 30% of the compute resources for their needs as well. When viewing at this level of control it is almost a cloud-like capability when it comes to elasticity (although when deployed on premise a Hadoop cluster does have a top-end compute and storage capacity, more on cloud soon).
</p><p>Both YARN and HDFS provide capabilities that otherwise are hard to come by and are relatively straightforward and easy to understand. The architecture of the services are simple and often involve Master &amp; Worker roles that ensure the cluster is operational and can provide necessary capabilities like fault tolerance, scalability, resiliency and other Enterprise requirements.
</p><p>Next time I'll will discuss cloud concepts like virtualization, IaaS and PaaS and why organizations find them valuable.</p>]]></content:encoded>
    </item>
    <item>
      <title>Hadoop in the Cloud or: the evolution of Hadoop into an API, Capabilities and Components</title>
      <link>https://docs.microsoft.com/archive/blogs/orrinedenfield/hadoop-in-the-cloud-or-the-evolution-of-hadoop-into-an-api-capabilities-and-components</link>
      <pubDate>Tue, 30 May 2017 12:51:58 GMT</pubDate>
      <dc:creator><![CDATA[Orrin E]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/orrinedenfield/?p=426</guid>
      <description><![CDATA[Note: In an effort to share more often and react to feedback I might receive, I'm going to break...]]></description>
      <content:encoded><![CDATA[<p><strong>Note:</strong> In an effort to share more often and react to feedback I might receive, I'm going to break this up into a series of posts rather than writing a book.
</p><p style="margin-left: 36pt">Part 1: <a href="https://blogs.msdn.microsoft.com/orrinedenfield/2017/05/hadoop-in-the-cloud-or-the-evolution-of-hadoop-into-an-api-an-introduction/">An Introduction</a><br />Part 2: <a href="https://blogs.msdn.microsoft.com/orrinedenfield/2017/05/hadoop-in-the-cloud-or-the-evolution-of-hadoop-into-an-api-capabilities-and-components/">Capabilities and Components</a> (you are here)<br />Part 3: <a href="https://blogs.msdn.microsoft.com/orrinedenfield/2017/06/hadoop-in-the-cloud-or-the-evolution-of-hadoop-into-an-api-storage-processing-at-scale/">Storage &amp; Processing at Scale</a>
	</p><h1>Capabilities
</h1><p>Whenever I talk to a customer or look to solve a challenge I always think it's best to start with a discussion around capabilities. Capabilities speak to the actual needs and help us not get caught up in a technology discussion or trying to solve the challenge before we fully understand the challenge. When we need to transform large amounts of data or process through large amounts of data in preparation for business centered objectives knowing the capability needs is essential. This is not intended to be a complete or exhaustive capability list.
</p><p>Transforming, querying or processing large amounts of data means <em>storing</em> large amounts of data (also need to know other characteristics like where it's coming from, the nature of data movement, security requirements, etc. but we'll start with storing). Historically this was done in either a file system or some kind of database or both. Storing data is only valuable if you can also retrieve the data needed when you needed it so relational databases were created to make this easier. As data volumes grew things like columnar store databases and massively parallel processing databases were created that eased some growing pains of changing data characteristics. All along capabilities grew and changed and new data stores arose included distributed databases and distributed file systems. From a capability perspective, we still need to store (or write) data to a store and we need to retrieve (or query or read) data from a store. As complexity grows &amp; technologies change these capabilities are still constant.
</p><p>Another key capability is the retrieval of data from a data store, with Hadoop that means MapReduce or <a href="https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html">YARN</a>… or Hive, or Pig, or Drill, or Spark. This is a growing list, but Spark is a general execution engine that has been successful from an industry adoption point of view, it's a de-facto standard. YARN is the backend service that provides resources for processing and in most cases services like Spark will create a YARN application to get the work done in a distributed fashion. I like to think of YARN as an interface for which applications can be executed on a cluster of resources.
</p><p>Other capabilities most organizations need include high availability and fault tolerance. I won't deep dive into them, but they are equally important as massive scalability. This is not an exhaustive capability list.
</p><h1>Components
</h1><p>After understanding the capability needs to solve a challenge then we can start looking at ways we can meet those capabilities via services or tools (only look for a hammer if you need the capability of using a nail, it might not help much if you need to use glue). For example when there is a need for a capability of storing petabytes of data one might consider the most simplistic route to build a computer/server that can store petabytes of data, maybe even something like the Titan in use at Oak Ridge National Laboratory which can store 40 PB of data (which is good) but costs <a href="https://www.olcf.ornl.gov/titan/">$97 million and takes up over 4,300 square feet of floor space</a>. Most organizations don't have that kind of budget or want to give up that much floor space.  Since more and more organizations are seeing a need for storing volumes of data closer to that size but don't have that kind of budget (remember there are also people costs in maintaining an infrastructure like that) or expertise in system of that scale other options need to be explored. There are other distributed file systems and distributed data stores that might make sense. Over the past decade <a href="https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html">Apache Hadoop HDFS</a> has been the star of the distributed file system game, although others (Lustre, GlusterFS,etc.) are popular in some circles. HDFS made it possible to buy inexpensive server hardware and achieve capabilities like massive scale (many petabytes), high availability &amp; fault tolerance and other capabilities all through the application layer (re-read this sentence and mentally highlight inexpensive hardware).
</p><p>In the next post, I'll go more in-depth on HDFS and YARN and how is meets the capability needs and how those can be implemented in the cloud.  As always – please share any thoughts or feedback below.</p>]]></content:encoded>
    </item>
    <item>
      <title>Hadoop in the Cloud or: the evolution of Hadoop into an API, an Introduction</title>
      <link>https://docs.microsoft.com/archive/blogs/orrinedenfield/hadoop-in-the-cloud-or-the-evolution-of-hadoop-into-an-api-an-introduction</link>
      <pubDate>Tue, 23 May 2017 16:01:27 GMT</pubDate>
      <dc:creator><![CDATA[Orrin E]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/orrinedenfield/?p=425</guid>
      <description><![CDATA[Since I started working at Microsoft in 2016, I've been wanting to share more about this topic and...]]></description>
      <content:encoded><![CDATA[<p>Since I started working at Microsoft in 2016, I've been wanting to share more about this topic and even now I intend to turn this into a presentation that I can give in public forums. I'll happily take feedback and welcome critique as I refine the message here and help make it applicable to as many as possible. Please comment and tell me your thoughts. 
</p><p><strong>Note:</strong> In an effort to share more often and react to feedback I might receive, I'm going to break this up into a series of posts rather than writing a book.
</p><p style="margin-left: 36pt">Part 1: <a href="https://blogs.msdn.microsoft.com/orrinedenfield/2017/05/hadoop-in-the-cloud-or-the-evolution-of-hadoop-into-an-api-an-introduction/">An Introduction</a> (you are here)<br />Part 2: <a href="https://blogs.msdn.microsoft.com/orrinedenfield/2017/05/hadoop-in-the-cloud-or-the-evolution-of-hadoop-into-an-api-capabilities-and-components/">Capabilities and Components</a><br />Part 3: <a href="https://blogs.msdn.microsoft.com/orrinedenfield/2017/06/hadoop-in-the-cloud-or-the-evolution-of-hadoop-into-an-api-storage-processing-at-scale/">Storage &amp; Processing at Scale</a>
	</p><h1>The origin story
</h1><p>Years ago, I worked with a company that was implementing Hadoop as a means of speeding up data transformation processes on petabytes of information received from client organizations. We had used traditional ETL for years before massive datasets &amp; increasing business demands meant we needed to look at other options. Through many meetings, I introduced Hadoop to our technical data &amp; infrastructure teams and we started down the path of setting up some initial POC clusters. Eventually we had environments &amp; architectures designed that solved development &amp; test, production as well as NoSQL-based solutions for indexing &amp; searching decades of communication data as well as transactional data for major retail customers in US, Canada, Latin America, Europe, Asia<strong>
		</strong>and Australia.<strong>
		</strong></p><h1>Hadoop &amp; why parallelism is great
</h1><p>At the core of our solution was a traditional Hadoop cluster utilizing the Hadoop Distributed File System (HDFS) for data storage paired with MapReduce-based processing in our case this was Apache Hive queries. This worked great as we took some ETL workloads that took 160+ hours down to less than a day. It also gave us improved data management capabilities as appending hundreds of GB of data to existing tables now was as easy as uploading new files to existing HDFS directories thanks to the schema-on-read nature of Hadoop &amp; Hive.
</p><p>Since our on-premise and co-lo data centers were the only data centers we used we went from POC to Production with physical servers that lived in a rack in our datacenter and we built backup &amp; disaster recovery strategies around dual-pipeline processes &amp; cross-cluster data replication from Dev/Test &amp; Prod clusters to a DR cluster in a DR location in another state. We had a short-lived experiment that used virtual machine nodes but were quickly convinced by a Hadoop vendor that physical was best and in those days, it was hard to argue that VMs would provide a better solution. 
</p><p>HDFS &amp; Hive-on-MapReduce allowed us to take large datasets and introduce parallelism in our processing very easily. We didn't <em>have</em> to think about partition keys or segmenting data within our cluster, we copied a 50 GB data file to the cluster and HDFS split the file into blocks for us and we could trust that when we ran our Hive query against that data there would likely be <em>a</em> degree of parallelism (though sometimes this was very small until we <em>did </em>think about partition keys and data segmentation) and we'd likely see a performance gain. At the end of the day we implemented Hadoop, saw impressive performance gains and everyone was a hero to the business.
</p><h1>And then the cloud happened…
</h1><p>After I helped the company establish solutions to priority challenges and I felt that team was affixed on a solid path I moved on to other challenges. At the same time, the rest of the world had been, and was awakening to, this thing called <a href="https://azure.microsoft.com">the cloud</a>.  Architecting a Hadoop-based solution in the cloud should look different than one on premise and the purpose of this series is to dive into those reasons, explore what they mean and ultimately prove out why I think Hadoop will evolve into only an API (if it hasn't already).
</p><p>
 </p><p>
 </p>]]></content:encoded>
    </item>
    <item>
      <title>Getting started with Power BI On Premise Gateway &amp; MariaDB</title>
      <link>https://docs.microsoft.com/archive/blogs/orrinedenfield/getting-started-with-power-bi-on-premise-gateway-mariadb</link>
      <pubDate>Mon, 17 Oct 2016 12:42:02 GMT</pubDate>
      <dc:creator><![CDATA[Orrin E]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/orrinedenfield/?p=125</guid>
      <description><![CDATA[Power BI Desktop is a jack-of-all-trades when it comes to data visualization, self-service BI and...]]></description>
      <content:encoded><![CDATA[<p><a href="https://powerbi.com">Power BI Desktop</a> is a jack-of-all-trades when it comes to data visualization, self-service BI and ad-hoc analytics.  With interactive and rich visuals in addition to a robust query tool it has become my go-to tool for querying and visualizing data no matter if the data is living in structured RDBMS (<a href="https://powerbi.microsoft.com/en-us/blog/building-power-bi-reports-on-top-of-amazon-redshift-data/">Amazon Redshift</a>, <a href="https://powerbi.microsoft.com/en-us/integrations/azure-sql-data-warehouse/">Azure SQL Data Warehouse</a>, <a href="https://powerbi.microsoft.com/en-us/integrations/azure-sql-database/">Azure SQL Database</a>, <a href="https://powerbi.microsoft.com/en-us/integrations/ibmdb2/">IBM DB2</a>, <a href="https://powerbi.microsoft.com/en-us/integrations/mysql/">MySQL</a>, <a href="https://powerbi.microsoft.com/en-us/integrations/oracle/">Oracle</a>, <a href="https://powerbi.microsoft.com/en-us/integrations/postgresql/">PostgreSQL</a>, <a href="https://powerbi.microsoft.com/en-us/integrations/sql-server/">SQL Server</a>, <a href="https://powerbi.microsoft.com/en-us/integrations/sybase/">Sybase</a>, <a href="https://powerbi.microsoft.com/en-us/integrations/teradata/">Teradata</a>) or if it's a sample dataset from a public source (often CSV or JSON or some other text format) or a distributed storage tool like <a href="https://powerbi.microsoft.com/en-us/integrations/hdfs/">Hadoop HDFS</a>, JSON-based <a href="https://azure.microsoft.com/en-us/documentation/articles/documentdb-powerbi-visualize/">DocumentDB</a>, <a href="https://powerbi.microsoft.com/en-us/blog/announcing-the-power-bi-desktop-november-update/">Azure Data Lake Store</a> or <a href="https://powerbi.microsoft.com/en-us/blog/power-bi-enables-connectivity-to-snowflake/">SnowFlake</a>.
</p><p>A great feature of <a href="https://powerbi.microsoft.com/en-us/pricing/">Power BI Pro</a> is the Gateway.  <a href="https://powerbi.microsoft.com/en-us/gateway/">Power BI Gateway</a> comes in 2 variations, <strong>Personal</strong> &amp; <strong>On Premise</strong>.  Personal is just that – used for testing on a developer computer and only runs when the user is logged in.  On Premise is used run under a service account on a server and has some extended capabilities for live or Direct querying of SQL Server/Analysis Service data sources.
</p><p>I work with healthcare customers and many times there is a need to plan a hybrid cloud strategy involving both on premise and Azure.  I recently worked with a customer to use Power BI for internal reporting and dashboards with both Azure-based and on premise-based data sources.
</p><p>Here are the steps used to stand up Power BI On Premise Data Gateway and create reports using an on premise MariaDB data source (<a href="https://mariadb.org/about/">MariaDB</a> is an open source database service that is "drop-in compatible" with MySQL).
</p><h2>Install the MySQL Connector/Net, ADO.NET Driver (to be completed on the gateway server)
</h2><p>Depending on your setup, this might already be available on your system.  You should just need the driver, not necessarily the MySQL for Visual Studio integration tool.  I was directed to download the driver from the MySQL site here: <a href="https://dev.mysql.com/downloads/connector/net/6.6.html">https://dev.mysql.com/downloads/connector/net/6.6.html</a>
	</p><h2>Setup the Power BI On Premise Data Gateway (to be completed on the gateway server)
</h2><ol><li>Login to <a href="https://www.PowerBI.com">https://www.PowerBI.com</a> with your work/Pro credentials.
</li><li><div>In the upper right-hand side of the page click the download menu and select <strong>Data Gateway</strong>
			</div><p><img src="https://msdnshared.blob.core.windows.net/media/2016/10/101716_1741_Gettingstar1.png" alt="" />
			</p><p>
 </p></li><li>Download the software and run the install.
</li><li>Click <strong>Next</strong>.
</li><li><div>Select <strong>On-Premises Data Gateway</strong> (not Personal Gateway) during the install.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2016/10/101716_1741_Gettingstar2.png" alt="" />
			</p><p>
 </p></li><li>Click <strong>Next</strong>.
</li><li>Click <strong>Next</strong>.
</li><li>Confirm location for software to be installed &amp; confirm terms of use.  Click <strong>Install</strong>.
</li><li>You should see confirmation that installation was successful.  Click <strong>Sign In</strong> to continue.  Sign in with your workplace/Power BI Pro credentials.
</li><li><div>Select <strong>Register a new gateway on this computer</strong>.  Other option is for cases when you might need to migrate an existing gateway to another server for example.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2016/10/101716_1741_Gettingstar3.png" alt="" />
			</p><p>
 </p></li><li><div>Give your new gateway a name and provide an 8-character recovery key:
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2016/10/101716_1741_Gettingstar4.png" alt="" />
			</p><p>
 </p></li><li>Click <strong>Configure</strong>.
</li><li><div>Confirm that the gateway configuration completed and is ready to use with a message like this:
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2016/10/101716_1741_Gettingstar5.png" alt="" />
			</p></li><li>Click <strong>Close</strong>.
</li></ol><h2>Add a Data Source to your Gateway (to be completed on any computer with a browser)
</h2><ol><li>Login to <a href="https://www.PowerBI.com">https://www.PowerBI.com</a> with your work/Pro credentials.
</li><li><div>In the upper right-hand side of the page click the download menu and select <strong>Manage Gateway</strong>.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2016/10/101716_1741_Gettingstar6.png" alt="" />
			</p><p>
 </p></li><li><div>Your new gateway should be listed by name on the left-hand side.  Click <strong>ADD DATA SOURCE</strong> to add a new data source to the gateway.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2016/10/101716_1741_Gettingstar7.png" alt="" />
			</p><p>
 </p></li><li><div>Enter the details of your new data source:
</div><p style="margin-left: 36pt">Data Source Name
</p><p style="margin-left: 36pt">Data Source Type (select<strong> MySQL</strong>)
</p><p style="margin-left: 36pt">Server
</p><p style="margin-left: 36pt">Database
</p><p style="margin-left: 36pt">Authentication Method (<strong>Basic</strong> or <strong>Windows</strong>. For my testing, I'm using a user account managed on the MariaDB server, so I need <strong>Basic</strong>)
</p><p style="margin-left: 36pt">Username
</p><p style="margin-left: 36pt">Password
</p><p>
 </p><p><img src="https://msdnshared.blob.core.windows.net/media/2016/10/101716_1741_Gettingstar8.png" alt="" />
			</p><p>
 </p><p><strong>Advanced Settings</strong> are used to set the Privacy level of this data source.  On-premises data gateway can be used by users across your organization so it may be important to set the Privacy level of data sources using this setting.
</p><p>
 </p></li><li>Click <strong>Add</strong>.  The gateway service will confirm that it can access the data source you are attempting to add.
</li><li>Click <strong>Users</strong> tab.
</li><li>Add users to the data source by entering their address.  Click <strong>Add</strong>.  This is also where you can remove users.
</li></ol><h2>Create your Power BI report/PBIX (to be completed with Power BI Desktop)
</h2><p>If you've never used Power BI to create a report using an on premise data source, you can use these articles to walk you through the process:
</p><p>Get started with Power BI: <a href="https://powerbi.microsoft.com/en-us/documentation/powerbi-service-get-started/">https://Power BI.microsoft.com/en-us/documentation/Power BI-service-get-started/</a>
	</p><p>Create a new Power BI report: <a href="https://powerbi.microsoft.com/en-us/documentation/powerbi-service-create-a-new-report/">https://Power BI.microsoft.com/en-us/documentation/Power BI-service-create-a-new-report/</a>
	</p><p>Power BI – basic concepts for Power BI service: <a href="https://powerbi.microsoft.com/en-us/documentation/powerbi-service-basic-concepts/">https://Power BI.microsoft.com/en-us/documentation/Power BI-service-basic-concepts/</a>
	</p><p>You don't need to tell Power BI that you will be connecting to the on premise data source via a gateway, just connect directly to the source.  When you publish the PBIX file, the Power BI Portal will handle sourcing the data through the gateway for published reports. 
</p><h2>Publish Power BI report (to be completed with Power BI Desktop)
</h2><ol><li>Starting with a Power BI report that is ready to be published.
</li><li><div>Click the Publish button in the Home tab of Power BI Desktop
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2016/10/101716_1741_Gettingstar9.png" alt="" />
			</p><p>
 </p></li><li>Select publishing destination, likely you'll want to publish to your Power BI Workspace ("My Workspace").
</li><li>Power BI Desktop will publish the PBIX file to your Workspace in the Power BI Service.  You should receive confirmation with a link to the published report.
</li></ol><h2>Appendix
</h2><h3>Ensure proper gateway is selected for the data source
</h3><p>Depending on your setup you may have other gateways setup in the Power BI Service.  In order for data updates/refreshes to flow through from an on premise source like MariaDB to the Power BI Service you'll need to ensure the proper gateway is selected.
</p><ol><li>Login to the Power BI Portal:  <a href="https://www.PowerBI.com">https://www.PowerBI.com</a> with your work/Pro credentials.
</li><li>In the left-hand navigation menu scroll down to the Datasets section.
</li><li>Click the … button for your newly published dataset (should be the same name as your published Power BI report).
</li><li><div>Click <strong>SCHEDULE REFRESH</strong>, this will open the report preferences.
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2016/10/101716_1741_Gettingstar10.png" alt="" />
			</p><p>
 </p></li><li><div>Datasets tab should be selected, click <strong>Gateway connection</strong> and then ensure the proper gateway is selected.  You will also notice a status for each gateway
</div><p><img src="https://msdnshared.blob.core.windows.net/media/2016/10/101716_1741_Gettingstar11.png" alt="" />
			</p><p>
 </p></li><li>Click Apply if changes are made.
</li><li>Initiate a manual refresh by selecting <strong>REFRESH NOW</strong> from the dataset menu.
</li></ol><h3>Schedule refreshes
</h3><p>Once a Gateway connection is setup (per instructions above) you should be able to initiate a manual refresh of data from the on-premise source.  You'll also be able to keep data in your workspace up-to-date via daily or weekly refreshes.
</p><ol><li>Click Schedule Refresh under the Datasets tab.
</li><li>Change the selector to Yes for <strong>keep your data up to date</strong>.
</li><li>Select a refresh frequency (<strong>Daily</strong> or <strong>Weekly</strong>).
</li><li>Select a time zone.
</li><li>Select a preferred time for the refresh to run.
</li><li>Suggestion:  Keep <strong>Send refresh failure notification email to me</strong> checked to ensure notification if the gateway runs into issues.
</li><li>Click <strong>Apply</strong>.
</li><li>Enjoy the fresh data in your awesome Power BI reports!
</li></ol><p>Let me know if there are any questions in the comments.  Thank you!</p>]]></content:encoded>
    </item>
    <item>
      <title>Power BI Embedded security for multi-tenant data stores – Role Level Security</title>
      <link>https://docs.microsoft.com/archive/blogs/orrinedenfield/power-bi-embedded-security-for-multi-tenant-data-stores-role-level-security</link>
      <pubDate>Wed, 21 Sep 2016 14:11:29 GMT</pubDate>
      <dc:creator><![CDATA[Orrin E]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/orrinedenfield/?p=115</guid>
      <description><![CDATA[I often preface customer conversations by going into my past experiences of using data "behind the...]]></description>
      <content:encoded><![CDATA[<p>I often preface customer conversations by going into my past experiences of using data "behind the scenes" or in the "back-end" context.  This basically means that I'm not normally one to get excited about new data visualizations or tools that allow data consumers to slice &amp; dice data or pivot data to the n-th degree of complexity.  While I recognize this is often a challenge and that real business value can be realized using tools like this – when I have my way I often try to find a way to get my data into a desired end result using a set of scripts utilizing a myriad of tools often associated with data developers, wranglers or curators (R, bash commands, SQL &amp; PowerShell are usually my go-to tools).
</p><p>That being said every once in a while, something on the "visual layer" toolbox gets my attention and recently this has been Power BI Embedded (<a href="https://azure.microsoft.com/en-us/services/power-bi-embedded/">https://azure.microsoft.com/en-us/services/power-bi-embedded/</a>).  Simply put Power BI Embedded is a service that allows users to embedded a Power BI (<a href="https://powerbi.microsoft.com/">https://powerbi.microsoft.com/</a>) visual report directly into a web application.  This is useful due to these challenges:
</p><ol><li>Application developers often want/need to be focused on the core functionality of the application – not visualizing data that is often a by-product of the application or line of business process.
</li><li>Making engaging and attractive data visuals is a daunting task for many organizations.
</li><li>Monetizing data often brings challenges around proper costing to users – especially in a multi-tenant environment.
</li></ol><p>It's one thing to provide a service like Power BI Embedded for internal-facing end users where many times data are protected by database or data store level security via role-based authorization (RBAC) and user accounts authenticated through a central identity management system like Active Directory, LDAP or a Kerberos KDC.  It is another challenge if there are applications that bake in their own authentication and authorization mechanisms while accessing the data store via a central per-application service-user account, and those end users might even be outside your organization and too numerous to make purchasing a reporting-user license cost effective.  I've worked closely with a number of applications like there and there are reasons for architecting an application like this as well as reasons for not – I won't go into these here.  
</p><h2>Role Level Security
</h2><p>The good news is that Power BI Embedded can make use of a feature called Role Level Security that allows you to customize the data request with predicate values and security provide each user their own returned set of data (based on existing authorization that is built into a custom multi-tenant web application).  More details of Role Level Security can be found <a href="https://azure.microsoft.com/en-us/documentation/articles/power-bi-embedded-rls/">here</a>.  This is how Power BI Embedded with Role Level Security helps solve the 3 challenges above.
</p><h3>Allowing application developers to focus on core application functionality
</h3><p>Power BI Embedded allows the insertion of a Power BI report (PBIX file) via an IFRAME.  This allows for easy integration with existing web applications.  REST &amp; .NET APIs are available as well as SDKs for .NET and JavaScript.
</p><h3>Easily Creating Engaging &amp; Powerful Visuals
</h3><p>Power BI is widely known for making it easy to create powerful &amp; dynamic data visualizations.  It provides the capability to build custom visualizations, publish to internal organization users and connect to a wide variety of static and real-time data sources ranging from files, databases, NoSQL stores, and streaming data tools.
</p><h3>Enabling Monetization of Data
</h3><p>Power BI Embedded is an Azure service and as such you can easily create multiple Power BI Embedded Workspace Collections within an Azure subscription.  Within a Power BI Embedded Workspace Collections there are Workspaces and within Workspaces there are published reports.  Many reports can be published to a Workspace and many Workspaces can be contained in a Collection.  This hierarchy allows an organization to know which Collections, Workspaces and Reports are being used.  Power BI Embedded billing does not depend on a user or application count but instead is per session, more details on per session billing can be found <a href="https://azure.microsoft.com/en-us/pricing/details/power-bi-embedded/">here</a> (as well as the latest prices).
</p><p>
 </p><p>Additional resources for Power BI Embedded &amp; Role Level Security to get started:
</p><ul><li>What is Power Bi Embedded:  <a href="https://azure.microsoft.com/en-us/documentation/articles/power-bi-embedded-what-is-power-bi-embedded/">https://azure.microsoft.com/en-us/documentation/articles/power-bi-embedded-what-is-power-bi-embedded/</a>
		</li><li>Common Power BI Embedded scenarios:  <a href="https://azure.microsoft.com/en-us/documentation/articles/power-bi-embedded-scenarios/">https://azure.microsoft.com/en-us/documentation/articles/power-bi-embedded-scenarios/</a>
		</li><li>TechNet Virtual Lab: Developing a Web App with Azure Power BI Embedded:  <a href="https://vlabs.holsystems.com/vlabs/technet?eng=VLabs&amp;auth=none&amp;src=vlabs&amp;altadd=true&amp;labid=25796&amp;lod=true">https://vlabs.holsystems.com/vlabs/technet?eng=VLabs&amp;auth=none&amp;src=vlabs&amp;altadd=true&amp;labid=25796&amp;lod=true</a>
		</li><li>Get Started with Power BI Embedded sample app:  <a href="https://azure.microsoft.com/en-us/documentation/articles/power-bi-embedded-get-started-sample/">https://azure.microsoft.com/en-us/documentation/articles/power-bi-embedded-get-started-sample/</a>
		</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Welcome!</title>
      <link>https://docs.microsoft.com/archive/blogs/orrinedenfield/welcome</link>
      <pubDate>Mon, 15 Aug 2016 13:17:26 GMT</pubDate>
      <dc:creator><![CDATA[Orrin E]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/orrinedenfield/?p=25</guid>
      <description><![CDATA[Hello and welcome to my blog.  I'm new around here but not new to writing about or solving data...]]></description>
      <content:encoded><![CDATA[Hello and welcome to my blog.  I'm new around here but not new to writing about or solving data challenges. Please take a look at my profile for more information.

Today we live in a world driven by data and I'm excited to share this next phase of the journey with everyone here!]]></content:encoded>
    </item>
  </channel>
</rss>