Suppress the message “Supplied authorities: …” org.apache.hive.jdbc.Utils#parseURL emits

HiveServer2にJDBC経由で接続する際に、ログの設定によっては"Supplied authorities: ..."
のようなメッセージが出力されます。hive-jdbcの依存するライブラリはcommons-logging、Log4J、SLF4Jなど様々なログライブラリを含んでおり非常にややこしいですが、今回はlogback+SLF4Jで統一するとしてタイトルのようなメッセージを抑制するために以下のようにまとめてみました。
pom.xml
HiveServer2へJDBC経由で接続するのに必要なライブラリは以下を参考にします。
https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients
上記リンクを参考に以下のように設定してみました。dbutils
は今回のログの件とは関係なくおまけです。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>net.debug-life.hiveserver2</groupId> <artifactId>jdbc-sample-client</artifactId> <version>1.0-SNAPSHOT</version> <repositories> <repository> <id>cloudera</id> <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url> </repository> </repositories> <dependencies> <dependency> <groupId>commons-dbutils</groupId> <artifactId>commons-dbutils</artifactId> <version>1.6</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.7</version> </dependency> <!-- hive jdbc --> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>1.1.0-cdh5.7.1</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>apache-log4j-extras</artifactId> </exclusion> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <!-- hadoop-common --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.6.0-cdh5.7.1</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>apache-log4j-extras</artifactId> </exclusion> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.4.3</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
logback.xml
続いてログの設定です。
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <logger name="org.apache" level="WARN" additivity="false"> <appender-ref ref="STDOUT" /> </logger> <root level="DEBUG"> <appender-ref ref="STDOUT" /> </root> </configuration>
実行してみる
最後に実行してみます。
package sample; import java.sql.Connection; import java.sql.DriverManager; import java.util.List; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; import org.apache.commons.dbutils.handlers.ArrayListHandler; public class HiveJdbcTool { static final String HIVE_URI = "jdbc:hive2://localhost:10000/default"; static { try { Class.forName("org.apache.hive.jdbc.HiveDriver"); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } public static void main(String[] args) throws Exception { try (Connection conn = DriverManager.getConnection(HIVE_URI, "hive", "")) { QueryRunner runner = new QueryRunner(true); ResultSetHandler<List<Object[]>> rsh = new ArrayListHandler(); List<Object[]> results = runner.query(conn, "show databases", rsh); results.stream() .map(columns -> columns[0]) .forEach(System.out::println); } } }
結果は以下のようになりました。
ちなみに以下のように設定すると、
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="STDOUT" /> </root> </configuration>
“Supplied …”の部分は表示されます。
org.apache.hiveのロガーレベルだけwarn以上にするといい感じに抑制できます。
参考リンク
posted with amazlet at 16.09.30
Edward Capriolo Dean Wampler Jason Rutherglen
オライリージャパン
売り上げランキング: 102,695
オライリージャパン
売り上げランキング: 102,695