요즘 AI에 관심을 가지게 되면서 이런저런 툴들을 사용해보고 있는데요. 


그중에서도 매우 괜찮다고 느낀 Claude에 실시간 웹 검색과 강력한 추론 능력을 추가하는 방법을 알려드리겠습니다.

MCP 프로토콜을 활용한 Tavily + Think 조합으로 Claude를 더 똑똑하게 사용하는 방법입니다. 

MCP란?

MCP(Model Context Protocol)는 Anthropic이 개발한 오픈 프로토콜입니다.

AI와 외부 도구를 연결하는 표준 인터페이스입니다.

 

Claude는 2023년 12월까지의 정보만 알고 있습니다.

그래서 최신 정보에 답이 어렵고 복잡한 단계별 추론도 부족했습니다.

이런 부족한 부분을 보완하기 위해서 외부 도구와 연결해 최신 정보를 가져올 수 있도록 할 수 있습니다.

Tavily + Think + Claude 조합

이 조합의 역할을 살펴보겠습니다:

  1. Tavily: 실시간 웹 검색과 콘텐츠 추출 MCP 서버입니다.
  2. Think: Claude의 추론 능력을 강화하는 MCP 서버입니다.
  3. Claude: 이 MCP 서버들과 연결되는 AI 비서입니다.

장점

  • 최신 정보: Tavily로 뉴스, 날씨, 주가 등 실시간 정보를 검색합니다.
  • 정확한 추론: Think로 복잡한 문제도 단계별로 접근합니다.
  • 통합 서비스: 검색과 추론을 함께 활용합니다.
  • 맞춤형 분석: 특정 주제 정보를 검색하고 분석합니다.

 

설치 튜토리얼

1. 준비물

  • Claude Desktop 앱(최신 버전)
  • Node.js
  • Tavily API 키
  • 터미널/명령 프롬프트

2. Tavily API 키 받기

  1. Tavily 사이트에서 가입합니다.
  2. 대시보드에서 API 키를 만듭니다.
  3. 키를 복사해 보관합니다.

3. Tavily MCP 서버 설정

Claude Desktop 설정 파일을 엽니다.

Mac:

touch "$HOME/Library/Application Support/Claude/claude_desktop_config.json"
vi "$HOME/Library/Application Support/Claude/claude_desktop_config.json"

 

파일에 다음 내용을 추가합니다.

{
  "mcpServers": {
    "tavily-mcp": {
      "command": "npx",
      "args": ["-y", "tavily-mcp@0.2.0"],
      "env": {
        "TAVILY_API_KEY": "여기에_API_키_입력"
      },
      "disabled": false,
      "autoApprove": []
    }
  }
}

4. Think MCP 서버 설정

위 설정 파일에 Think 서버도 추가합니다.

{
  "mcpServers": {
    "tavily-mcp": {
      // 기존 설정 유지
    },
    "think-tool": {
      "command": "npx",
      "args": ["-y", "@cgize/mcp-think-tool"],
      "type": "stdio",
      "pollingInterval": 30000,
      "startupTimeout": 30000,
      "restartOnFailure": true
    }
  }
}

 

전체 설정은 이렇게 됩니다.

{
  "mcpServers": {
    "tavily-mcp": {
      "command": "npx",
      "args": ["-y", "tavily-mcp@0.2.0"],
      "env": {
        "TAVILY_API_KEY": "여기에_API_키_입력"
      },
      "disabled": false,
      "autoApprove": []
    },
    "think-tool": {
      "command": "npx",
      "args": ["-y", "@cgize/mcp-think-tool"],
      "type": "stdio",
      "pollingInterval": 30000,
      "startupTimeout": 30000,
      "restartOnFailure": true
    }
  }
}

5. 적용하기

  1. 파일 저장
  2. Claude Desktop을 재시작
  3. 연결 상태를 확인

Mac 로그 확인

tail -n 20 -f ~/Library/Logs/Claude/mcp*.log

 

사용 예시

Tavily 검색 활용

단순한 최신 사실 검색도 클로드만을 사용할 수 있습니다.

  • "오늘 뉴스 알려줘"
  • "오늘 날씨 어때?"
  • "AI 기술 트렌드 검색해줘"

Think 도구 활용

아래와 같이 복잡한 문제도 물어볼 수 있습니다.

  • "Think 도구로 이 경영 전략 분석해줘: [문제]"
  • "Think 도구로 이 수학 문제 풀어줘: [문제]"

두 도구 조합하기

아래와 같은 검색, 정리와 같은 복합 기능도 가능합니다.

  • "비트코인 시세 검색하고 향후 전망 분석해줘"
  • "수원 맛집 검색하고 내 취향에 맞는 곳 추천해줘"

 

활용 팁

  1. 검색 최적화:
    • 짧고 명확한 검색어 사용
    • 특정 URL 분석은 "tavily-extract 도구로 [URL] 분석해줘"
  2. Think 도구 활용:
    • 복잡한 문제는 단계별로 나누기
    • "단계별로 생각해줘" 요청하기
  3. 업데이트:
    • MCP 서버 버전을 최신으로 유지하기

 

마치며

Tavily + Think + Claude 조합으로 더 스마트하게 Claude를 사용할 수 있었습니다. 

요즘처럼 정보가 많아 너무 많은 검색이 필요로 할 때 구글을 여러번 검색하는게 아닌, 한번의 검색으로 원하는 결과를 얻을 수 있는 부분이 저에겐 흥미로웠습니다. 

 

여러분의 경험과 다른 유용한 MCP 조합도 댓글로 공유해주세요.ᐟ

 

 

참고 자료

반응형

GraphQL 플레이 그라운드는 GraphiQL, Altair 등이 있다.

GraphiQL UI가 마음에 안들기도 하고, 기존에 Altair를 사용하고 있었어서 GraphQL 서버를 개발하면서 Altair 붙이는 것 부터 작업을 시작했는데, 여기서 부터 막혀버렸다.

 

build.gradle.kts

implementation("com.graphql-java-kickstart:altair-spring-boot-starter:11.1.0")

application.yml

graphql:
  altair:
    enabled: true
    mapping: /altair
    options:
      endpoint-url: /graphql

위와 같이 설정을 해도 아래와 같이 404 No static resource altair. 오류가 발생했다

Dependency는 잘 걸린 것 같은데 아래의 Altair static 파일들을 가져오지 못해서 발생하는 문제 같았다.

한참을 삽질하다가 구글링으로 두가지 해결 방법을 찾았다.

 

property 설정으로 해결

static 리소스는 CDN으로 전달되어서 application.yaml 에 cdn 설정을 추가하면 된다.

   graphql:
     altair:
       enabled: true
       mapping: /altair
       cdn:
         enabled: true
         version: 4.0.2
       options:
         endpoint-url: /graphql

Configuration

직접 static 리소스 파일의 위치를 WebMvcConfigurationSupport에 추가한다.

@Configuration
class GraphQlConfig : WebMvcConfigurationSupport() {
    override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
        registry.addResourceHandler("/vendor/**")
            .addResourceLocations("classpath:/static/vendor/")
    }
}

altair-spring-boot-starter에서 CDN 설정을 제공해주니 property 설정으로 해결하는게 좋다고 판단하고 해당 방법으로 문제를 해결했다.

 

참고

반응형

카프카 브로커를 추가하는 과정에서 기존 카프카 브로커도 재기동을 해야했는데 실패했다.  

$ sudo systemctl list-units
  UNIT                                                              LOAD   ACTIVE SUB       DESCRIPTION
...
● confluent-kafka.service                                           loaded failed failed    Apache Kafka - broker
...

흑흑 왜 내가 건들기만 하면 실패일까ㅠㅠ

 

일단 해결을 봐야하니까 로그를 뒤져봐야 한다.

어플리케이션이 제대로 안떠서인지 systemctl 로그에서도, log 디렉토리에서도 별다른 로그를 확인할 수 없었다 ‼️ ‼️ ‼️

$ sudo systemctl status confluent-kafka.service
● confluent-kafka.service - Apache Kafka - broker
   Loaded: loaded (/usr/lib/systemd/system/confluent-kafka.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Mon 2022-08-01 14:15:14 JST; 41min ago
     Docs: http://docs.confluent.io/
  Process: 18770 ExecStart=/usr/bin/kafka-server-start /etc/kafka/server.properties (code=exited, status=1/FAILURE)
 Main PID: 18770 (code=exited, status=1/FAILURE)

Aug 01 14:15:14  kafka-server-start[18770]: [2022-08-01 14:15:14,332] INFO Session: 0x2000046df81009f closed (org.apache.zookeeper.ZooKeeper)
Aug 01 14:15:14  kafka-server-start[18770]: [2022-08-01 14:15:14,332] INFO EventThread shut down for session: 0x2000046df81009f (org.apache.zookeeper.ClientCnxn)
Aug 01 14:15:14  kafka-server-start[18770]: [2022-08-01 14:15:14,333] INFO [ZooKeeperClient Kafka server] Closed. (kafka.zookeeper.ZooKeeperClient)
Aug 01 14:15:14  kafka-server-start[18770]: [2022-08-01 14:15:14,337] INFO shut down completed (kafka.server.KafkaServer)
Aug 01 14:15:14  kafka-server-start[18770]: [2022-08-01 14:15:14,337] INFO Shutting down SupportedServerStartable (io.confluent.support.metrics.SupportedServerStartable)
Aug 01 14:15:14  kafka-server-start[18770]: [2022-08-01 14:15:14,338] INFO Shutting down KafkaServer (io.confluent.support.metrics.SupportedServerStartable)
Aug 01 14:15:14  kafka-server-start[18770]: [2022-08-01 14:15:14,338] INFO shutting down (kafka.server.KafkaServer)
Aug 01 14:15:14  systemd[1]: confluent-kafka.service: main process exited, code=exited, status=1/FAILURE
Aug 01 14:15:14  systemd[1]: Unit confluent-kafka.service entered failed state.
Aug 01 14:15:14  systemd[1]: confluent-kafka.service failed.

 

뭐라도 남아있을 것 같은 시스템 로그를 뒤져보자.

$ sudo tail -n 100 /var/log/messages
...
Aug  1 14:15:13 kafka-n-zk004 kafka-server-start[18770]: [2022-08-01 14:15:13,936] INFO [ZooKeeperClient Kafka server] Connected. (kafka.zookeeper.ZooKeeperClient)
Aug  1 14:15:14 kafka-n-zk004 kafka-server-start[18770]: [2022-08-01 14:15:14,211] INFO Cluster ID = VzmDpBaoQzujg-IR751OLg (kafka.server.KafkaServer)
// 여기가 중요!!!
Aug  1 14:15:14 kafka-n-zk004 kafka-server-start[18770]: [2022-08-01 14:15:14,222] ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
Aug  1 14:15:14 kafka-n-zk004 kafka-server-start[18770]: kafka.common.InconsistentClusterIdException: The Cluster ID VzmDpBaoQzujg-IR751OLg doesnt match stored clusterId Some(wzYRAL0ARymSpG3SY2kV7A) in meta.properties. The broker is trying to join the wrong cluster. Configured zookeeper.connect may be wrong.
Aug  1 14:15:14 kafka-n-zk004 kafka-server-start[18770]: at kafka.server.KafkaServer.startup(KafkaServer.scala:220)
Aug  1 14:15:14 kafka-n-zk004 kafka-server-start[18770]: at io.confluent.support.metrics.SupportedServerStartable.startup(SupportedServerStartable.java:114)
Aug  1 14:15:14 kafka-n-zk004 kafka-server-start[18770]: at io.confluent.support.metrics.SupportedKafka.main(SupportedKafka.java:66)
...
Aug  1 14:15:14 kafka-n-zk004 systemd[1]: confluent-kafka.service: main process exited, code=exited, status=1/FAILURE
Aug  1 14:15:14 kafka-n-zk004 systemd[1]: Unit confluent-kafka.service entered failed state.
Aug  1 14:15:14 kafka-n-zk004 systemd[1]: confluent-kafka.service failed.

 

문제 발견

ERROR 로 직힌 로그 확인해보면 `meta.properties`에 Cluster ID 가 잘못되었다고 나온다.

Cluster ID 값으로 VzmDpBaoQzujg-IR751OLg 를 사용하려고 하는데 meta.properties 의 값인 wzYRAL0ARymSpG3SY2kV7A 와 일치하지 않아서 실행할 수 없다는 것 같다.

 

해결 방법

  1. meta.properties 파일을 삭제한다.
  2. meta.properties 파일의 cluster.id 값을 수정한다. (wzYRAL0ARymSpG3SY2kV7A -> VzmDpBaoQzujg-IR751OLg)  
$ cat meta.properties
cluster.id=wzYRAL0ARymSpG3SY2kV7A
version=0
broker.id=0

위의 두가지 방법 중 하나를 선택해서 진행한 후 다시 카프카 서버를 실행시킨다.  
meta.properties 파일은 kafka 설정파일(server.properties)의 log.dirs 값인 path 하위에 존재한다.

 

 

반응형

개요

Intellij로 Maven 기반의 Java 어플리케이션을 생성한 후 기본적인 설정을 마치고 실행해보니 `Error:java: error: release version 5 not supported` 에러가 발생했다.

요즘같은 시대에 무슨 5 버전인가 하여 Java 의 버전 문제일 것이라고는 생각도 못해서 고려를 안해보았는데 구글링해보니 비슷한 이슈가 많은 듯 하여 정리해본다.


해결방법

지금까지 Gradle만 사용해봐서 해당 이슈를 경험한 적이 없었던 것이었다. Intellij에서 maven 프로젝트를 생성하면 기본적으로 Java 1.5 버전으로 설정한다. 그래서 프로젝트의 컴파일과 관련된 버전들을 모두 추가로 세팅해주어야 한다.  

 

  • Preference > Build, Execution, Deployment > Compiler > Java Compiler 메뉴에 들어가 해당 모듈의 타겟 버전을 default 인 1.5버전을 클릭해 원하는 버전으로 변경해준다.  
  • File > Project Structure > Language level 을 기본 세팅되어 있는 5를 클릭해 원하는 버전으로 변경해준다.  

-끗-

반응형

'Dev > Java' 카테고리의 다른 글

MacOS Java11 버전 업그레이드  (0) 2021.02.27
[Java] 용어정리.zip  (0) 2020.09.29
[Java] Stateless Object  (0) 2020.04.11

개요

모든 파일을 add하여 stage 상태로 변경하고 -m 옵션을 이용해 커밋하여 불필요한 파일까지 커밋하는 경험이 자주 있었다.
이런 경우 불필요한 파일을 Staging Area에서 삭제하여 필요한 변경 내역만 커밋하는 방법을 정리하려 한다.

용어 정리

Git의 파일 상태 관리

Git은 init된 순간부터 디렉토리의 모든 파일을 아래의 상태들로 분류하여 관리한다.

  • Tracked : 관리 대상 파일, 한번이라도 스냅샷에 포함되면 tracked 파일이 됨
    • Staged : 커밋으로 저장소에 기록할 상태
    • Unmodified : 마지막 스냅샷 이후로 변경이 없는 상태
    • Modified : 마지막 스냅샷으로부터 변경 내역이 있지만 staged되지 않은 상태
  • Untracked : 관리 대상에 포함되지 않는 파일들

Staged 된 파일 삭제

먼저, 현재 상태를 살펴본다.
git status 명령어를 통해 아래와 같은 결과가 나왔을 때, -m 옵션과 함께 commit 하게 되면 Changed to be commit 에 있는 모든 파일이 커밋된다. 그런데 PracticeSpringJpaApplication.java 파일만 제외하고 커밋하고 싶다면 해당 파일을 staged 상태에서 없애주면 된다.

$ git status                                                 
On branch main
Changes to be committed:  # 변경 이후 staged에 올라간 상태
  (use "git restore --staged <file>..." to unstage)
        modified:   src/main/java/com/practicespringjpa/PracticeSpringJpaApplication.java
        new file:   src/test/java/com/practicespringjpa/chapter3/entity/Chap3MemberTest.java
        new file:   src/test/java/com/practicespringjpa/chapter3/repository/Chap3MemberJpaRepositoryTest.java
        new file:   src/test/java/com/practicespringjpa/chapter3/repository/Chap3MemberRepositoryTest.java
        deleted:    src/test/java/com/practicespringjpa/entity/MemberTest.java
        deleted:    src/test/java/com/practicespringjpa/repository/MemberJpaRepositoryTest.java
        deleted:    src/test/java/com/practicespringjpa/repository/MemberRepositoryTest.java

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        src/main/java/com/practicespringjpa/chapter4/

staged 상태에서 없애주기 위해 git reset HEAD -- path/to/file 명령어를 사용하면 된다.

아래와 같이 staged 상태에서 PracticeSpringJpaApplication.java 파일을 위 명령어로 삭제해주면 Modified 상태임을 표시하는 Changes not staged for commit: 파일 내역으로 옮겨진 것을 확인할 수 있다.

$ git reset HEAD -- src/main/java/com/practicespringjpa/PracticeSpringJpaApplication.java                                                  
Unstaged changes after reset:
M       src/main/java/com/practicespringjpa/PracticeSpringJpaApplication.java
$ git status                                                                                    
On branch main
Changes to be committed:   # 변경 이후 staged에 올라간 상태
  (use "git restore --staged <file>..." to unstage)
        new file:   src/test/java/com/practicespringjpa/chapter3/entity/Chap3MemberTest.java
        new file:   src/test/java/com/practicespringjpa/chapter3/repository/Chap3MemberJpaRepositoryTest.java
        new file:   src/test/java/com/practicespringjpa/chapter3/repository/Chap3MemberRepositoryTest.java
        deleted:    src/test/java/com/practicespringjpa/entity/MemberTest.java
        deleted:    src/test/java/com/practicespringjpa/repository/MemberJpaRepositoryTest.java
        deleted:    src/test/java/com/practicespringjpa/repository/MemberRepositoryTest.java

Changes not staged for commit:  # 변경은 있지만 staged에 올라가지 않은 상태 (Modified)
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   src/main/java/com/practicespringjpa/PracticeSpringJpaApplication.java

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        src/main/java/com/practicespringjpa/chapter4/
반응형

개요

현재 본인의 Mac에 설치된 Java 버전은 8이다.

1
2
3
4
$ java -version
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)
cs

Java11이 LTS로 나온지 한참이 지났는데도 미뤄온 버전 업그레이드를 진행한다.

방법

MacOS에서 Java 버전을 업데이트 하기 위해서는 크게 두가지 방법이 있다.
Jdk 파일을 다운로드 받거나, MacOS용 패키지 관리자인 HomeBrew로 설치하는 방법이다.

Oracle에서 제공하는 OpenJdk는 현재 HomeBrew로 설치를 지원하지 않는다.
Oracle의 OpenJdk를 설치하려면 15버전 기준으로 jdk.java.net/15/ 링크에서 파일 다운로드가 가능하다.
새로운 Jdk 버전이 6개월에 한번씩 나오는 상황에서는 brew로 설치할 수 있어 관리가 용이한 AdoptOpenJdk를 설치하려 한다.

설치

1
2
3
4
5
6
7
# 무조건 최신 버전의 OpenJdk 설치
$ brew install --cask adoptopenjdk
 
# 원하는 버전의 OpenJdk를 선택하여 설치
# 설치 가능한 버전 확인은 brew search adoptopenjdk
$ brew tap AdoptOpenJDK/openjdk
# brew install --cask <version>
$ brew install --cask adoptopenjdk11
cs

설치가 완료된 후 아래의 이미지와 같이 java -version 명령어를 이용해 정상적으로 설치되었는지 확인이 가능하다.

참고

 

AdoptOpenJDK/homebrew-openjdk

AdoptOpenJDK HomeBrew Tap. Contribute to AdoptOpenJDK/homebrew-openjdk development by creating an account on GitHub.

github.com

 

반응형

'Dev > Java' 카테고리의 다른 글

[Intellij] Maven - Error:java: error: release version 5 not supported 에러  (0) 2021.07.02
[Java] 용어정리.zip  (0) 2020.09.29
[Java] Stateless Object  (0) 2020.04.11

 

MacOS에 도커를 설치하는 방법은 MacOS 용 패키지 관리자인 homebrew를 사용하는 방법과 Docker 에서 제공하는 dmg 파일을 다운받아 설치하는 방법이 있다. 

docs.docker.com/docker-for-mac/install/

 

Install Docker Desktop on Mac

 

docs.docker.com

 

반응형

Github의 Black lives matter

심심해서 Github 공식 블로그를 구경하다가 10월을 기점으로 Github에서 Repository를 생성할 때 Default 브랜치명이 master에서 main으로 바뀐다는 글을 보았다. (github.blog/changelog/2020-10-01-the-default-branch-for-newly-created-repositories-is-now-main/)

Default 브랜치명을 굳이? 왜? 바꿀까 싶어 찾아보았다. 최근 미국에서는 Black lives matter 운동이 큰 이슈가 되고 있다. 이러한 움직임의 연장으로 미국의 IT업계에는 이전부터 논란이 된 master/slave, blacklist/whitelist 와 같은 언어적인 문제들을 개선하려는 움직임이 많아지고 있다고 한다. 그 중 Github도 이러한 사회의 흐름에 발맞춰 움직인 것 같다.

이미 존재하는 Repository의 Default branch를 임의로 모두 바꾸게 되면 사용자들에게 큰 파장을 일으킬 수 있다. 이러한 문제가 발생하지 않도록 우선 신규 Repository 생성시에만 Default 브랜치명이 main으로 생성되고, 기존 Repository는 연말까지 변경을 지원 할 예정이라고 한다.(github.com/github/renaming#later-this-year-seamless-move-for-existing-repositories-)



실제 사용에 어떤 영향을 미칠까?

  • 삭제한 master 브랜치의 url을 main 브랜치로 redirect 지원
    eg) github.com/user_name/repository_name/blob/master/README.md -> github.com/user_name/repository_name/blob/main/README.md
  • Github 페이지를 사용할 때 gh-pages 만 사용할 수 있었는데 이러한 제한이 없어짐
  • user, organization, enterprize 단위로 Repository 생성시 자동 생성되는 Default branch 이름 설정이 가능해짐 



기존에 생성한 Repository의 Default branch를 변경하려면?

Step 1 - git branch 명령어 중 "-m / -M" 옵션을 사용하여 master 브랜치를 main 브랜치로 rename하고 remote 저장소에 push

$ git branch -help
usage: git branch [<options>] [-r | -a] [--merged | --no-merged]
   or: git branch [<options>] [-l] [-f] <branch-name> [<start-point>]
   or: git branch [<options>] [-r] (-d | -D) <branch-name>...
   or: git branch [<options>] (-m | -M) [<old-branch>] <new-branch>
   or: git branch [<options>] (-c | -C) [<old-branch>] <new-branch>
   or: git branch [<options>] [-r | -a] [--points-at]
   or: git branch [<options>] [-r | -a] [--format]

$ git branch -m master main
$ git push -u origin main

Step 2 - Github의 Repository 설정 변경

Step 3 - master 브랜치 삭제

사용하지 않는 브랜치는 지워주는게 좋다. 

github.com/user_name/repository_name/branches 에서 master 브랜치를 지워준다.



main이 아닌 다른 Default 브랜치명을 사용해야 한다면?

그렇다고 모든 신규 repository의 default 브랜치명을 main으로 강제하는 것은 아니다.
master 브랜치, 혹은 다른 이름의 default 브랜치를 계속해서 사용해야 한다면 github.com/settings/repositories 에서 아래의 빨간 박스가 되어 있는 main 대신 master 혹은 원하는 default 브랜치명으로 업데이트하면 새로운 repository를 생성해도 main으로 default 브랜치를 생성하지 않는다.



사담

미국의 IT업계에서 master/slave, blacklist/whitelist 등 일반적으로 사용되는 언어에 대해서 이미 논란이 있어 왔다는 것을 처음 알았다🤭
조지 플로이드 사건 이후 종종 기술 검색을 하거나 웹을 떠돌다보면 Reddit이 오렌지 로고에서 검정 로고로 변경한 것, 어떤 기술의 메인페이지에 Black lives matter 해시태그가 추가된 이미지가 있는다던지 등의 모습들이 보였는데 실제 내가 사용하는 영역까지 영향을 받는 것은 처음이라 인상깊었다.
다양한 인종이 있는 만큼 한국에서는 아무생각 없이 지나칠 부분에도 다양한 논의가 있고, 이를 개선한다는 것은 매우 좋은 것 같다. Black 뿐만 아니라 Asian에 대한 차별까지 관심이 확장되면 좋겠다🙃



참고

github.com/github/renaming

www.sedaily.com/NewsView/1Z567TI23H

반응형

목차

  1. Write Ahead Log (WAL)
  2. StoreFile (HFile)
  3. 변경 사항 복구

개요

HBase를 매일 이리저리 사용하면서도 자세히 모르는 것 같아서 현타가 와버렸다.ㅠㅠ
기억의 파편들에 리서치로 뼈와 살을 붙여 제대로 HBase를 이해해보자

Write Ahead Log (WAL)

리전 서버는 디스크에 파일이 너무 많이 생성되지 않도록 메모리(memstore)에 충분히 보유한다. 메모리에 데이터를 가지므로 서버에 이슈가 생길 경우 소실 가능성이 있다. 이러한 문제를 해결하기 위해 WAL을 사용한다.

HBase는 모든 변경 사항들을 로그에 쓰고, 연산이 성공했을 때만 클라이언트에 성공했음을 반환한다. 서버가 중지되면 WAL을 사용하여 서버가 중지되기 전까지의 상태 변경 사항을 재현할 수 있다.

StoreFile (HFile)

실제 저장 파일을 구현하는 클래스로, HBase의 데이터를 효율적으로 저장한다는 단 하나의 명확한 목표를 달성하기 위한 클래스
https://github.com/apache/hbase/blob/6cdc4b1f0574cc424480ec2f2e3129f280fa8472/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFile.java

 

출서 - https://blog.cloudera.com/apache-hbase-i-o-hfile/

위 그림은 HFile의 구조인데 File Info, Trailer 외에는 모두 옵셔널한 블록이다. 하지만 Data 블록는 실질적으로 저장되는 데이터를 담기 때문에 거의 대부분 하나의 데이터 블록은 존재할 것이다.
Data 블록은 key (로우 키 길이, 로우키, 컬럼 패밀리 길이, ...), value 로 이루어져 있다. 키에는 많은 정보가 담겨져 있으므로 불필요하기 긴 이름의 키 설정을 지양해야 한다.

변경 사항 복구

리전이 열리면 'recovered.edits' 디렉터리가 있는지 확인한다. 디렉토리가 존재하면 HBase 변경사항이 저장된 내부의 파일들을 읽어 memstore에 저장한다. 파일들은 일련번호가 포함된 이름순으로 정렬되어 있으므로 순서대로 복구할 수 있다. 이 때 일련번호가 디스크에 저장된 저장 파일(HFile)의 일련번호와 같거나 작으면 이미 모든 내용이 반영된것으로 판단하고 무시한다.
모든 edit 파일을 체크하면 memstore의 내용들은 디스크(HFile)로 저장하도록 강제 flush를 하고, edit 파일들은 삭제한다.

Zookeeper와 HBase (WIP)

http://hbase.apache.org/book.html#trouble.namenode.hbase.objects

반응형

개요

사소하게 쓰이는 단어들이지만 정확한 정의를 입으로 뱉지 못하는 일이 없도록 정리하고 조금씩 차이가 있는 단어들의 비교해서 명확한 차이를 파악하자!

목차


 

Parameter (매개변수) vs Argument (인수)

Effective Java를 읽다보면 매개변수와 인수라는 단어가 자주 나오는데 생각해보니 둘을 혼용해서 써왔던 것 같다.
두 단어의 정확한 정의는 아래와 같다.
Parameter : 메서드 선언에 정의한 변수
Argument : 메서드 호출 시 넘기는 '실젯값'

// value - parameter
void add(int value) { ... }
// 10 - argument
add(10)
반응형

+ Recent posts