使用用于 IntelliJ 的 Azure 工具包为 HDInsight 群集创建 Spark 应用程序

使用用于 IntelliJ 的 Azure 工具包插件开发以 Scala 编写的 Spark 应用程序,并直接从 IntelliJ 集成开发环境 (IDE) 将其提交到 HDInsight Spark 群集。 可按多种方式使用该插件:

  • 在 HDInsight Spark 群集中开发和提交 Scala Spark 应用程序。
  • 访问 Azure HDInsight Spark 群集资源。
  • 本地开发和运行 Scala Spark 应用程序。

Important

此插件仅可用于在 Linux 上的 HDInsight Spark 群集中创建和提交应用程序。

先决条件

安装用于 IntelliJ 的 Azure 工具包

有关安装说明,请参阅安装用于 IntelliJ 的 Azure 工具包

登录到 Azure 订阅

  1. 启动 IntelliJ IDE 并打开 Azure 资源管理器。 在“视图”菜单中,依次选择“工具窗口”、“Azure 资源管理器”。

    “Azure 资源管理器”链接

  2. 右键单击“Azure”节点,并选择“登录”。

    Note

    若要使用 Azure 工具包登录 Azure China,首先需要准备服务主体身份验证文件。

    可轻松创建服务主体,并通过 Azure CLI 2.0 授予其对给定订阅的访问特权。

    1. 在登录前,使用 az cloud set -n AzureChinaCloud 命令切换到 Azure China。
    2. 通过运行命令 az login,以用户身份登录。
    3. 通过运行 az account set --subscription <subscription id>,选择你希望服务主体可访问的订阅。 可通过 az account list --out jsonc 查看订阅。
    4. 运行以下命令,创建服务主体身份验证文件。

      Bash:

      curl -L https://raw.githubusercontent.com/Azure/azure-sdk-for-java/master/tools/authgen.py | python > my.azureauth
      

      PowerShell:

      Invoke-RestMethod -Method GET -Uri  https://raw.githubusercontent.com/Azure/azure-sdk-for-java/master/tools/authgen.py | python | Out-File -encoding ASCII my.azureauth
      
    5. 若要使用 Azure 工具包登录到 Azure China,请使用 Automated,而不是 Interactive

      azure-sign-in

  3. 在“Azure 登录”对话框中,选择“登录”并输入 Azure 凭据。

    “Azure 登录”对话框

  4. 登录之后,“选择订阅”对话框会列出与凭据关联的所有 Azure 订阅。 选择“选择”按钮。

    “选择订阅”对话框

  5. 在“Azure 资源管理器”选项卡中展开“HDInsight”,查看订阅中的 HDInsight Spark 群集。

    Azure 资源管理器中的 HDInsight Spark 群集

  6. 若要查看与群集关联的资源(例如存储帐户),可以进一步展开群集名称节点。

    展开的群集名称节点

在 HDInsight Spark 群集中运行 Spark Scala 应用程序

  1. 启动 IntelliJ IDEA 并创建一个项目。 在“新建项目”对话框中执行以下操作:

    a. 选择“HDInsight” > “Spark on HDInsight (Scala)”

    b. 在“生成工具”列表中,根据需要选择以下选项之一:

    • 用于支持 Scala 项目创建向导的“Maven”
    • 用于管理依赖项和生成 Scala 项目的“SBT”

      “新建项目”对话框

  2. 选择“下一步”。

  3. Scala 项目创建向导会自动检测是否安装了 Scala 插件。 选择“安装”。

    Scala 插件检查

  4. 若要下载 Scala 插件,请选择“确定”。 请遵照说明重启 IntelliJ。

    Scala 插件安装对话框

  5. 在“新建项目”窗口中执行以下操作:

    选择 Spark SDK

    a. 输入项目名称和位置。

    b. 在“项目 SDK”下拉列表中,选择适用于 Spark 2.x 群集的“Java 1.8”,或选择适用于 Spark 1.x 群集的“Java 1.7”。

    c. 在“Spark 版本”下拉列表中,Scala 项目创建向导集成了 Spark SDK 和 Scala SDK 的适当版本。 如果 Spark 群集版本低于 2.0,请选择“Spark 1.x”。 否则,请选择“Spark 2.x”。 本示例使用“Spark 2.0.2 (Scala 2.11.8)”。

  6. 选择“完成”。

  7. Spark 项目将自动创建一个项目。 若要查看项目,请执行以下操作:

    a. 在“文件”菜单中,选择“项目结构”。

    b. 在“项目结构”对话框中,选择“项目”查看创建的默认项目。 也可以选择加号 (+) 图标创建自己的项目。

    对话框中的项目信息

  8. 执行以下操作来添加应用程序源代码:

    a. 在“项目资源管理器”中,右键单击“src”,指向“新建”,并选择“Scala 类”。

    项目资源管理器中用于创建 Scala 类的命令

    b. 在“新建 Scala 类”对话框中提供名称,在“种类”对话框中选择“对象”,并选择“确定”。

    “新建 Scala 类”对话框

    c. 在 MyClusterApp.scala 文件中,粘贴以下代码。 此代码从 HVAC.csv(用于所有 HDInsight Spark 群集)中读取数据,检索在 CSV 的第七列中只有一个数字的行,并将输出写入群集的默认存储容器下的 /HVACOut

     import org.apache.spark.SparkConf
     import org.apache.spark.SparkContext
    
     object MyClusterApp{
         def main (arg: Array[String]): Unit = {
         val conf = new SparkConf().setAppName("MyClusterApp")
         val sc = new SparkContext(conf)
    
         val rdd = sc.textFile("wasb:///HdiSamples/HdiSamples/SensorSampleData/hvac/HVAC.csv")
    
         //find the rows that have only one digit in the seventh column in the CSV file
         val rdd1 =  rdd.filter(s => s.split(",")(6).length() == 1)
    
         rdd1.saveAsTextFile("wasb:///HVACOut")
         }
    
     }
    
  9. 执行以下操作,在 HDInsight Spark 群集中运行该应用程序:

    a. 在“项目资源管理器”中,右键单击项目名称,然后选择“将 Spark 应用程序提交到 HDInsight”。

    “将 Spark 应用程序提交到 HDInsight”命令

    b. 系统将提示输入 Azure 订阅凭据。 在“Spark 提交”对话框中提供以下值,并选择“提交”。

    • 对于“Spark 群集(仅限 Linux)”,选择要在其上运行应用程序的 HDInsight Spark 群集。

    • 从 IntelliJ 项目或硬盘中选择一个项目。

    • 在“Main 类名”文本框中选择省略号 (...),选择应用程序源代码中的 main 类,并选择“确定”。

      “选择 Main 类”对话框

    • 由于本示例中的应用程序代码不需要命令行参数,也不需要引用 JAR 或文件,可将其余的框留空。 提供所有信息后,对话框应如下图所示。

      “Spark 提交”对话框

    c. 窗口底部的“Spark 提交”选项卡应开始显示进度。 也可以通过选择“Spark 提交”窗口中的红色按钮停止应用程序。

    “Spark 提交”窗口

    若要了解如何访问作业输出,请参阅本文稍后的“使用用于 IntelliJ 的 Azure 工具包访问和管理 HDInsight Spark 群集”部分。

在 HDInsight Spark 群集上运行或调试 Spark Scala 应用程序

我们还建议以另一种方式将 Spark 应用程序提交到群集。 为此,可在“运行/调试配置”IDE 中设置参数。 有关详细信息,请参阅使用用于 IntelliJ 的 Azure 工具包通过 SSH 远程调试 HDInsight 群集上的 Spark 应用程序

使用用于 IntelliJ 的 Azure 工具包访问和管理 HDInsight Spark 群集

可以使用用于 IntelliJ 的 Azure 工具包执行各种操作。

访问作业视图

  1. 在“Azure 资源管理器”中依次展开“HDInsight”和 Spark 群集名称,并选择“作业”。

    “作业视图”节点

  2. 在右窗格中,“Spark 作业视图”选项卡显示了群集上运行的所有应用程序。 选择想要查看其详细信息的应用程序的名称。

    应用程序详细信息

  3. 若要显示正在运行的作业的基本信息,请将鼠标悬停在作业图上。 若要查看每个作业生成的阶段图和信息,请在作业图中选择一个节点。

    作业阶段详细信息

  4. 若要查看常用的日志,例如“驱动程序 Stderr”、“驱动程序 Stdout”和“目录信息”,请选择“日志”选项卡。

    日志详细信息

  5. 还可以选择窗口顶部的相应链接查看 Spark 历史记录 UI 和 YARN UI(应用程序级别)。

访问 Spark 历史记录服务器

  1. 在“Azure 资源管理器”中,展开“HDInsight”,右键单击 Spark 群集名称,然后选择“打开 Spark 历史记录 UI”。

  2. 出现提示时,请输入群集的管理员凭据(在设置群集时已指定)。

  3. 在“Spark 历史记录服务器”仪表板上,可以使用应用程序名称查找刚运行完的应用程序。 在上述代码中,已使用 val conf = new SparkConf().setAppName("MyClusterApp") 设置了应用程序名称。 因此,Spark 应用程序名称为 MyClusterApp

启动 Ambari 门户

  1. 在“Azure 资源管理器”中,展开“HDInsight”,右键单击 Spark 群集名称,然后选择“打开群集管理门户(Ambari)”。

  2. 出现提示时,请输入群集的管理员凭据。 在群集设置过程中已指定这些凭据。

管理 Azure 订阅

默认情况下,用于 IntelliJ 的 Azure 工具包将列出所有 Azure 订阅中的 Spark 群集。 如果需要,可以指定想要访问的订阅。

  1. 在“Azure 资源管理器”中,右键单击“Azure”根节点,并选择“管理订阅”。

  2. 在对话框中,清除不想访问的订阅旁边的复选框,并选择“关闭”。 如果想要从 Azure 订阅注销,可以选择“注销”。

本地运行 Spark Scala 应用程序

可以使用用于 IntelliJ 的 Azure 工具包在工作站上本地运行 Spark Scala 应用程序。 通常,这些应用程序不需要访问群集资源(如存储容器),并可以在本地运行和测试。

先决条件

在 Windows 计算机上运行本地 Spark Scala 应用程序时,可能会发生 SPARK-2356 中所述的异常。 发生此异常的原因是 Windows 中缺少 WinUtils.exe。

若要解决此错误,请下载该可执行文件到某个位置(例如 C:\WinUtils\bin)。 然后必须添加环境变量 HADOOP_HOME,并将其值设置为 C\WinUtils

运行本地的 Spark Scala 应用程序

  1. 启动 IntelliJ IDEA 并创建一个项目。

  2. 在“新建项目”对话框中执行以下操作:

    a. 选择“HDInsight” > “Spark on HDInsight 本地运行示例(Scala)”。

    b. 在“生成工具”列表中,根据需要选择以下选项之一:

    • 用于支持 Scala 项目创建向导的“Maven”
    • 用于管理依赖项和生成 Scala 项目的“SBT”

      “新建项目”对话框

  3. 选择“下一步”。

  4. 在下一个窗口中执行以下操作:

    a. 输入项目名称和位置。

    b. 在“项目 SDK”下拉列表中,选择低于 1.7 的 Java 版本。

    c. 在“Spark 版本”下拉列表中,选择想要使用的 Scala 版本:适用于 Spark 2.0 的 Scala 2.11.x,或适用于 Spark 1.6 的 Scala 2.10.x。

    “新建项目”对话框

  5. 选择“完成”。

  6. 模板将在 src 文件夹下面添加可在计算机上本地运行的示例代码 (LogQuery)。

    LogQuery 的位置

  7. 右键单击 LogQuery 应用程序,并选择“运行 'LogQuery'”。 底部的“运行”选项卡中会显示如下输出:

    Spark 应用程序本地运行结果

转换现有 IntelliJ IDEA 应用程序以使用用于 IntelliJ 的 Azure 工具包

可以转换在 IntelliJ IDEA 中创建的现有 Spark Scala 应用程序,使其与用于 IntelliJ 的 Azure 工具包兼容。 然后,可以使用该插件将应用程序提交到 HDInsight Spark 群集。

  1. 对于通过 IntelliJ IDEA 创建的现有 Spark Scala 应用程序,打开关联的 .iml 文件。

  2. 在根级别有一个 module 元素,如下所示:

     <module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
    

    编辑该元素以添加 UniqueKey="HDInsightTool" ,使 module 元素如下所示:

     <module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4" UniqueKey="HDInsightTool">
    
  3. 保存更改。 现在,应用程序应与用于 IntelliJ 的 Azure 工具包兼容。 可以通过右键单击项目资源管理器中的项目名称来测试此项。 弹出菜单现在将包含选项“将 Spark 应用程序提交到 HDInsight”。

故障排除

本地运行出错:“请使用更大的堆大小”

在 Spark 1.6 中,如果在本地运行期间使用 32 位 Java SDK,可能会遇到以下错误:

Exception in thread "main" java.lang.IllegalArgumentException: System memory 259522560 must be at least 4.718592E8. Please use a larger heap size.
    at org.apache.spark.memory.UnifiedMemoryManager$.getMaxMemory(UnifiedMemoryManager.scala:193)
    at org.apache.spark.memory.UnifiedMemoryManager$.apply(UnifiedMemoryManager.scala:175)
    at org.apache.spark.SparkEnv$.create(SparkEnv.scala:354)
    at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:193)
    at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:288)
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:457)
    at LogQuery$.main(LogQuery.scala:53)
    at LogQuery.main(LogQuery.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

之所以发生这些错误,是因为堆大小不足,导致 Spark 无法运行。 Spark 至少需要 471 MB。 (有关详细信息,请参阅 SPARK-12081。)一个简单的解决方法就是使用 64 位 Java SDK。 也可以通过添加以下选项来更改 IntelliJ 中的 JVM 设置:

-Xms128m -Xmx512m -XX:MaxPermSize=300m -ea

将选项添加到 IntelliJ 中的“VM 选项”对话框

反馈和已知问题

目前不支持直接查看 Spark 输出。

如有任何建议或反馈,或使用此插件时遇到任何问题,请向 hdivstool@microsoft.com 发送电子邮件。

后续步骤

方案

创建和运行应用程序

工具和扩展

管理资源