우분투에서 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 번호) 하면 그부분으로 가진다. 엔터 누르고 이상한 특수문자가 있는 부분 삭제해주기
이렇게 두가지 오류를 해결해주고 아래 코드를 입력해주자.
$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.해결 방법
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
댓글