Google cloud dataflow 谷歌云数据流、TextIO和Kerberized HDFS

Google cloud dataflow 谷歌云数据流、TextIO和Kerberized HDFS,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我试图在Dataflow runner上使用Beam Java 2.22.0从kerberized HDF读取TSV文件。我使用带有kerberos组件的Dataproc集群来提供kerberized HDF。我得到的错误是: Error message from worker: org.apache.hadoop.security.AccessControlException: SIMPLE authentication is not enabled. Available:[TOKEN, KE

我试图在Dataflow runner上使用Beam Java 2.22.0从kerberized HDF读取TSV文件。我使用带有kerberos组件的Dataproc集群来提供kerberized HDF。我得到的错误是:

Error message from worker: org.apache.hadoop.security.AccessControlException: SIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS]
我按照如下方式配置管道(请注意,我已经配置了java.security.krb5.realm/kdc,我认为这使得在worker上不需要krb5.conf。My
hdfstextioooptions
扩展了
Hadoop文件系统选项
,这让我可以使用Hadoop配置初始化管道

我正在从地面军事系统位置获取一个(当前未加密的)密钥表,并使用它初始化
用户组信息

  public static void main(String[] args) throws IOException {
    System.setProperty("java.security.krb5.realm", "MY_REALM");
    System.setProperty("java.security.krb5.kdc", "my.kdc.hostname");

    HdfsTextIOOptions options =
        PipelineOptionsFactory.fromArgs(args).withValidation().as(
            HdfsTextIOOptions.class);

    Storage storage = StorageOptions.getDefaultInstance().getService();
    URI uri = URI.create(options.getGcsKeytabPath());
    System.err.println(String
        .format("URI: %s, filesystem: %s, bucket: %s, filename: %s", uri.toString(),
            uri.getScheme(), uri.getAuthority(),
            uri.getPath()));
    Blob keytabBlob = storage.get(BlobId.of(uri.getAuthority(),
        uri.getPath().startsWith("/") ? uri.getPath().substring(1) : uri.getPath()));
    Path localKeytabPath = Paths.get("/tmp", uri.getPath());
    System.err.println(localKeytabPath);

    keytabBlob.downloadTo(localKeytabPath);

    Configuration conf = new Configuration();
    conf.set("fs.defaultFS", "hdfs://namenode:8020");
    conf.set("hadoop.security.authentication", "kerberos");

    UserGroupInformation
        .loginUserFromKeytab(options.getUserPrincipal(), localKeytabPath.toString());
    UserGroupInformation.setConfiguration(conf);

    options.setHdfsConfiguration(ImmutableList.of(conf));

    Pipeline p = Pipeline.create(options);

    p.apply(TextIO.read().from(options.getInputFile()))
    ...
我是否缺少一些必要的配置,无法从Beam on数据流正确访问kerberized HDF


谢谢!

看起来您在构建时正在管道中设置系统属性。您需要确保在管道执行期间也设置了这些属性


一种简单的方法是编写自己的设置这些属性的方法。工作人员将使用Java的ServiceLoader实例化JVM初始化器。

在构建管道时,您是否有权访问HDFS文件系统?我还注意到您设置的系统属性,并且只适用于当前JVM进程。您需要看看在工作进程上执行时使用JVM初始值设定项来设置系统属性。啊,JVM初始值设定项看起来确实会有帮助!是的,我在构建管道时确实可以访问HDFS。我将尝试一下。