使用用于 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 资源管理器”。

    在“视图”菜单中选择的命令

  2. 右键单击“Azure”节点,然后单击“登录”。
  3. 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

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

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

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

    展开群集名称可查看资源

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

  1. 启动 IntelliJ IDEA 并创建一个项目。 在“新建项目”对话框中做出以下选择,然后单击“下一步”。 “新建项目”对话框
    • 在左窗格中,选择“HDInsight”。
    • 在右窗格中,选择“Spark on HDInsight (Scala)”。
    • 生成工具:Scala 项目创建向导支持使用 Maven 或 SBT 管理依赖项和构建 scala 项目。 根据需要选择一个生成工具。
  2. Scala 项目创建向导将自动检测是否已安装 Scala 插件。 单击“安装”以继续。

    scala 检查

  3. 单击“确定”下载 Scala 插件。 请遵照说明重启 IntelliJ。

    Scala 安装

  4. 在下一个窗口中提供以下项目详细信息,然后单击“完成”。
    选择 Spark SDK

    • 提供项目名称和项目位置。
    • 对于“项目 SDK”,请使用适用于 Spark 2.x 群集的 Java 1.8,以及适用于 Spark 1.x 群集的 Java 1.7。
    • 对于“Spark 版本”,Scala 项目创建向导将集成 Spark SDK 和 Scala SDK 的适当版本。 如果 Spark 群集版本低于 2.0,请选择“Spark 1.x”。 否则,应选择“Spark 2.x”。 本示例使用 Spark2.0.2 (Scala 2.11.8)。
  5. Spark 项目将自动创建一个项目。 若要查看该项目,请遵循以下步骤:

    1. 在“文件”菜单中,单击“项目结构”。
    2. 在“项目结构”对话框中,单击“项目”以查看创建的默认项目。 也可以通过 + 图标创建自己的项目。 对话框中的项目信息
  6. 添加应用程序源代码。

    1. 在“项目资源管理器”中,右键单击“src”,指向“新建”,然后单击“Scala 类”。

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

    2. 在“新建 Scala 类”对话框中提供名称,在“种类”对话框中选择“对象”,然后单击“确定”。

      “新建 Scala 类”对话框

    3. 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("wasbs:///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("wasbs:///HVACOut")
          }
      
        }
      
  7. 在 HDInsight Spark 群集中运行该应用程序。

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

      选择“将 Spark 应用程序提交到 HDInsight”

    2. 系统将提示输入 Azure 订阅凭据。 在“Spark 提交”对话框中提供以下值,然后单击“提交”。

      • 对于“Spark 群集(仅限 Linux)”,选择要在其上运行应用程序的 HDInsight Spark 群集。
      • 从 IntelliJ 项目或硬盘中选择一个项目。
      • 在“Main 类名”文本框中单击省略号 (ellipsis),选择应用程序源代码中的 main 类,然后单击“确定”。 “选择 Main 类”对话框
      • 由于本示例中的应用程序代码不需要任何命令行参数,也不需要引用 JAR 或文件,你可以将其余的框留空。 提供所有输入后,对话框应如下图所示。

        “Spark 提交”对话框

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

      “Spark 提交”窗口

      本文稍后的“使用用于 IntelliJ 的 Azure 工具包访问和管理 HDInsight Spark 群集”部分介绍了如何访问作业输出。

在 HDInsight Spark 群集中作为 Spark Scala 应用程序运行或调试

我们还建议通过另一种方式将 Spark 应用程序提交到群集。 通过在“运行/调试配置”IDE 中设置参数来实现。 有关详细信息,请参阅通过 SSH 使用用于 IntelliJ 的 Azure 工具包在 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. 在“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 并创建一个项目。 在“新建项目”对话框中做出以下选择,然后单击“下一步”。

    • 在左窗格中,选择“HDInsight”。
    • 在右窗格中,选择“Spark on HDInsight 本地运行示例(Scala)”。
    • 生成工具:Scala 项目创建向导支持使用 Maven 或 SBT 管理依赖项和构建 scala 项目。 根据需要选择一个生成工具。 “新建项目”对话框中的选项
  2. 在下一个窗口中提供以下项目详细信息,然后单击“完成”。

    • 提供项目名称和项目位置。
    • 对于“项目 SDK”,请确保提供的 Java 版本大于 7。
    • 对于“Spark 版本”,请选择 Scala 要使用的版本:“适用于 Spark 2.0 的 Scala 2.11.x”和“适用于 Spark 1.6 的 Scala 2.10.x”。 选择 Spark SDK
  3. 模板将在 src 文件夹下面添加可在计算机上本地运行的示例代码 (LogQuery)。

    LogQuery 的位置

  4. 右键单击“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 发送电子邮件。

另请参阅

演示

方案

创建和运行应用程序

工具和扩展

管理资源