【问题标题】:Bluemix Apache Spark Service - Scala - reading a fileBluemix Apache Spark 服务 - Scala - 读取文件
【发布时间】:2016-05-14 18:24:59
【问题描述】:

这是一个基本问题,但是,我正在尝试使用 Scala 中的以下代码在来自 Apache Spark 服务的分析的 Bluemix 笔记本中检索文件的内容,并且不断弹出有关身份验证的错误。有人有访问文件的 Scala 身份验证示例吗?提前谢谢!

我尝试了以下简单的脚本:

val file = sc.textFile("swift://notebooks.keystone/kdd99.data")
file.take(1)

我也试过了:

def setConfig(name:String) : Unit = {
  val pfx = "fs.swift.service." + name
  val conf = sc.getConf
  conf.set(pfx + "auth.url", "hardcoded")
  conf.set(pfx + "tenant", "hardcoded")
  conf.set(pfx + "username", "hardcoded")
  conf.set(pfx + "password", "hardcoded")
  conf.set(pfx + "apikey",  "hardcoded")
  conf.set(pfx + "auth.endpoint.prefix", "endpoints")
}
setConfig("keystone")

我也从上一个问题中尝试过这个脚本:

import scala.collection.breakOut
val name= "keystone"
val YOUR_DATASOURCE = """auth_url:https://identity.open.softlayer.com
project: hardcoded
project_id: hardcoded
region: hardcoded
user_id: hardcoded
domain_id: hardcoded
domain_name: hardcoded
username: hardcoded
password: hardcoded
filename: hardcoded
container: hardcoded
tenantId: hardcoded
"""

val settings:Map[String,String] = YOUR_DATASOURCE.split("\\n").
    map(l=>(l.split(":",2)(0).trim(), l.split(":",2)(1).trim()))(breakOut)

val conf = sc.getConf        conf.set("fs.swift.service.keystone.auth.url",settings.getOrElse("auth_url",""))
conf.set("fs.swift.service.keystone.tenant", settings.getOrElse("tenantId", ""))
conf.set("fs.swift.service.keystone.username", settings.getOrElse("username", ""))
conf.set("fs.swift.service.keystone.password", settings.getOrElse("password", ""))
conf.set("fs.swift.service.keystone.apikey", settings.getOrElse("password", ""))
conf.set("fs.swift.service.keystone.auth.endpoint.prefix", "endpoints")
println("sett: "+ settings.getOrElse("auth_url","")) 
val file = sc.textFile("swift://notebooks.keystone/kdd99.data")

/* The following line gives errors */
file.take(1)

错误如下:

名称:org.apache.hadoop.fs.swift.exceptions.SwiftConfigurationException 消息:缺少强制配置选项:fs.swift.service.keystone.auth.url

编辑

这对于 Python 来说是一个不错的选择。我尝试了以下方法,将“spark”作为两个不同文件的配置名称:

def set_hadoop_config(credentials):
    prefix = "fs.swift.service." + credentials['name'] 
    hconf = sc._jsc.hadoopConfiguration()
    hconf.set(prefix + ".auth.url", credentials['auth_url']+'/v3/auth/tokens')
    hconf.set(prefix + ".auth.endpoint.prefix", "endpoints")
    hconf.set(prefix + ".tenant", credentials['project_id'])
    hconf.set(prefix + ".username", credentials['user_id'])
    hconf.set(prefix + ".password", credentials['password'])
    hconf.setInt(prefix + ".http.port", 8080)
    hconf.set(prefix + ".region", credentials['region'])
    hconf.setBoolean(prefix + ".public", True)

【问题讨论】:

    标签: scala apache-spark ibm-cloud


    【解决方案1】:

    当您尝试从 IBM Bluemix Notebook UI 访问对象存储时,我认为您需要使用“spark”作为配置名称而不是 keystone。

    sc.textFile("swift://notebooks.spark/2015_small.csv")

    现在这是一个工作示例。

    https://console.ng.bluemix.net/data/notebooks/4dda9ee7-bf26-4ebc-bccf-dcb1b7ef63c8/view?access_token=37bff7ab682ee255b753fca485d49de50fed69d2a25217a7c748dd1463222c3b

    注意考虑根据您的对象存储更改容器名称。 容器名称.配置名称。

    在上面的示例中,还要替换 YOUR_DATASOURCE 变量中的凭据。

    笔记本是默认容器。

    谢谢, 查尔斯。

    【讨论】:

    • 就是这样!非常感谢你。只是“keystone”不是一个好的配置名称。为什么“火花”现在起作用了?这是新规则吗?以前的 keystone 也可以正常工作。
    • keystone 可能工作我认为....我认为 IBM BM 对象存储的 api 似乎升级到 V3,它可能需要 v3 api URL /v3/auth/tokens ..我没有测试但是正如@NSHUKLA 在下面的帖子中所述,您可能需要更新 URL 才能使用 keystone...
    • 我遇到了默认容器名称的问题,它可以在您的 hadoopconfig 参数中设置为不同的值。在 textFile() 中发送路径时要小心
    【解决方案2】:

    要从 Scala 中的对象存储访问文件,以下命令序列可在 Scala 笔记本中运行: (当您为笔记本的数据源中显示的文件执行“插入到代码”链接时,将在单元格中填充凭据):

    输入[1]:

    var credentials = scala.collection.mutable.HashMap[String, String](
      "auth_url"->"https://identity.open.softlayer.com",
      "project"->"object_storage_b3c0834b_0936_4bbe_9f29_ef45e018cec9",
      "project_id"->"68d053dff02e42b1a947457c6e2e3290",
      "region"->"dallas",
      "user_id"->"e7639268215e4830a3662f708e8c4a5c",
      "domain_id"->"2df6373c549e49f8973fb6d22ab18c1a",
      "domain_name"->"639347",
      "username"->"Admin_XXXXXXXXXXXX”,
      "password”->”””XXXXXXXXXX”””,
      "filename"->"2015_small.csv",
      "container"->"notebooks",
      "tenantId"->"sefe-f831d4ccd6da1f-42a9cf195d79"
    )
    

    输入[2]:

    credentials("name")="keystone"
    

    输入[3]:

    def setHadoopConfig(name: String, tenant: String, url: String, username: String, password: String, region: String) = {
        sc.hadoopConfiguration.set(f"fs.swift.service.$name.auth.url",url+"/v3/auth/tokens")
        sc.hadoopConfiguration.set(f"fs.swift.service.$name.auth.endpoint.prefix","endpoints")
        sc.hadoopConfiguration.set(f"fs.swift.service.$name.tenant",tenant)
        sc.hadoopConfiguration.set(f"fs.swift.service.$name.username",username)
        sc.hadoopConfiguration.set(f"fs.swift.service.$name.password",password)
        sc.hadoopConfiguration.setInt(f"fs.swift.service.$name.http.port",8080)
        sc.hadoopConfiguration.set(f"fs.swift.service.$name.region",region)
        sc.hadoopConfiguration.setBoolean(f"fs.swift.service.$name.public",true)
    }
    

    输入[4]:

    setHadoopConfig(credentials("name"), credentials("project_id"), credentials("auth_url"), credentials("user_id"), credentials("password"), credentials("region"))
    

    输入[5]:

    var testcount = sc.textFile("swift://notebooks.keystone/2015_small.csv")
    testcount.count()
    

    输入[6]:

    testcount.take(1)
    

    【讨论】:

    • 我已经用 Python 版本编辑了这个问题。你能看看吗?
    • 对于 Python,代码似乎是正确的(您可以参考示例“Analytics Notebooks and Apache Spark”,其中包含 def set_hadoop_config(credentials) 的 python 代码。我尝试使用 .csv 和.txt 文件使用 keystone 名称。您是否遇到了 spark 作为 .data 文件的配置名称的问题,正如您所说的它与 .txt 文件一起使用?
    • 这个文件“kdd99.data”是文本文件吗?如果不是,是什么格式?
    • 原始文件的扩展名为 .arff。奇怪的是,如果我使用您提到的 Scala 脚本摄取这些数据,它就可以工作。使用我上面提到的 Python 脚本(本质上是一样的——是的,取自示例脚本)它不起作用。 Python 脚本在 txt 中运行良好。我为 kdd99.data 文件尝试了 configname 'keystone' 和 'spark' ,两者都不起作用。错误是:Py4JJavaError:调用 o518.partitions 时发生错误。 : java.lang.NullPointerException
    • 服务出错。一旦我创建了一个新服务,python 脚本也可以正常工作。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    相关资源
    最近更新 更多