代码改自文档中提交Job的代码,原文档中使用MapReduceJobSubmissionParameters提交JVM平台语言编写的jar文件。上面的例子使用MapReduceStreamingJobSubmissionParameters作为替换来提交Hadoop Streaming任务。
代码中的存储账户关联的容器可以使用Azure PowerShell快速查看。使用Azure PowerShell需要首先安装。在管理员提升的PowerShell窗口中执行:
第一次使用Install-Module可能会提示需要安装NuGet提供程序,按Y继续就可以了。(PowerShell基于.NET,所以其扩展组件也被托管在NuGet上)
如果提示不受信任的存储库,也按Y继续即可。
成功安装基于PowerShell的Azure Resource Management工具后,在使用与账户相关的命令前都要先登录:
按提示输入相关信息,登陆成功后就可以执行查询命令了。必须获取HDInsight集群关联的存储账户。
Get-AzureRmHDInsightCluster -ClusterName "testmr"返回信息中会包含如下内容,这就是我们想要的。
DefaultStorageAccount : hdinsighthystar.blob.core.windows.net DefaultStorageContainer : testmr-2017-03-26t03-57-40-342z程序准备完后,在提交任务前,我们还需要将两个exe文件与输入上传到Azure Blob存储中。
向Azure Blob存储中拷贝文件有n多种方式,详见此文档。最直观的方式是使用宇宙第一IDE - VS中的Azure插件。Azure插件更新较频繁,请确保使用最新版的软件。本文编写时最新版本为Azure SDK for .NET 2.9.6。
安装插件后,在Cloud Explorer中可以看到容器(在服务器资源管理器中Azure结点也能看到存储账户的容器),右键快捷菜单中选择查看容器。
打开容器浏览界面,点击上传按钮打开上传对话框,选择要上传的文件,并输入路径。
注意输入路径会自动创建文件夹,这也是使用此插件来创建文件夹的唯一方式。
点击确定上传即可。
其他向Blob上传文件的方式还包括使用Azure CLI,AzCopy应用程序及Azure PowerShell。
另外由于Azure Blob存储与HDFS兼容,也可以直接使用hadoop fs命令来操作Azure Blob存储。
比如:
其中的容器名与账户名可以通过前文介绍的Azure PowerShell命令来获取。
如果本地Windows中没有安装hadoop,可以通过远程桌面连接到HDInsight集群,将文件复制到远程机器,并在远程桌面中使用hadoop导入文件到Azure Blob存储。(远程桌面环境下导入可以省略wasbs://CONTAINER@ACCOUNT.blob.core.windows.net,直接使用相对路径)
一切准备妥当后,运行SubmitNet项目,就可以提交任务:
测试结束后要记得删除集群:
删除HDInsight集群,不会同时删除存储账户,存储账户只要存在也会按照使用量计费,区域香港的话,每个容器每天要0.01港币。
所以,存储账户几乎不占成本,可以保留,以后创建新集群时直接选择现有存储账户的容器,可以直接执行其中的任务,查看其中的文件。
基于Windows的Azure HDInsight将于未来几个月内停止服务。但我们上面介绍的内容只要做一定就该就可以迁移到基于Linux的HDInsight中。首先,提交任务部分的代码是几乎不需要变(需要变的是指定Map和Reduce任务的参数,后文有说明),只要我们还在Windows系统中提交任务即可。使用.NET编写的Map和Reduce程序需要进行一定修改以便可以在.NET Core下运行。这个在下一小节有详细介绍。
.NET Core随着.NET Core的日益完善,基于.NET Core开发可以让C# MapReduce程序运行在基于Linux的大数据集群中的程序已经成为可能。在Azure HDInsight(基于Linux)中(Ubuntu16.04)甚至都已经预装了.NET Core。参照上一小节的方法,我们可以让.NET Core编写的MR任务运行在基于Linux的HDInsight中。
首先我们在Azure中创建一个集群基于Linux的HDInsight集群。Linux版的HDInsight使用Ambari作为门户页面(关于Ambari的介绍,官方文档在此),而没有了像Windows版中那样一个页面,同时为了安全考虑YARN,JobHistory及存储的Web管理界面也没有直接暴露出来。访问这些页面需要使用SSH与Linux集群建立隧道,这个道理和我们平时用SSH搭梯子FQ是一样的(官方文档在此)。
首先做一点准备工作,使用https://[cluster-name].azurehdinsight.net这个地址(或直接在集群主页点击仪表盘或Ambari视图)打开Ambari,登陆后,查找并记录下headnode0主机的地址。
如图,Hosts标签页中名称hn0开头的就是我们要找的结点。点开查看详情:
记录下这个ip,后面可以直接使用ip来登陆这个结点。
楼主一般比较喜欢用SecureCRT作为终端,使用BitviseSSH来搭梯子。(虽然它们各自都可以完成另一方的工作,但个人还是喜欢这样搭配使用)
使用BitviseSSH建立与HDInsight Linux集群的通道设置方式见下图: