Azure HDInsight 中 Apache Spark 群集上的 Jupyter notebook 的内核

HDInsight Spark 群集提供可在 Apache Spark 上的 Jupyter notebook 中用于测试应用程序的内核。 内核是可以运行和解释代码的程序。 三个内核如下:

  • PySpark - 适用于以 Python2 编写的应用程序
  • PySpark3 - 适用于以 Python3 编写的应用程序
  • Spark - 适用于以 Scala 编写的应用程序

本文介绍如何使用这些内核以及使用它们的优势。

先决条件

在 Spark HDInsight 上创建 Jupyter Notebook

  1. Azure 门户中,选择 Spark 群集。 有关说明,请参阅列出和显示群集。 此时将打开“概述”视图。

  2. 在“概述”视图的“群集仪表板”框中,选择 Jupyter Notebook。 出现提示时,请输入群集的管理员凭据。

    Spark 上的 Jupyter Notebook

    备注

    也可以在浏览器中打开以下 URL 来访问 Spark 群集中的 Jupyter Notebook。 将 CLUSTERNAME 替换为群集的名称:

    https://CLUSTERNAME.azurehdinsight.cn/jupyter

  3. 选择“新建”,然后选择“Pyspark”、“PySpark3”或“Spark”创建 Notebook。 使用适用于 Scala 应用程序的 Spark 内核、适用于 Python2 应用程序的 PySpark 内核,以及适用于 Python3 应用程序的 PySpark3 内核。

    Spark 上适用于 Jupyter Notebook 的内核

  4. 此时会打开使用所选内核的 Notebook。

使用这些内核的好处

以下是在 Spark HDInsight 群集中的 Jupyter Notebook 上使用新内核的几个好处。

  • 预设上下文。 使用 PySpark、PySpark3 或 Spark 内核时,无需先显式设置 Spark 或 Hive 上下文,即可开始使用应用程序 。 这些上下文默认可用。 这些上下文包括:

    • sc - 表示 Spark 上下文

    • sqlContext - 表示 Hive 上下文

      因此,不需要运行如下语句来设置上下文:

      sc = SparkContext('yarn-client')
      sqlContext = HiveContext(sc)
      

      可以直接在应用程序中使用预设上下文。

  • 单元 magic。 PySpark 内核提供一些预定义的“magic”,这是可以结合 %% 调用的特殊命令(例如 %%MAGIC <args>)。 magic 命令必须是代码单元中的第一个字,并且允许多行内容。 magic 一字应该是单元中的第一个字。 在 magic 前面添加任何内容(即使是注释)都会导致错误。 有关 magic 的详细信息,请参阅 此文

    下表列出了可通过内核提供的不同 magic。

    Magic 示例 说明
    help %%help 生成所有可用 magic 的表,其中包含示例和说明
    info %%info 输出当前 Livy 终结点的会话信息
    配置 %%configure -f
    {"executorMemory": "1000M",
    "executorCores": 4}
    配置用于创建会话的参数。 如果已创建会话,则必须指定 force 标志 (-f),确保删除再重新创建该会话。 有关有效参数的列表,请查看 Livy's POST /sessions Request Body (Livy 的 POST /sessions 请求正文)。 参数必须以 JSON 字符串传入,并且必须位于 magic 后面的下一行,如示例列中所示。
    sql %%sql -o <variable name>
    SHOW TABLES
    针对 sqlContext 执行 Hive 查询。 如果传递了 -o 参数,则查询的结果以 Pandas 数据帧的形式保存在 %%local Python 上下文中。
    local %%local
    a=1
    后续行中的所有代码将在本地执行。 无论你使用哪个内核,代码都必须是有效的 Python2 代码。 因此,即使在创建 Notebook 时选择了“PySpark3”或“Spark”,但如果在单元中使用 %%local magic,该单元也只能包含有效的 Python2 代码。
    日志 %%logs 输出当前 Livy 会话的日志。
    删除 %%delete -f -s <session number> 删除当前 Livy 终结点的特定会话。 无法删除针对内核本身启动的会话。
    cleanup %%cleanup -f 删除当前 Livy 终结点的所有会话,包括此笔记本的会话。 force 标志 -f 是必需的。

    备注

    除了 PySpark 内核添加的 magic 以外,还可以使用内置的 IPython magic(包括 %%sh)。 可以使用 %%sh magic 在群集头节点上运行脚本和代码块。

  • 自动可视化。 Pyspark 内核会自动将 Hive 和 SQL 查询的输出可视化。 可以选择多种不同类型的视觉效果,包括表、饼图、折线图、分区图和条形图。

%%sql magic 支持的参数

%%sql magic 支持不同的参数,可以使用这些参数控制运行查询时收到的输出类型。 下表列出了输出。

参数 示例 说明
-o -o <VARIABLE NAME> 使用此参数将查询结果以 Pandas 数据帧的形式保存在 %%local Python 上下文中。 数据帧变量的名称是指定的变量名称。
-q -q 使用此参数可关闭单元可视化。 如果不想自动将单元内容可视化,而只想将它作为数据帧捕获,可以使用 -q -o <VARIABLE>。 如果想要关闭可视化而不捕获结果(例如,运行诸如 CREATE TABLE 语句的 SQL 查询),请使用不带 -o 参数的 -q
-m -m <METHOD> 其中,METHODtakesample(默认为 take)。 如果方法为 take ,内核将从 MAXROWS 指定的结果数据集顶部选取元素(如此表中的后面部分所述)。 如果方法为 sample,内核将根据 -r 参数进行数据集的元素随机采样,如此表中稍后所述。
-r -r <FRACTION> 此处的 FRACTION 是介于 0.0 与 1.0 之间的浮点数。 如果 SQL 查询的示例方法为 sample,则内核会随机地对结果集的指定部分元素取样。 例如,如果使用参数 -m sample -r 0.01运行 SQL 查询,则 1% 的结果行是随机取样的。
-n -n <MAXROWS> MAXROWS 是整数值。 内核将输出行的数目限制为 MAXROWS。 如果 MAXROWS 是负数(例如 -1),结果集中的行数不受限制。

示例:

%%sql -q -m sample -r 0.1 -n 500 -o query2
SELECT * FROM hivesampletable

上述语句执行以下操作:

  • hivesampletable 中选择所有记录。
  • 由于使用了 -q,因此将关闭自动可视化。
  • 由于使用了 -m sample -r 0.1 -n 500,因此将从 hivesampletable 的行中随机采样 10%,并将结果集的大小限制为 500 行。
  • 最后,由于使用了 -o query2 ,因此将输出保存到名为 query2 的数据帧中。

使用新内核时的注意事项

不管使用哪种内核,使 Notebook 一直保持运行都会消耗群集资源。 使用这些内核时,由于上下文是预设的,仅退出笔记本并不会终止上下文, 因此会继续占用群集资源。 合理的做法是在使用完笔记本后,使用笔记本的“文件”菜单中的“关闭并停止”选项。 关闭会终止上下文,并退出笔记本。

Notebook 存储在何处?

如果群集使用 Azure 存储作为默认存储帐户,Jupyter notebook 将保存到 /HdiNotebooks 文件夹下的存储帐户。 可以从存储帐户访问在 Jupyter 内部创建的 Notebook、文本文件和文件夹。 例如,如果使用 Jupyter 创建文件夹 myfolder 和 Notebook myfolder/mynotebook.ipynb,可在存储帐户中通过 /HdiNotebooks/myfolder/mynotebook.ipynb 访问该 Notebook。 反之亦然,如果直接将 Notebook 上传到 /HdiNotebooks/mynotebook1.ipynb中的存储帐户,则可以从 Jupyter 查看该 Notebook。 即使删除了群集,Notebook 也仍会保留在存储帐户中。

备注

将 Azure Data Lake Storage 作为默认存储的 HDInsight 群集不在关联的存储中存储笔记本。

将笔记本保存到存储帐户的方式与 Apache Hadoop HDFS 兼容。 如果通过 SSH 连接到群集,可以使用文件管理命令:

Command 说明
hdfs dfs -ls /HdiNotebooks # 列出根目录中的所有内容 - Jupyter 可以从主页看到此目录中的所有内容
hdfs dfs �copyToLocal /HdiNotebooks # 下载 HdiNotebooks 文件夹的内容
hdfs dfs �copyFromLocal example.ipynb /HdiNotebooks # 将笔记本 example.ipynb 上传到根文件夹,使其在 Jupyter 中可见

不论群集是使用 Azure 存储还是 Azure Data Lake Storage 作为默认存储帐户,笔记本还是会保存在群集头节点上的 /var/lib/jupyter 中。

支持的浏览器

Google Chrome 仅支持 Spark HDInsight 群集中的 Jupyter Notebook。

建议

新内核正处于发展阶段,一段时间后将变得成熟。 因此,API 会随着这些内核的成熟而改变。 如果在使用这些新内核时有任何反馈,我们将不胜感激。 此反馈对于塑造这些内核的最终版本会很有帮助。 可以在本文末尾的“反馈”部分下面留下意见/反馈。

后续步骤