하이브 Hive

[Hive] Hive를 설치하고 데이터 로드 후 쿼리를 해보자

sseozytank 2024. 5. 17.

우분투에서 Hive를 설치하고, Postgres로 연결한 후 사용해보도록 하자. 우선 Hive 설치 부터 시작하기.  (。•̀ᴗ-)✧ 

(Tez는 나중에!) 

 

Linux Ubuntu 22.05.4

Hadoop 3.3.4 

 

⭐참고 자료⭐

Hive 설치하기 https://spidyweb.tistory.com/215
Hive 사용해보기 AWS : HDFS로 데이터 로드

 

⭐같이 보면 좋은 자료들⭐

Hadoop 설치하기 https://sseozytank.tistory.com/78
Linux VI 사용 방법 https://sseozytank.tistory.com/77

 

1. Hive 설치하기 

(1) Hive 설치

https://dlcdn.apache.org/hive 접속 후, 원하는 버전의 bin.tar.gz 에 오른쪽 마우스 -> 링크 주소 복사 

 

나는 3.1.3을 받아줄 것이다! 

wget https://dlcdn.apache.org/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz

 

다운로드 받은 파일을 압축 해제

tar xzf apache-hive-3.1.3-bin.tar.gz

 

 

(2) 환경변수 설정 

1.환경변수 설정

vi ~/.bashrc

아래 코드 추가하기 

export HIVE_HOME="/home/user/apache-hive-3.1.3-bin" #***경로 수정 필요 
export PATH=$PATH:$HIVE_HOME/bin

 

2.HDFS와 hive의 상호작용을 위한 설정 

vi $HIVE_HOME/bin/hive-config.sh

아래 코드 추가하기

export HADOOP_HOME=/home/tempx/hadoop-3.3.4

 

(3) HDFS에 관련 디렉토리 생성 

하둡이 실행중인 상태여야 한다. 

hdfs dfs  –mkdir /hive
hdfs dfs -chmod g+w /hive
hdfs dfs -mkdir –p /user/hive/warehouse 
hdfs dfs -chmod g+w /user/hive/warehouse

 

 

(4) property 추가 

cd $HIVE_HOME/conf
cp hive-default.xml.template hive-site.xml
vi hive-site.xml

아래 코드 추가하기

<property>
  <name>system:java.io.tmpdir</name> 
  <value>/tmp/hive/java</value> 
</property> 

<property> 
  <name>system:user.name</name> 
  <value>${user.name}</value> 
</property>

 

 

(5) javax.jdo 수정 

vi $HIVE_HOME/conf/hive-site.xml

vi에서 , esc -> /javax.jdo.option.ConnectionURL 엔터로 검색하면 되고, 한 번에 안나오면 N 을 누르면서 찾으면 된다. 다 찾으면 a눌러서 아래 처럼 수정해주기 

#본인 경로로 수정
jdbc:derby:/home/hdoop/apache-hive-3.1.3-bin/metastore_db;databaseName=metastore_db;create=true

 

대충 설명하자면, 초기에 데이터 베이스가 존재하지 않을 때, 해당 이름의 데이터베이스를 생성하도록 지시하는 옵션이다.

Hive나 다른 어플리케이션이 초기 설정 단계에서 데이터베이스가 존재하지 않을 경우를 대비하여 새로운 데이터베이스를 생성하는 것 

 

 

(6) derby database 시작 

 $HIVE_HOME/bin/schematool -initSchema -dbType derby

 

⛔ 오류 발생1. java.lang.NoSuchMethodError 

hadoop과 hive의 guava version 호환성 문제다 

 

1.확인하는 방법 

ls $HIVE_HOME/lib
#guava 버전 19.0 

ls ~/hadoop-3.3.4/share/hadoop/hdfs/lib
#guava 버전 27.0

 

2.해결 방법 

- hive guava를 삭제하고 하둡의 guava를 복사해주자 

rm ~/apache-hive-3.1.3-bin/lib/guava-19.0.jar
cp $HADOOP_HOME/share/hadoop/hdfs/lib/guava-27.0-jre.jar $HIVE_HOME/lib/

 

 

⛔ 오류 발생2. Illegal character entity: expanstion character 

 

에러문 중간에 보면 row와 대상 파일이 적혀져 있다. hive-site.xml에 이상한 문자가 있다는 뜻 

 

해결하기 

vi $HIVE_HOME/conf/hive-site.xml

esc  이후 :3215 (대상 row 번호) 하면 그부분으로 가진다. 엔터 누르고 이상한 특수문자가 있는 부분 삭제해주기 

&#8;를 삭제했다.

 

이렇게 두가지 오류를 해결해주고 아래 코드를 입력해주자.

 $HIVE_HOME/bin/schematool -initSchema -dbType derby

성고옹~

 

(7) hive 실행

hive

 

 

2. 데이터 로드 후 간단한 쿼리를 실행해보자 

(1) 샘플 데이터 다운로드 

wget https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/samples/features.zip
unzip features.zip
head features.txt

 

(2) Hive 실행 후 Hive 테이블 생성 

hive
CREATE TABLE hive_features
    (feature_id             BIGINT,
    feature_name            STRING ,
    feature_class           STRING ,
    state_alpha             STRING,
    prim_lat_dec            DOUBLE ,
    prim_long_dec           DOUBLE ,
    elev_in_ft              BIGINT)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '|'
    LINES TERMINATED BY '\n';

 

(3) 데이터 로드 

LOAD DATA
LOCAL
INPATH './features.txt'
OVERWRITE
INTO TABLE hive_features;

 

(4) 쿼리 실행

쿼리를 실행해보자 그런데 얘는 되는데

SELECT * FROM hive_features;

 

나는 얘는 안됐다 ㅠ.ㅠ 

SELECT state_alpha, COUNT(*)
FROM hive_features
GROUP BY state_alpha;

 

⛔ Number of reduce tasks not specified. Estimated from input data size: 1 

Hadoop job information for Stage-1: number of mappers: 0; number of reducers: 0
2024-05-16 10:43:38,209 Stage-1 map = 0%, reduce = 0%

 

1.로그 찾아서 에러 원인 확인 히스토리 

더보기

콘솔 출력 오류만 보면 무슨 오륜지 알 수 없다고 한다.  (stack overflow)  로그를 찾아야한다. 

namenode:8088 Web UI에 접속해서 history를 파악해보자 .

 

1.메인에서 해당 application 클릭 

 

 

2.상세 로그 확인 

 

2024-05-16 13:35:13,984 ERROR [main] org.apache.hadoop.mapreduce.v2.app.MRAppMas ter: Error starting MRAppMaster
org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Error while initializing
at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.serviceInit(MRAppMaste r.java:368)
at org.apache.hadoop.service.AbstractService.init(AbstractService.java:1 64)
at org.apache.hadoop.mapreduce.v2.app.MRAppMaster$6.run(MRAppMaster.java :1760)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInforma tion.java:1878)
at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.initAndStartAppMaster( MRAppMaster.java:1757)
at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.main(MRAppMaster.java: 1691)
Caused by: org.apache.hadoop.fs.UnsupportedFileSystemException: No FileSystem fo r scheme "hdfs"
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:34 43)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:3466 )
at org.apache.hadoop.fs.FileSystem.access$300(FileSystem.java:174)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:357 4)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:3521)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:540)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:288)
at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.getFileSystem(MRAppMas ter.java:605)
at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.serviceInit(MRAppMaste r.java:315)
... 7 more
2024-05-16 13:35:13,985 INFO [main] org.apache.hadoop.util.ExitUtil: Exiting wit h status 1: org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Error while initializing

 

HDFS를 인식하지 못하고 있는 상황이라고 한다. 그럼 이제 Number of reduce tasks not specified. 이거에 대한 솔루션을 찾는게 아니라 No FileSystem fo r scheme "hdfs에 대한 솔루션을 찾아야한다. 

 

2.해결 방법 

 

Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster

Contents of mapred-site.xml : <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <na...

stackoverflow.com

 

 

mapred-site.xml을 편집해서 속성을 추가해주어야 한다. 일단 이렇게 4개를 추가해준다.

<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>

<property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=/home/user/hadoop-3.3.4</value> </property>

<property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=/home/user/hadoop-3.3.4</value> </property>

<property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=/home/user/hadoop-3.3.4</value> </property>

 

5번째 속성은 추가 하기 전 

export HADOOP_CLASSPATH=$(hadoop classpath)

echo $HADOOP_CLASSPATH

를 통해 출력된 

/home/tempx/hadoop-3.3.4/etc/hadoop:/home/tempx/hadoop-3.3.4/share/hadoop/common/lib/*:/home/tempx/hadoop-3.3.4/share/hadoop/common/*:/home/tempx/hadoop-3.3.4/share/hadoop/hdfs:/home/tempx/hadoop-3.3.4/share/hadoop/hdfs/lib/*:/home/tempx/hadoop-3.3.4/share/hadoop/hdfs/*:/home/tempx/hadoop-3.3.4/share/hadoop/mapreduce/*:/home/tempx/hadoop-3.3.4/share/hadoop/yarn:/home/tempx/hadoop-3.3.4/share/hadoop/yarn/lib/*:/home/tempx/hadoop-3.3.4/share/hadoop/yarn/*

 

이 부분들을 복사해서 여기 <value></value>사이에 넣어준다. 

<property> <name>mapreduce.application.classpath</name> <value></value> </property>
<property> 
	<name>mapreduce.application.classpath</name>
    <value>/home/tempx/hadoop-3.3.4/etc/hadoop:/home/tempx/hadoop-3.3.4/share/hadoop/common/lib/*:/home/tempx/hadoop-3.3.4/share/hadoop/common/*:/home/tempx/hadoop-3.3.4/share/hadoop/hdfs:/home/tempx/hadoop-3.3.4/share/hadoop/hdfs/lib/*:/home/tempx/hadoop-3.3.4/share/hadoop/hdfs/*:/home/tempx/hadoop-3.3.4/share/hadoop/mapreduce/*:/home/tempx/hadoop-3.3.4/share/hadoop/yarn:/home/tempx/hadoop-3.3.4/share/hadoop/yarn/lib/*:/home/tempx/hadoop-3.3.4/share/hadoop/yarn/* </value> 
</property>

 

이렇게 ! 이제 하둡 재가동 후 hive에서 같은 쿼리를 치면 값이 성공적으로 출력된다. 

 

 

⛔ info가 너무 많이 출력돼서 불편해요 

https://stackoverflow.com/questions/67703454/disable-info-logs-in-hive

vi $HIVE_HOME/conf/hive-site.xml

 

여기서 이부분을 false로 바꿔주면 된다. 

<name>hive.async.log.enabled</name>
<value>false</value>

 

⛔ 처음엔 됐는데 갑자기 hive 재가동 시 오류가 왕마니 떠요 ㅠ ....

ogging initialized using configuration in jar:file:/home/tempx/apache-hive-3.1.3-bin/lib/hive-common-3.1.3.jar!/hive-log4j2.properties Async: false Exception in thread "main" java.lang.RuntimeException: org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create directory /tmp/hive/tempx/9d85ad63-5a81-4853-bd0f-5419b1088307. Name node is in safe mode. The reported blocks 2694 has reached the threshold 0.9990 of total blocks 2694. The minimum number of live datanodes is not required. In safe mode extension. Safe mode will be turned off automatically in 9 seconds. NamenodeHostName:localhost at 해당 오류 발생 시 

 

안전모드를 해제해주면 된다. 

hdfs dfsadmin -safemode leave

 

 

댓글