hadoop - 实时设置环境变量。谷歌大查询

标签 hadoop apache-spark google-bigquery

我正在为 Spark 编写一个谷歌大查询连接器,在它下面使用谷歌 hadoop 连接器。

目前,Google hadoop 连接器需要一个指向 creds json 文件的 Google 环境变量。

当您在 dataproc 世界之外启动集群时,设置这可能会很烦人

在代码中实时设置是不是不好的做法?或者是否有一种解决方法可以告诉 hadoop 连接器忽略 env 变量,因为它是在“fs.gs.auth.service.account.json.keyfile”hadoop 配置中设置的?

Dennis既然您是该项目的贡献者,也许这次您也可以提供帮助?

最佳答案

对于那些感兴趣的人,我只是使用 scala 中的以下要点在运行时设置它们

https://gist.github.com/jaytaylor/770bc416f0dd5954cf0f

但是这里是代码,以防要点离线

trait EnvHacker {
/**
 * Portable method for setting env vars on both *nix and Windows.
 * @see http://stackoverflow.com/a/7201825/293064
 */
def setEnv(newEnv: Map[String, String]): Unit = {
    try {
        val processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment")
        val theEnvironmentField = processEnvironmentClass.getDeclaredField("theEnvironment")
        theEnvironmentField.setAccessible(true)
        val env = theEnvironmentField.get(null).asInstanceOf[JavaMap[String, String]]
        env.putAll(newEnv)
        val theCaseInsensitiveEnvironmentField = processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment")
        theCaseInsensitiveEnvironmentField.setAccessible(true)
        val cienv = theCaseInsensitiveEnvironmentField.get(null).asInstanceOf[JavaMap[String, String]]
        cienv.putAll(newEnv)
    } catch {
        case e: NoSuchFieldException =>
            try {
                val classes = classOf[Collections].getDeclaredClasses()
                val env = System.getenv()
                for (cl <- classes) {
                    if (cl.getName() == "java.util.Collections$UnmodifiableMap") {
                        val field = cl.getDeclaredField("m")
                        field.setAccessible(true)
                        val obj = field.get(env)
                        val map = obj.asInstanceOf[JavaMap[String, String]]
                        map.clear()
                        map.putAll(newEnv)
                    }
                }
            } catch {
                case e2: Exception => e2.printStackTrace()
            }

        case e1: Exception => e1.printStackTrace()
    }
}

}

关于hadoop - 实时设置环境变量。谷歌大查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42344121/

相关文章:

hadoop - lily solr hbase 索引器 : add indexer indexdemo-indexer. xml

bash - 如何查看整个根 hdfs 磁盘使用情况? (hadoop dfs -du/gets 子文件夹)

hadoop - RDD 存储在哪里?

docker - 工作容器无法重新连接到Spark驱动程序

python - 查询在 bigquery Web UI 中返回非空数据集,但在 python 脚本中返回空集

google-maps - 创建多维度交互图的工具推荐

logging - 解析 HIVE 中的自定义日志

hadoop程序只写逻辑,只写reducer的程序

python - 如何控制每个sparkworker节点做一些特殊的工作?

sql - BigQuery 返回正则表达式的所有匹配项