C#码农的大数据之路 - 使用C#编写MR作业
系列目录 写在前面
从Hadoop出现至今,大数据几乎就是Java平台专属一般。虽然Hadoop或Spark也提供了接口可以与其他语言一起使用,但作为基于JVM运行的框架,Java系语言有着天生优势。而且能找到的与大数据框架如Hadoop等使用介绍的文章也都以Java语言作为示例居多。许多C#er为了转投大数据怀抱也开始学习Java。微软为了拥抱大数据在这方面也做了许多,提供了一些工具及库使C#可以更好的与Hadoop等协同工作。本系列中我们一同学习如何以我们熟悉语言来使用Hadoop等大数据平台,毕竟大数据的思想是一致的,算法是固定的,语言只是一个工具。做好准备,出发。
本文先来介绍下微软这些年来在大数据平台上的工作。从中可以了解我们有哪些工具可用,方向是什么。
微软的大数据策略本部分内容参考了各种官方文档,新闻报道总结而成,虽然已经努力确保正确,但难免出现疏漏,如果有错误请各位指出。
微软的大数据策略大概分了两个阶段。
早期
微软在Hadoop出现不久就已经开始关注,在Azure云服务出现后,微软实现一个Windows平台的Hadoop发行版名为HDInsight,并且在Azure中提供了名为HDInsight的大数据服务。在应用开发中,微软提供了名为Microsoft HDInsight Emulator for Windows Azure的工具来支持开发过程中的调试。这个工具已经过时,不过现在仍然可以使用Web Platform Installer 5.0来安装。实际上这个时期的微软版Hadoop - HDInsight是基于Hortonworks Data Platform for Windows开发的,HDInsight在这个时期也是Windows和Azure平台专属。
这个时期微软还提供了一系列的Framework用于简化使用C#开发Hadoop(准确的说是微软版Hadoop - HDInsight),最初放在Codeplex上,称为Microsoft .NET SDK For Hadoop,现在里面有部分API已经过时了,像是Microsoft.Hadoop.Client等。这些API提供使用C#编写MapReduce的功能,但仅能用于基于Windows的HDInsight。
当下
后来微软拥抱开源,拥抱Linux,微软的产品也不再单一的限于Windows平台或着以.NET作为开发框架。对于HDInsight的开发微软依然继续与Hortonworks合作,但这时的HDInsight(3.4版以后)只有Linux版本。(微软拥抱Linux,Hortonworks的HDP发行版都没有Windows版了)运行在Azure上的HDInsight服务也都是跑在Linux服务器上。对于本地开发可以使用Hortonworks提供的HDP(Hortonworks Data Platform) SandBox作为虚拟环境。HDP SandBox提供了3种不同运行环境的镜像,VirtualBox、VMware及Docker。楼主比较喜欢Docker,有关Docker版HDP SandBox的配置及使用VS连接这个虚拟环境的方法详见此文。
关于HDP
HDP是一种大数据栈的发行版,包含了如Hadoop,Spark,Storm等组件。同类发行版中,可能更为人所知的是Cloudera所出的发行版CDH。下面放一张Hortonworks官网的图,2.5版本的HDP包含的组件一目了然:
微软最早开始支持使用自己的技术栈如C#和.NET开发大数据程序就是从MapReduce开始的。时至今日,微软一共提供了两种不同的方式让C#编写的MapReduce任务可以在Hadoop集群上执行,当然这些API也都是基于Hadoop Streaming,因为不管是基于Windows的大数据集群,还是基于Linux的大数据集群,它们都是运行于JVM之上。至少在很长一段时间内.NET CLR都不能和JVM共同工作。(当下,微软文档中也明确提到使用Hadoop Streaming由于数据在JVM和其他运行环境如.NET CLR之间传输会导致性能损失,微软也建议使用Java来编写MR程序,文档中的也有Java编写MR的示例)
随着微软拥抱Linux,基于Windows的大数据集群不再被支持(HDP for Windows也不再有后续版本了),微软也全面转向基于Linux的大数据集群(包括部署在Azure中的HDInsights也都是运行在Linux系统之上),这些C#写的API都不再被支持(主要原因还是这些基于.NET Framework的程序无法运行在Linux上,只能等未来.NET Core普及了)。
虽然这些API都已过时,但为了让大家了解C#技术栈这么多年来挣扎在大数据边缘的过程。下面对它们都进行了简单的介绍。
Hadoop API for .NET以下代码示例主要来自CodePlex上那篇多年没有更新的文章。
Hadoop API for .NET是微软推出的第一套用于Hadoop的.NET库。Hadoop组件中Hadoop Streaming用来支持与其它语言协同工作完成MapReduce(按国际惯例下文缩写为MR)任务的编写。Hadoop API for .NET包装了Hadoop Streaming方便使用.NET平台语言来编写MR任务。
使用Hadoop API for .NET:
Hadoop API for .NET支持的存储包括HDFS和Azure Blob Storage。输入内容的格式就是惯常的\n\r分割行(记录),\r分割列。
如果既有Mapper又有Reducer则所需要的Key Value中的Key为纯文本,以便通过StringComparison.Ordinal进行排序并存储。
其它情况下记录可以是任意结构化数据的文本表示,如字符串表示的JSON数据,如果是二进制数据(如docx文件),则记录将是文件存储的路径。
时至今日,这其中大部分API都已被废弃。
MR程序组成一个.NET编写的MR程序包含如下几部分:
编写的.NET MR任务(本示例仅有Mapper)开始编写Mapper。创建一个名为FirstMapper的类并实现MapperBase这个基类。
public class FirstMapper : MapperBase { public override void Map(string inputLine, MapperContext context) { // 输入 int inputValue = int.Parse(inputLine); // 任务 var sqrt = Math.Sqrt(inputValue); // 写入输出 context.EmitKeyValue(inputValue.ToString(), sqrt.ToString()); } }VS或Resharper的重构功能会自动添加using Microsoft.Hadoop.MapReduce;这个引用
创建任务类FirstJob,该类实现HadoopJob<FirstMapper>
public class FirstJob : HadoopJob<FirstMapper> { public override HadoopJobConfiguration Configure(ExecutorContext context) { HadoopJobConfiguration config = new HadoopJobConfiguration(); config.InputPath = "input/SqrtJob"; config.OutputFolder = "output/SqrtJob"; return config; } }