2021년 3월 21일 일요일

[ Hive ] Phoenix에 연동하는 External Hive Table 생성시 오류 (NoSuchColumnFamilyException)


[ 에러메세지 ]

  • Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException: Column family table does not exist in region hbase:meta,,1.1588230740 in table 'hbase:meta', {TABLE_ATTRIBUTES => {IS_META => 'true', REGION_REPLICATION => '1', coprocessor$1 => '|org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint|536870911|'}, {NAME => 'info', BLOOMFILTER => 'NONE', VERSIONS => '3', IN_MEMORY => 'true', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', CACHE_DATA_IN_L1 => 'true', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '8192', REPLICATION_SCOPE => '0'} at org.apache.hadoop.hbase.regionserver.HRegion.checkFamily(HRegion.java:8420) at org.apache.hadoop.hbase.regionserver.HRegion.get(HRegion.java:7398) at org.apache.hadoop.hbase.regionserver.RSRpcServices.get(RSRpcServices.java:2269) at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:36800) at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2399) at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:124) at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:311) at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:291) )



[ 원인 ]

CDH Hbase와 EMR Hbase 버전이 맞지 않아 생긴 오류

CDH Hbase-2.1, EMR-Hbase.1.4 



[ 해결 ]

1. Hbase버전 싱크를 맞춘다.

2. Hive to Phoenix를 다른 어플리케이션을 이용한다.



[ Hive ] Serde가 적용된 Hive테이블 컬럼 추가&변경


Hive Table Column Add는 Table에 서데가 적용되어 있으면 수행할 수 없다.

Column Replace 또한 마찬가지.


1. 새로운 스키마로 Hive Table을 만든다.


2-1. 기존에 있던 파티션을 새 Table의 파티션으로 수정한다.

Ex. Alter Table [테이블명] Partition (yymmdd='20210321') Set Location 'hdfs://127.0.0.1/user';


2-2. 새 테이블의 빈 파티션을 생성한 후, 기존 테이블의 서데파일(000000_0)을 새 테이블 파티션 위치로 옮긴다. 

Ex. sudo -u hdfs hdfs -dfs cp /user/hive/old../ /user/hive/new..../ 




그외 유용한 커멘드


* 테이블 정보 위치 확인

desc formatted [Table Name];


*테이블 파티션 리스트확인

show partitions [Table Name];


* 새 파티션 추가

Alter Table [Table Name] Add Partition (yymmdd='20210321');


* 파티션 LOCATION 수정

Alter Table [테이블명] Partition (yymmdd='20210321') Set Location 'hdfs://127.0.0.1/user';


* 파티션 삭제

Alter Table [Table Name] Drop Partition (yymmdd'20210321');


2021년 3월 14일 일요일

[ Scala ] 스칼라 프로젝트 개발환경설정


[ IntelliJ ]

1. File->settings->plugin 에서 scala검색 후 설치

2. File->New Project->Maven->Next->설정값입력 후 Maven프로젝트 생성

3. pom.xml에 아래와 같이 추가

<dependencies>

<!-- scala -->
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.12.4</version>
</dependency>
<dependency>
<groupId>org.scala-lang.modules</groupId>
<artifactId>scala-xml_2.12</artifactId>
<version>1.0.6</version>
</dependency>

<!-- spark -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>2.4.7</version>
</dependency>
   <dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.12</artifactId>
<version>2.4.7</version>
</dependency>

</dependencies>


4. 프로젝트 우클릭 -> Add Framework Support... -> scala SDK다운 및 적용 


5. 특정폴더에 hadoop/bin 만들고 winutils.exe넣기 -> window hadoop환경설정


6. 제어판의 시스템속성에 

변수 - HADOOP_HOME = hadoop

PATH - %HADOOP_HOME%\bin

추가


[ Eclipse ]

잘나와있는 URL 참고 :

https://alphahackerhan.tistory.com/8


Apache Phoenix - EMR Phoenix 설정(NamespaceMapping)


EMR Phoenix사용중에 같은 테이블명의 QA환경, 개발환경을 구현해야 할 때가 있다.

Phoenix 스키마를 사용하여 

  • QA.TEST_TABLE
  • DEV.TEST_TABLE

과 같이 구분시킨다.



[ 1 ]

위와 같이 사용하기 위해선 네임스페이스 관련 hbase-site.xml설정을 해야하는데

Hbase의 Master, Region서버 모두 설정값을 수정한다.


sudo vi /usr/lib/hbase/conf/hbase-site.xml 

[ 네임스페이스 관련 ]

  <property>
    <name>phoenix.schema.isNamespaceMappingEnabled</name>
    <value>true</value>
  </property>

  <property>
    <name>phoenix.schema.mapSystemTablesToNamespace</name>
    <value>true</value>
  </property>


[ 성능관련 ]
  <property>
    <name>phoenix.functions.allowUserDefinedFunctions</name>
    <value>true</value>
  </property>

  <property>
    <name>phoenix.query.maxServerCacheBytes</name>
    <value>2097152000</value>
  </property>

  <property>
    <name>phoenix.mutate.maxSize</name>
    <value>20000000</value>
  </property>

  <property>
    <name>phoenix.mutate.batchSize</name>
    <value>10000</value>
  </property>




[ 2 ]

설정값 변경 후 서비스를 재시작한다.

systemctl --type=service | grep hbase (서비스이름확인)

sudo systemctl restart hbase-master.service (마스터노드에서)

sudo systemctl restart hbase-region.service (리전노드에서 )

sudo systemctl restart phoenix-queryserver.service (마스터노드에서)





[ 에러 ]

ERROR: SYSTEM.MUTEX is disabled.

or

AvaticaClientRuntimeException: Remote driver error: RuntimeException: org.apache.phoenix.exception.PhoenixIOException: SYSTEM:CATALOG -> PhoenixIOException: SYSTEM:CATALOG -> TableNotFoundException: SYSTEM:CATALOG. Error -1 (00000) null

과 같은 에러메세지가 쿼리서버에서 나타나면 주키퍼 Znode를 최신화시켜주어야한다.


bin/hbase clean --cleanZk 

명령어 이후 [2]와 같이 서비스를 재시작한다.






2021년 3월 9일 화요일

[ Algorithm ] 위장 - Hash


문제 ]

스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.

예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.

종류이름
얼굴동그란 안경, 검정 선글라스
상의파란색 티셔츠
하의청바지
겉옷긴 코트

스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

제한사항

  • clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
  • 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
  • 같은 이름을 가진 의상은 존재하지 않습니다.
  • clothes의 모든 원소는 문자열로 이루어져 있습니다.
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
  • 스파이는 하루에 최소 한 개의 의상은 입습니다.

입 출력 예

CLOTHESRETURN
[[yellow_hat, headgear], [blue_sunglasses, eyewear], [green_turban, headgear]]5
[[crow_mask, face], [blue_sunglasses, face], [smoky_makeup, face]]3



제출 ]

import java.util.*;

class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;
        Map<String, Integer> clothesMap = new HashMap<>(); // 종류 : 갯수
        
        //의상을 키값으로 의상당 종류수 카운트
        for (int i = 0; i < clothes.length; i++) {
            clothesMap.put(clothes[i][1], clothesMap.getOrDefault(clothes[i][1], 0)+1);
        }
        
        // 경우의 수 체크 
        for (int val : clothesMap.values()){
            answer *= (val+1);
        }
        // 모두 다 안입는 경우는 존재하지 않으므로 -1
        return answer-1;
    }
}



풀이 ]

getOrDefault(Object key, V DefaultValue) 를 사용하여 

종류를 키값으로 종류당 의상 수를 벨류값으로 맵 자료형을 선언한다. 

경우의 수를 체크하고 제한사항에 모두 안입는 경우는 없다고하니

결과값에 -1을 해준다.



2021년 3월 8일 월요일

[ Algorithm ] 전화번호 목록 - Hash


문제]

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.

전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421
제한 사항
  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
  • 각 전화번호의 길이는 1 이상 20 이하입니다.

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

 

https://programmers.co.kr/learn/courses/30/lessons/42577?language=java



제출1]

import java.util.*;

class Solution {
    public boolean solution(String[] phone_book) {

        boolean answer = true;
        Arrays.sort(phone_book, Comparator.comparing(String::length));
        
        for(int i=0;i<phone_book.length-1;i++) {
            for(int j=i+1;j<phone_book.length;j++){
                if(phone_book[j].startsWith(phone_book[i]))    
                    return false;
            }    
        }
        
        return answer;
    }
}

->런타임에러



해쉬맵 자료형을 이용한 풀이

제출2]

import java.util.*;

class Solution {
    public boolean solution(String[] phone_book) {

        boolean answer = true;
        HashMap<String, String> hm = new HashMap<String, String>();
        
        for(int i=0;i<phone_book.length;i++)
            hm.put(phone_book[i],i);

        for(String key : hm.keySet()){
            for(int idx=0;idx<key.length();idx++){
                if(hm.containsKey(key.substring(0,idx)))
                    return false;
            }    
        }
        
        return answer;  
    }
}


2021년 3월 5일 금요일

Apache Hue - Hbase Table 안보일 시

 

[ Error Message ]

HUE HBASE API ERROR: TSOCKET READ 0 BYTES


[ 해결 ]

hbase.regionserver.thrift.http = enable 로 설정