Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以使用Jupyter实验室使用Scala与databricks spark cluster交互吗?_Scala_Apache Spark_Jupyter_Jupyter Lab_Databricks Connect - Fatal编程技术网

我可以使用Jupyter实验室使用Scala与databricks spark cluster交互吗?

我可以使用Jupyter实验室使用Scala与databricks spark cluster交互吗?,scala,apache-spark,jupyter,jupyter-lab,databricks-connect,Scala,Apache Spark,Jupyter,Jupyter Lab,Databricks Connect,我可以使用Jupyter lab连接到远程托管的databricks spark群集吗 有关于databricks connect的KB文章,它允许scala或java客户机进程控制spark集群。下面是一个例子: 虽然那篇KB文章涵盖了很多场景,但它没有解释如何使用Jupyter笔记本电脑使用Scala编程语言与databricks集群交互。我熟悉scala编程,但不熟悉Python。是的,这似乎是可能的,尽管没有很好的文档记录。这些步骤在windows上对我很有效。我在scala 2.12

我可以使用Jupyter lab连接到远程托管的databricks spark群集吗

有关于databricks connect的KB文章,它允许scala或java客户机进程控制spark集群。下面是一个例子:


虽然那篇KB文章涵盖了很多场景,但它没有解释如何使用Jupyter笔记本电脑使用Scala编程语言与databricks集群交互。我熟悉scala编程,但不熟悉Python。

是的,这似乎是可能的,尽管没有很好的文档记录。这些步骤在windows上对我很有效。我在scala 2.12.10中使用了databricks v.7.1

步骤1。安装anaconda:

步骤2。因为python似乎是笔记本电脑的首选语言,
您需要手动安装和配置scala内核
我可以用杏仁仁做一些事情:
安装almond时,请小心选择scala的版本
对应于远程集群中要连接到的DBR运行时的

步骤3。现在按照databricks connect docs获取一个scala程序到
通过intellij/sbt环境编译并连接到远程群集。
文档可以在这里找到
这是一种完全受支持且相当传统的方法,可用于开发自定义模块

步骤4。一旦您创建了一个工作的scala流程,您将熟悉sbt。build.sbt用于引用“databricks connect”发行版。配送地点如下:

unmanagedBase := new java.io.File("C:\\Users\\minime\\AppData\\Local\\Programs\\Python\\Python37\\Lib\\site-packages\\pyspark\\jars")
虽然intellij/sbt可以直接将这些依赖项编译到您的程序中,但在almond/jupyter内核中做同样的事情需要做更多的工作

在返回jupyter笔记本之前,运行新的scala进程并允许它创建spark会话。然后在进程结束之前,使用“process explorer”查找相关的java.exe,然后在下方的视图/窗格中显示句柄,然后将所有句柄复制到记事本中(process explorer中的Ctrl+A,记事本中的Ctrl+V)。这将为您提供databricks发行版中在运行时实际加载到流程中的模块子集

步骤5。现在您已经有了相关的模块,您需要配置您的almond scala内核以将它们加载到内存中。创建一个新的jupyter笔记本,选择scala内核,并使用如下代码加载所有模块:

interp.load.cp(ammonite.ops.Path(java.nio.file.FileSystems.getDefault().getPath( "C:/Users/minime/AppData/Local/Programs/Python/Python37/Lib/site-packages/pyspark/jars/whatever001-1.1.1.jar")))
interp.load.cp(ammonite.ops.Path(java.nio.file.FileSystems.getDefault().getPath( "C:/Users/minime/AppData/Local/Programs/Python/Python37/Lib/site-packages/pyspark/jars/whatever002-1.1.1.jar")))
interp.load.cp(ammonite.ops.Path(java.nio.file.FileSystems.getDefault().getPath( "C:/Users/minime/AppData/Local/Programs/Python/Python37/Lib/site-packages/pyspark/jars/whatever003-1.1.1.jar")))
...
请注意,发行版中有很多罐子(可能有100个!)

您可能希望直接从maven加载其他库(假设它们与scala 2.12.10和您的databricks connect发行版兼容)

公平的警告。。。在将库加载到almond内核中时,有时按特定顺序加载库是很重要的。我上面的示例并不打算告诉您通过interp.load加载它们的顺序

第6步。如果一切按计划进行,您现在应该能够使用类似于您在上面“第3步”中编写的代码在jupyter笔记本中创建运行的spark会话

您的almond内核现在通过databricks connect发行版连接到远程集群。只要不需要将任何函数或数据类型序列化到远程集群,一切都可以正常工作。在这种情况下,可能会出现各种序列化错误和空指针异常。以下是一个例子:

java.lang.NullPointerException com.databricks.service.SparkServiceClassSync$.checkSynced(SparkServiceClassSync.scala:244) org.apache.spark.sql.util.SparkServiceObjectOutputStream.WriterReplaceClassDescriptor(SparkServiceObjectOutputStream.scala:82) ... org.apache.spark.sql.util.ProtoSerializer.serializePlan(ProtoSerializer.scala:377) sparkservicerpclientstub.$anonfun$executePlan$1(sparkservicerpclientstub.scala:193)


这将是几个答案中的第一个。我希望还有其他scala/spark/databricks专家可以帮助解决此配置中的剩余问题,以便我的笔记本中声明的任何函数和数据类型也可以被远程集群使用

在我的第一个回答中,我指出使用scala笔记本电脑(在Jupyter lab和almond中)的主要挑战是我们缺少序列化任何函数或数据类型并将它们发送到由DataRicks托管的远程集群的功能

我应该指出,当我遇到这种限制时,我经常使用两种变通方法

  • 我恢复使用“火花壳”。它是databricks connect分发版的标准组件。然后,我可以使用:load和:paste命令加载scala代码的相关部分。出于某种令人高兴的原因,“sparkshell”完全能够序列化函数和数据类型,以便动态地将它们发送到远程集群。在Jupyter笔记本的背景下,杏仁内核无法为我们做到这一点

  • 另一种解决方法是.collect()将数据帧返回到驱动程序(在jupyter笔记本内核的内存中)。一旦数据帧被收集,我就可以对其执行额外的转换,即使借助于仅在jupyter笔记本中才能找到的“原始”函数和“原始”数据类型。在这种情况下,我将无法获得分布式处理的性能优势。但是,虽然代码仍在开发中,但我通常不会处理非常大的数据集,因此如果驱动程序正在运行我的函数,或者工作人员正在运行,则不会产生太大的差异

希望这是清楚的。我希望
// Microsoft JDBC
 interp.load.ivy("com.microsoft.sqlserver" % "mssql-jdbc" % "8.2.1.jre8")


// Other libraries
 interp.load.ivy("joda-time" % "joda-time" % "2.10.5")
 interp.load.ivy("org.scalaj" %% "scalaj-http" % "2.3.0")
 interp.load.ivy("org.json4s" %% "json4s-native" % "3.5.3")
 interp.load.ivy("com.microsoft.azure"  % "msal4j"   % "1.6.1")


// Other libraries
interp.load.ivy("org.apache.hadoop" % "hadoop-azure" % "3.2.1")
import org.apache.spark.sql._
val p_SparkSession = SparkSession.builder()
        .appName("APP_" + java.util.UUID.randomUUID().toString)
        .master("local") 
        .config("spark.cores.max","4") 
        .getOrCreate()