<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Hadoop on EUB's second brain</title><link>https://eubnara.github.io/ko/tags/hadoop/</link><description>Recent content in Hadoop on EUB's second brain</description><generator>Hugo -- 0.162.1</generator><language>ko-kr</language><lastBuildDate>Sat, 25 May 2024 22:34:00 +0900</lastBuildDate><atom:link href="https://eubnara.github.io/ko/tags/hadoop/index.xml" rel="self" type="application/rss+xml"/><item><title>"jute.maxbuffer" 관련 모니터링 지표</title><link>https://eubnara.github.io/ko/computer-science/hadoop/monitoring-jute.maxbuffer/</link><pubDate>Sat, 25 May 2024 22:34:00 +0900</pubDate><guid>https://eubnara.github.io/ko/computer-science/hadoop/monitoring-jute.maxbuffer/</guid><description>&lt;p&gt;ZooKeeper 사용 시 &amp;ldquo;jute.maxbuffer&amp;quot;라는 설정이 있다. ZooKeeper 클라이언트 또는 서버 측에서 설정 가능하며, 클라이언트 측 설정값은 서버 측보다 낮아야 한다.
클라이언트가 이 설정값보다 큰 데이터를 받으면 오류가 발생한다.&lt;/p&gt;
&lt;p&gt;관련 이슈:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://issues.apache.org/jira/browse/HIVE-21993"&gt;https://issues.apache.org/jira/browse/HIVE-21993&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://issues.apache.org/jira/browse/YARN-2962"&gt;https://issues.apache.org/jira/browse/YARN-2962&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이러한 오류를 방지하기 위해 ZooKeeper에서 다음 지표를 모니터링해야 한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;last_client_response_size&lt;/code&gt; 또는 &lt;code&gt;max_client_response_size&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;client_response_size&lt;/code&gt;는 ZooKeeper 서버에서 클라이언트로의 응답 크기(바이트)다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;last_proposal_size&lt;/code&gt; 또는 &lt;code&gt;max_proposal_size&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;proposal_size&lt;/code&gt;는 ZooKeeper 서버 리더가 팔로워로 보내는 proposal 크기(바이트)다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;proposal&lt;/code&gt;에 대한 자세한 내용은 &lt;a href="https://zookeeper.apache.org/doc/r3.7.1/zookeeperInternals.html"&gt;https://zookeeper.apache.org/doc/r3.7.1/zookeeperInternals.html&lt;/a&gt; 참고.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 값들은 &lt;code&gt;jute.maxbuffer&lt;/code&gt;보다 낮아야 한다. 이 설정은 &lt;code&gt;-Djute.maxbuffer=10485760&lt;/code&gt; (10MB)와 같은 JVM 인자로 설정할 수 있다.&lt;/p&gt;</description></item><item><title>MySQL 사용 시 Hive Metastore 체크리스트</title><link>https://eubnara.github.io/ko/computer-science/hadoop/hivemetastore-mysql/</link><pubDate>Thu, 12 Oct 2023 08:34:00 +0900</pubDate><guid>https://eubnara.github.io/ko/computer-science/hadoop/hivemetastore-mysql/</guid><description>&lt;h1 id="mysql-index"&gt;MySQL Index&lt;/h1&gt;
&lt;p&gt;Hive Metastore가 RDBMS에 메타데이터를 저장/조회할 때 비용이 큰 작업이 있다.&lt;br&gt;
다음은 관련 공식 Hive 패치의 인덱스 생성 SQL이다.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;-- HIVE-21063
CREATE UNIQUE INDEX `NOTIFICATION_LOG_EVENT_ID` ON NOTIFICATION_LOG (`EVENT_ID`) USING BTREE;
-- HIVE-21487
CREATE INDEX COMPLETED_COMPACTIONS_RES ON COMPLETED_COMPACTIONS (CC_DATABASE,CC_TABLE,CC_PARTITION);
-- HIVE-27165
DROP INDEX TAB_COL_STATS_IDX ON TAB_COL_STATS;
CREATE INDEX TAB_COL_STATS_IDX ON TAB_COL_STATS (DB_NAME, TABLE_NAME, COLUMN_NAME, CAT_NAME) USING BTREE;
DROP INDEX PCS_STATS_IDX ON PART_COL_STATS;
CREATE INDEX PCS_STATS_IDX ON PART_COL_STATS (DB_NAME,TABLE_NAME,COLUMN_NAME,PARTITION_NAME,CAT_NAME) USING BTREE;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Hive 업그레이드 시 RDBMS 테이블에 변경사항이 있을 수 있다. 버전별 필요한 SQL은 &lt;a href="https://github.com/apache/hive/tree/master/standalone-metastore/metastore-server/src/main/sql/mysql"&gt;https://github.com/apache/hive/tree/master/standalone-metastore/metastore-server/src/main/sql/mysql&lt;/a&gt; 에서 확인 가능하다.&lt;/p&gt;</description></item><item><title>krb5.conf의 "rdns = false"가 Hadoop 생태계에서 동작하지 않는 사례</title><link>https://eubnara.github.io/ko/computer-science/hadoop/rdns-false-not-work/</link><pubDate>Sun, 02 Jul 2023 18:48:00 +0900</pubDate><guid>https://eubnara.github.io/ko/computer-science/hadoop/rdns-false-not-work/</guid><description>&lt;p&gt;&lt;a href="https://web.mit.edu/kerberos/krb5-1.13/doc/admin/princ_dns.html"&gt;https://web.mit.edu/kerberos/krb5-1.13/doc/admin/princ_dns.html&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;운영 체제 버그로 인해 rdns = false 설정이 reverse DNS lookup을 비활성화하지 못할 수 있다. 일부 GNU libc 버전의 getaddrinfo()는 필요하지 않은 경우에도 PTR 레코드를 조회하는 버그가 있다. MIT Kerberos 릴리스 krb5-1.10.2 이상 및 krb5-1.9.x 시리즈(krb5-1.9.4 이상)에는 이 문제에 대한 해결 방법이 포함되어 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hadoop 생태계에서 krb5.conf의 &amp;ldquo;rdns = false&amp;quot;가 적용되지 않는 경우가 있다. &lt;code&gt;/etc/hosts&lt;/code&gt;를 수정하거나 PTR 레코드를 등록하여 해결할 수 있다.&lt;/p&gt;
&lt;h1 id="1-hivemetastoreclient"&gt;1. HiveMetaStoreClient&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://github.com/apache/hive/blob/rel/release-3.1.3/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java#L246"&gt;https://github.com/apache/hive/blob/rel/release-3.1.3/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java#L246&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (uriResolverHook &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; metastoreURIArray.&lt;span style="color:#a6e22e"&gt;addAll&lt;/span&gt;(uriResolverHook.&lt;span style="color:#a6e22e"&gt;resolveURI&lt;/span&gt;(tmpUri));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; metastoreURIArray.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; URI(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tmpUri.&lt;span style="color:#a6e22e"&gt;getScheme&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tmpUri.&lt;span style="color:#a6e22e"&gt;getUserInfo&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; HadoopThriftAuthBridge.&lt;span style="color:#a6e22e"&gt;getBridge&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;getCanonicalHostName&lt;/span&gt;(tmpUri.&lt;span style="color:#a6e22e"&gt;getHost&lt;/span&gt;()),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tmpUri.&lt;span style="color:#a6e22e"&gt;getPort&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tmpUri.&lt;span style="color:#a6e22e"&gt;getPath&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tmpUri.&lt;span style="color:#a6e22e"&gt;getQuery&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tmpUri.&lt;span style="color:#a6e22e"&gt;getFragment&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;metastore.thrift.uris&lt;/code&gt; 또는 &lt;code&gt;hive.metastore.uris&lt;/code&gt;에서 canonical hostname을 확인하는 로직이 있다. 해결된 hostname이 원하는 대로 나오지 않는다면 다음 가지 해결 방법이 있다.&lt;/p&gt;</description></item><item><title>Hadoop 명령어 모음</title><link>https://eubnara.github.io/ko/computer-science/hadoop/commands/</link><pubDate>Sun, 05 Feb 2023 17:02:26 +0900</pubDate><guid>https://eubnara.github.io/ko/computer-science/hadoop/commands/</guid><description>&lt;h1 id="hdfs"&gt;HDFS&lt;/h1&gt;
&lt;h2 id="재시작-없이-설정-변경-reconfigure"&gt;재시작 없이 설정 변경 (reconfigure)&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html"&gt;https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;재시작 없이 변경 가능한 key는 제한적임&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ hdfs dfsadmin -reconfig namenode nn1.example.com:8020 properties
Node [nn1.example.com:8020] Reconfigurable properties:
dfs.block.placement.ec.classname
dfs.block.replicator.classname
dfs.heartbeat.interval
dfs.image.parallel.load
dfs.namenode.avoid.read.slow.datanode
dfs.namenode.block-placement-policy.exclude-slow-nodes.enabled
dfs.namenode.heartbeat.recheck-interval
dfs.namenode.max.slowpeer.collect.nodes
dfs.namenode.replication.max-streams
dfs.namenode.replication.max-streams-hard-limit
dfs.namenode.replication.work.multiplier.per.iteration
dfs.storage.policy.satisfier.mode
fs.protected.directories
hadoop.caller.context.enabled
ipc.8020.backoff.enable
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>"HADOOP_CLASSPATH" 환경 변수에 대해</title><link>https://eubnara.github.io/ko/computer-science/hadoop/hadoop-classpath/</link><pubDate>Sun, 05 Feb 2023 16:54:58 +0900</pubDate><guid>https://eubnara.github.io/ko/computer-science/hadoop/hadoop-classpath/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/UnixShellGuide.html#HADOOP_CLASSPATH"&gt;https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/UnixShellGuide.html#HADOOP_CLASSPATH&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hadoop 생태계에서 &lt;code&gt;HADOOP_CLASSPATH&lt;/code&gt; 환경 변수는 다양한 곳에서 사용된다. &lt;code&gt;Hive&lt;/code&gt;도 이 변수를 사용한다.
&lt;code&gt;beeline&lt;/code&gt; 같은 스크립트에서 &lt;code&gt;HADOOP_CLASSPATH&lt;/code&gt; 변수가 어떻게 사용되는지 궁금했다. Hive 소스 코드에서는 &lt;code&gt;HADOOP_CLASSPATH&lt;/code&gt; 변수를 찾을 수 없었다.
알고 보니 &lt;code&gt;beeline&lt;/code&gt; 실행 시 &lt;code&gt;hadoop jar&lt;/code&gt; 명령을 사용한다. (&lt;a href="https://github.com/apache/hive/blob/rel/release-3.1.3/bin/ext/beeline.sh#L35"&gt;https://github.com/apache/hive/blob/rel/release-3.1.3/bin/ext/beeline.sh#L35&lt;/a&gt;)
이때 &lt;code&gt;RunJar.java&lt;/code&gt;가 사용되며, 여기서 &lt;code&gt;HADOOP_CLASSPATH&lt;/code&gt;가 &lt;code&gt;CLASSPATH&lt;/code&gt; 설정에 사용된다. (&lt;a href="https://github.com/apache/hadoop/blob/rel/release-3.3.4/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/RunJar.java#L347-L351"&gt;https://github.com/apache/hadoop/blob/rel/release-3.3.4/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/RunJar.java#L347-L351&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Hadoop 생태계에서 &lt;code&gt;RunJar#main&lt;/code&gt;을 사용하는 경우, 대부분 &lt;code&gt;HADOOP_CLASSPATH&lt;/code&gt; 환경 변수를 따르게 된다.&lt;/p&gt;</description></item><item><title>SPNEGO 활성화 Hadoop DataNode가 Kerberos "replay attack"을 오판하는 문제</title><link>https://eubnara.github.io/ko/computer-science/hadoop/spnego-request-is-a-replay/</link><pubDate>Sun, 05 Feb 2023 16:01:17 +0900</pubDate><guid>https://eubnara.github.io/ko/computer-science/hadoop/spnego-request-is-a-replay/</guid><description>&lt;ul&gt;
&lt;li&gt;참고
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.cloudera.com/cloudera-manager/7.5.5/security-troubleshooting/cm-security-troubleshooting.pdf"&gt;https://docs.cloudera.com/cloudera-manager/7.5.5/security-troubleshooting/cm-security-troubleshooting.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://search-guard.com/elasticsearch-kibana-kerberos/"&gt;https://search-guard.com/elasticsearch-kibana-kerberos/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hadoop 데몬(NameNode, DataNode, JournalNode, ResourceManager, NodeManager 등)이 동일한 kerberos keytab(&lt;code&gt;/etc/security/keytabs/spnego.service.keytab&lt;/code&gt;)과 principal(&lt;code&gt;HTTP/_HOST@{REALM}&lt;/code&gt;)을 공유하기 때문에 발생하는 문제로 추정된다. 특정 상황에서 DataNode가 이를 replay attack으로 오판한다.&lt;/p&gt;
&lt;p&gt;다음 JVM 시스템 속성을 Hadoop 데몬에 추가하면 해결된다. Java 프로세스가 replay cache를 사용하지 않게 된다.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;-Dsun.security.krb5.rcache=none
&lt;/code&gt;&lt;/pre&gt;</description></item></channel></rss>