web-dev-qa-db-ja.com

Spark Kerberosを使用したSQL接続のセットアップ

単純なJavaアプリケーションがあり、HiveまたはImpalaを使用してクラスターに接続し、次のようなコードを使用してクエリを実行できます。

import Java.sql.Connection;
import Java.sql.DriverManager;
import Java.sql.ResultSet;
import Java.sql.SQLException;
import Java.sql.Statement;

...

Class.forName("com.cloudera.Hive.jdbc41.HS2Driver");
Connection con = DriverManager.getConnection("jdbc:Hive2://myHostIP:10000/mySchemaName;Hive.execution.engine=spark;AuthMech=1;KrbRealm=myHostIP;KrbHostFQDN=myHostIP;KrbServiceName=Hive");
Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("select * from foobar");

しかし、今度は同じクエリをSpark SQLで試してみたいと思います。Spark SQLAPIの使用方法を理解するのに苦労しています。 。具体的には接続の設定方法。Sparkセッションの設定方法の例がありますが、たとえば、提供する必要のある値が不明です。

  SparkSession spark = SparkSession
  .builder()
  .appName("Java Spark SQL basic example")
  .config("spark.some.config.option", "some-value")
  .getOrCreate();

Spark SQLに使用するホストとポート、使用するスキーマ、および使用している認証手法をSpark SQLに指示する方法?たとえば、認証にKerberosを使用しています。

上記のSpark SQLコードは https://github.com/Apache/spark/blob/master/examples/src/main/Java/org/Apache/spark/ examples/sql/JavaSparkSQLExample.Java

更新:

私は少し進歩することができ、Spark SQL接続に使用するホストとポートを指示する方法を理解したと思います。

...

SparkSession spark = SparkSession
.builder()
.master("spark://myHostIP:10000")
.appName("Java Spark Hive Example")
.enableHiveSupport()
.getOrCreate();

そして、pom.xmlファイルに次の依存関係を追加しました

<dependency>
   <groupId>org.Apache.spark</groupId>
   <artifactId>spark-Hive_2.11</artifactId>
   <version>2.0.0</version>
</dependency>

この更新により、接続がさらに進んでいることがわかりますが、認証されていないため、接続が失敗しているように見えます。 Kerberosを使用して認証する方法を理解する必要があります。関連するログデータは次のとおりです

2017-12-19 11:17:55.717  INFO 11912 --- [o-auto-1-exec-1] org.Apache.spark.util.Utils              : Successfully started service 'SparkUI' on port 4040.
2017-12-19 11:17:55.717  INFO 11912 --- [o-auto-1-exec-1] org.Apache.spark.ui.SparkUI              : Bound SparkUI to 0.0.0.0, and started at http://myHostIP:4040
2017-12-19 11:17:56.065  INFO 11912 --- [er-threadpool-0] s.d.c.StandaloneAppClient$ClientEndpoint : Connecting to master spark://myHostIP:10000...
2017-12-19 11:17:56.260  INFO 11912 --- [pc-connection-0] o.a.s.n.client.TransportClientFactory    : Successfully created connection to myHostIP:10000 after 113 ms (0 ms spent in bootstraps)
2017-12-19 11:17:56.354  WARN 11912 --- [huffle-client-0] o.a.s.n.server.TransportChannelHandler   : Exception in connection from myHostIP:10000

Java.io.IOException: An existing connection was forcibly closed by the remote Host
10

接続を実行する前に、Kerberosログインを試みることができます。

        Configuration conf = new Configuration();
        conf.set("fs.hdfs.impl", DistributedFileSystem.class.getName());            
        conf.addResource(pathToHdfsSite);
        conf.addResource(pathToCoreSite);
        conf.set("hadoop.security.authentication", "kerberos");
        conf.set("hadoop.rpc.protection", "privacy");
        UserGroupInformation.setConfiguration(conf);
        UserGroupInformation.loginUserFromKeytab(ktUserName, ktPath);
        //your code here

ktUserNameは、ここでは[email protected]のようにプリンシパルです。これを実行するには、マシンにcore-site.xml、hdfs-site.xml、およびkeytabが必要です。

1
Oleg

Kerberos認証でImpalaを使用したデータフレームの作成

Kerberos認証でImpala接続を行うことができます。ここで私のgitリポジトリをチェックしてください。多分これはいくつかの助けになるでしょう。

0
morfious902002