<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jinman-kim.log</title>
        <link>https://velog.io/</link>
        <description>충분한 전기와 컴퓨터 한 대와 내 이 몸만 남아 있다면 지구를 재건할 수 있습니다.</description>
        <lastBuildDate>Mon, 01 Jul 2024 01:37:22 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jinman-kim.log</title>
            <url>https://velog.velcdn.com/images/jinman-kim/profile/e82e83df-4987-480d-96ca-f67bbf8ce688/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jinman-kim.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jinman-kim" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[GCP/Vertex AI] MLOps Studio]]></title>
            <link>https://velog.io/@jinman-kim/GCPVertex-AI-MLOps-Studio</link>
            <guid>https://velog.io/@jinman-kim/GCPVertex-AI-MLOps-Studio</guid>
            <pubDate>Mon, 01 Jul 2024 01:37:22 GMT</pubDate>
            <description><![CDATA[<ol start="0">
<li><p>Gemini Prompt 를 조정해야 Analytics Goal을 Custom가능 (2024/09/15부터)</p>
</li>
<li><p>Supervised Training Task (지도 학습 작업)</p>
</li>
</ol>
<ul>
<li>이미지</li>
<li>테이블 형식(csv, parquet, DB)</li>
<li>텍스트</li>
<li>동영상</li>
</ul>
<hr>
<ol start="2">
<li><p>Process
2-1. 데이터 수집(Collect)
Classification이 목적이라면 레이블 별로
최소/최대 레이블의 비율이 1:10은 되어야함
1: 100 이래 버리면 분류 힘들다는.. 
2-2. 데이터 준비(Inspect format or label)
2-3. 학습 (set parameters and build/training)
Training/ Validation/ Test
8 : 1 : 1 비율
<img src="https://velog.velcdn.com/images/jinman-kim/post/54e2784f-f967-40d3-b6b1-832cab37503e/image.png" alt="">
2-4. 평가 (estimation)
2-5. 배포 및 예측(deploy and predict/inference) </p>
</li>
<li><p>Vertex AI Guide
3-1. Managed Training(관리형 학습)</p>
</li>
</ol>
<ul>
<li>학습 코드 작성</li>
<li>code submit</li>
<li>code monitoring
<img src="https://velog.velcdn.com/images/jinman-kim/post/b0d6421c-2589-4b02-a4ec-2c9e80c0d63f/image.png" alt=""></li>
<li>클라우드니까 머신타입 당연히 골라야 하고 GPU타입(Accelerator)도 고르네요..
관리형이라면서 다 해야하네.. ㅎ 서버리스랑은 약간 다른개념^^.
<img src="https://velog.velcdn.com/images/jinman-kim/post/c1049da7-7eeb-430f-8bca-f621ba185089/image.png" alt=""><h3 id="아래와-같은-예제들이-있으니-어떤식으로-하는지-상상해보기">아래와 같은 예제들이 있으니 어떤식으로 하는지 상상해보기!</h3>
<img src="https://velog.velcdn.com/images/jinman-kim/post/c7d53180-44d7-4c09-8840-9dc59f208cdb/image.png" alt=""></li>
</ul>
<p>3-2. Managed Inference(관리형 추론)</p>
<ul>
<li>3-1 에서 만든 모델을 Vertex AI Model Registry에 업로드</li>
<li>아마 Google Cloud Storage에 있지 않을까 싶네요</li>
<li>아래와 같이 수행하면 추론서버(RESTful Inference EndPoint)로 사용 가능
<img src="https://velog.velcdn.com/images/jinman-kim/post/7986920e-38e7-4f3c-bc37-aaaf0e5f9b36/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[python/근본] abc, ABC, abstractmethod]]></title>
            <link>https://velog.io/@jinman-kim/python%EA%B7%BC%EB%B3%B8-abc-ABC-abstractmethod</link>
            <guid>https://velog.io/@jinman-kim/python%EA%B7%BC%EB%B3%B8-abc-ABC-abstractmethod</guid>
            <pubDate>Sat, 27 Apr 2024 08:17:21 GMT</pubDate>
            <description><![CDATA[<h3 id="abc-모듈">abc 모듈</h3>
<p>주로 오픈소스 만들 때, 클래스 상속 시 특정 메소드 필수 구현 강요
&quot;Cat 클래스는 speak 메소드를 정의 안해서 에러 발생&quot; 이 부분이 제일 중요^^.</p>
<pre><code class="language-python">from abc import ABC, abstractmethod

class AbstractAnimal(ABC):

    @abstractmethod
    def speak(self):
        pass

class Dog(AbstractAnimal):
    def speak(self):
        return &quot;Woof!&quot;

class Cat(AbstractAnimal):
    def speak_test(self):
        return &quot;Meow!&quot;

# 추상 클래스를 상속받은 구체 클래스의 인스턴스 생성
dog = Dog()
print(dog.speak()) # 출력: Woof!

cat = Cat()
print(cat.speak_test()) # 출력: TypeError: Can&#39;t instantiate abstract class Dog with abstract method speak!

# 추상 클래스 직접 인스턴스화 시도 (오류 발생)
try:
    animal = AbstractAnimal()
except TypeError as e:
    print(e) # Cannot instantiate abstract class AbstractAnimal with abstract method speak
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TDD/Django] EP.0 실전 TDD ]]></title>
            <link>https://velog.io/@jinman-kim/TDDDjango-EP.0-%EC%8B%A4%EC%A0%84-TDD</link>
            <guid>https://velog.io/@jinman-kim/TDDDjango-EP.0-%EC%8B%A4%EC%A0%84-TDD</guid>
            <pubDate>Wed, 24 Apr 2024 08:33:24 GMT</pubDate>
            <description><![CDATA[<p>TDD는 실전이다.
어느 순간부터 순정으로 진행하는 테스트의 한계가 느껴졌다
그래서 테스트 코드를 짜고 있다</p>
<pre><code class="language-python">from django.urls import reverse
from django.test import TestCase

class MangangGetTest(TestCase):
    @class
    def setUpTestData(cls):
        cls.mock_attr1 = &#39;&#39;
        cls.mock_attr2 = &#39;&#39;
        cls.mock_url = &#39;/path&#39;
    def test_mangang_post(self):
        mocked_data = {
                    mock_key_1: &#39;모킹 하세요1&#39;,
                    mock_key_2: &#39;모킹 하세요2&#39;,
                }
        # 각각 GET, POST에 대한 검사를 하기 위한..
        get_GET_response = self.client.get(mock_url)
        get_POST_response = self.client.post(reverse(&#39;aliasing_view&#39;, mocked_data))
</code></pre>
<p>각각 django TDD에서 필수적이다</p>
<ol>
<li>reverse는 url에 aliasing 해놓은 비즈니스 로직 호출</li>
<li>TestCase는 class에 상속해서 테스트 코드 구성 (CBV 형식)</li>
</ol>
<p>setUp : 하위의 모든 테스트 코드 호출 시에 매번 셋업하는데 함수 많으면 오래 걸려서 아래 setUpTestData 사용이 유리한 상황이 있음
setUpTestData: @classmethod와 같이 사용 cls.attr1 = value 선언 후, 하위 함수에서 self.attr1 호출 가능
** 모든 함수의 시작은 test로 시작해야함 def test_check_func1(self)..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[1일1개발지식] 시스템 메트릭은 내 PC 어디에 있나?]]></title>
            <link>https://velog.io/@jinman-kim/1%EC%9D%BC1%EA%B0%9C%EB%B0%9C%EC%A7%80%EC%8B%9D-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EB%A9%94%ED%8A%B8%EB%A6%AD%EC%9D%80-%EB%82%B4-PC-%EC%96%B4%EB%94%94%EC%97%90-%EC%9E%88%EB%82%98</link>
            <guid>https://velog.io/@jinman-kim/1%EC%9D%BC1%EA%B0%9C%EB%B0%9C%EC%A7%80%EC%8B%9D-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EB%A9%94%ED%8A%B8%EB%A6%AD%EC%9D%80-%EB%82%B4-PC-%EC%96%B4%EB%94%94%EC%97%90-%EC%9E%88%EB%82%98</guid>
            <pubDate>Sun, 14 Apr 2024 10:29:39 GMT</pubDate>
            <description><![CDATA[<p>시스템 메트릭은 대체 어디에 있을까??
CPU, 메모리, IO 등등..</p>
<ul>
<li>운영 체제에서 관리하고 있다. 호스트 내의 파일 경로에서 확인은 어렵고 가상 메모리의 아래 경로에 있다.
/proc/meminfo
/proc/stat
/proc/net/dev
/prod/diskstats</li>
</ul>
<p>시스템 메트릭은 가상 메모리에서 실시간으로 위 경로에 write 되고 있다!
프로메테우스의 node exporter는 이러한 시스템 메트릭을 외부 포트로 노출 하고(default:9010)
프로메테우스 클라이언트 서버에서 타겟 서버의 9010포트에서 특정 interval단위로 스크랩 해가는 것이다!</p>
<p>global:
  scrape_interval: 15s
  evaluation_interval: 15s</p>
<p>scrape_configs:</p>
<ul>
<li>job_name: &#39;prometheus&#39;
static_configs:<ul>
<li>targets: [&#39;localhost:9090&#39;]</li>
</ul>
</li>
</ul>
<p>ex) target_server_host: <a href="http://localhost:9090">http://localhost:9090</a>
client_server는 target_server에서 interval: 15s 단위로 시스템 메트릭을 수집하고 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[aws/ETL] AWS Glue Tutorial]]></title>
            <link>https://velog.io/@jinman-kim/awsETL-AWS-Glue-Tutorial</link>
            <guid>https://velog.io/@jinman-kim/awsETL-AWS-Glue-Tutorial</guid>
            <pubDate>Tue, 19 Mar 2024 07:46:27 GMT</pubDate>
            <description><![CDATA[<h3 id="dpu란">DPU란?</h3>
<p>DPU의 Pricing</p>
<ul>
<li>Data Processint Unit  의 약자임 (젠슨 황-엔비디아 대표 언급)<ul>
<li>1 DPU = 4 vCPU &amp; 16 GB of memory ( $0.44 per Hour )</li>
</ul>
</li>
<li>Data Catalog<ul>
<li>$1.00 per 100,000 objects per Month </li>
</ul>
</li>
<li>Requests<ul>
<li>1M(1,000,000)  은 무료</li>
<li>$1.00 per 1M requests above 1M in a month</li>
</ul>
</li>
</ul>
<h3 id="workflow">WorkFlow</h3>
<pre><code>csv -&gt; Transform -&gt; Parquet</code></pre><ol>
<li>Bucket 생성( S3 )</li>
<li>IAM 권한 부여(적절하게..)</li>
<li>Glue 내에 DB 생성</li>
<li>Crawler 생성 후 실행</li>
<li>ETL Job 생성 후 실행(Extract, Transtorm and loads)</li>
</ol>
<h2 id="checklist">Checklist</h2>
<p>Job Bookmark 확인
DB Procedure ( DW -&gt; DM )
python( Landing Zone -&gt; DW 로 CUD 작업 )
랜딩존의 이미지 메타데이터(URL) -&gt; 웹URL
ETL 과정을 모니터링(Log)</p>
<h2 id="process">Process</h2>
<ol>
<li>버킷에 iris.csv 테스트 데이터 생성 (s3://kimjm/test-csv-/iris.csv)</li>
<li>database 생성( kimjm_test_postresql)</li>
<li>crawler 생성( Data Sources 지정 -&gt; 버킷 경로 )</li>
</ol>
<h2 id="test-wfwork-flow">Test WF(Work Flow)</h2>
<p>trigger - node - trigger(any/all) -&gt; node</p>
<ol>
<li>trigger ( 스케쥴, on-demand )</li>
<li>forward
2-1. treigger( depends on 2 )</li>
</ol>
<h1 id="data-lake-overall-flow">Data Lake Overall Flow</h1>
<ol>
<li>ERP서버(REST API)에서 S3로 일단위로 추출<ul>
<li>증분(incremental), 증분테이블(CDC) or 타임스탬프 컬럼 기반<ul>
<li>original.parquet = original.parquet + added.parquet(add는 날짜) </li>
</ul>
</li>
<li>모든 데이터 다 갖고 오기 (비효율적일듯)<ul>
<li>original.parquet = original.parquet</li>
</ul>
</li>
</ul>
</li>
<li>S3 to Data-Catalog<ul>
<li>crawler 실행( bookmark: enabled)</li>
</ul>
</li>
<li>Data-Catalog( CDC만 있는)에 있는 증분 데이터를 DW에 반영<ul>
<li>working_df = SparkSession.read(Data-Catalog)</li>
<li>original_df = SparkSession.read(Database)
두 df를 join해서 없는 것은 filter로 drop하고,</li>
</ul>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[aws/ETL] EP.0) 클라우드 ETL]]></title>
            <link>https://velog.io/@jinman-kim/awsETL-EP.0-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-ETL</link>
            <guid>https://velog.io/@jinman-kim/awsETL-EP.0-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-ETL</guid>
            <pubDate>Mon, 18 Mar 2024 04:45:57 GMT</pubDate>
            <description><![CDATA[<hr>
<h2 id="--클라우드-환경에서의-etl">- 클라우드 환경에서의 ETL</h2>
<p>내용이 어렵고 와닿지 않으실 수 있습니다.
요약하자면 이렇습니다.
DB는 24시 존재하고, 어떠한 애플리케이션(서비스)에도 존재합니다
이제 분석이 필요합니다
하지만 DB에 접근해서 분석하지 않습니다.
음식의 맛, 성분 분석을 식당에서 하지 않고, 포장해와서 집에서 분석한다고 생각하시면 됩니다(먹방 리뷰 유튜버처럼 ㅎㅎ)</p>
<p>저장되는 DB뿐만이 아니라 데이터가 발생할 수 있는 모든 곳에서 스토리지로 데이터를 
우겨넣습니다!!(실시간으로 야금야금이든.. 일괄로 뭉태기로 넣든!)
초기 구축 시에는 일괄로 넣어야 하니 아래의 방법중 2번으로 처음에 넣어도 좋겠네요.</p>
<p>Source - ETL툴 - Destination(A-B-C)구조입니다. 
B가 A에서 C로 갖다놓는데, 상황이 많기에 상황에 따른 적절한 전략을 짜야합니다.
전략이라면 데이터 유실없이 최적의 비용으로 유지보수가 쉬워야겠죠?????(젤 어려운말..)
운영계 DB에서 DW,DL 같은 스토리지 환경으로 가져갈 때 전략 </p>
<ol>
<li>Serverless(AWS Lambda) : 변화에 대한 초단위 배치 </li>
<li>인스턴스 스냅샷 : 이건 1회성</li>
<li>CDC(Change Data Capture): 변화 데이터에 대해서 read 하고, 목적지에 write(put)</li>
</ol>
<p><img src="https://velog.velcdn.com/images/jinman-kim/post/f901b357-b897-4f24-ac88-9dd9091a148e/image.png" alt="">
<em>AWS DMS(Database Migration Service)</em>
Source와 Destintation 사이에 인터페이스 호환성이 뛰어납니다
Source가 어떤 스택이든.. Destination이 어떤 스택이든..</p>
<p><img src="https://velog.velcdn.com/images/jinman-kim/post/a166847c-5aba-4454-8364-f536aa956466/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[python] GIL( Global Interpreter Lock)]]></title>
            <link>https://velog.io/@jinman-kim/python-GIL-Global-Interpreter-Lock</link>
            <guid>https://velog.io/@jinman-kim/python-GIL-Global-Interpreter-Lock</guid>
            <pubDate>Wed, 16 Aug 2023 02:09:06 GMT</pubDate>
            <description><![CDATA[<h2 id="gil이란">GIL이란?</h2>
<p>여러 개의 스레드가 파이썬 바이트코드를 한번에 하나만 사용할 수 있게 락을 거는 것을 의미한다. 쉽게 말해서 하나의 스레드만 파이썬 인터프리터를 제어할 수 있도록 하는 뮤텍스라고 보면 된다.</p>
<h2 id="for-the-memory-">For The MEMORY !</h2>
<p>GIL의 설계배경을 한마디로 말하자면 메모리 안전성을 보장하기 위함이다.</p>
<p><img src="https://velog.velcdn.com/images/jinman-kim/post/c5a139a0-b406-48ce-9e80-de151f48b744/image.png" alt="">
그림에서 보듯이 우측의 객체는 참조의 수가 2인데, 좌측의 객체는 참조가 없어져 0이 된다. 이 개수가 0에 도달하면 개체가 점유한 메모리가 메모리 가비지 컬렉터에 의해 해제된다.</p>
<p>```python</p>
<h1 id="reference-count">reference count</h1>
<p>import sys
x = []
print(sys.getrefcount(x))  # x의 참조 카운트를 가져옵니다. (기본적으로 2입니다)</p>
<p>y = x
print(sys.getrefcount(x))  # y가 x를 참조하므로 카운트가 1 증가합니다.</p>
<p>del y  # y의 참조를 제거합니다.
print(sys.getrefcount(x))  # 카운트가 다시 2로 감소합니다.</p>
<h1 id="garbage-collection-및-순환-참조-예제">Garbage Collection 및 순환 참조 예제</h1>
<p>import gc</p>
<p>def create_cycle():
    x, y = {}, {}
    x[&#39;y&#39;], y[&#39;x&#39;] = y, x
    # x와 y는 서로 참초하므로 순환 참조 발생</p>
<p>create_cycle()
gc.collect()
print(gc.garbage)</p>
<p>if not reference_count:</p>
<p>문제는 이 레퍼런스 카운팅 변수가 멀티 스레드 환경에서 두 스레드가 동시에 값을 늘리거나 줄이는 Race Condition이 발생할 수 있다는 것이다. 이러한 상황이 발생하면 메모리 누수가 발생하거나 객체에 대한 참조가 남아있는 데도 메모리를 잘못 해제할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[VPC/L4/L7 LoadBalancer] #1 VPC와 LB, Nginx 세팅]]></title>
            <link>https://velog.io/@jinman-kim/VPCL4L7-LoadBalancer-1-VPC%EC%99%80-LB-Nginx-%EC%84%B8%ED%8C%85</link>
            <guid>https://velog.io/@jinman-kim/VPCL4L7-LoadBalancer-1-VPC%EC%99%80-LB-Nginx-%EC%84%B8%ED%8C%85</guid>
            <pubDate>Wed, 09 Aug 2023 09:02:35 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>IPv4 대역 일부를 이용
사설망, Private Network
24비트 블록 10.0.0.0 ~ 10.255.255.255 -&gt; 2^24개
    00001010 00000000 00000000 00000000
20비트 블록 172.16.0.0
    10101100 00010000 00000000 00000000
16비트 블록 192.168.0.0
    11000000 10101000 00000000 00000000</p>
</blockquote>
<h2 id="vpn-2가지-종류">VPN 2가지 종류</h2>
<blockquote>
<h4 id="ipsec-vpn-layer3-site-to-site-본사와-자사">IPsec VPN Layer3 Site to Site (본사와 자사)</h4>
<h4 id="ssl-vpn-layer4-client-to-site-사용자가-어느-장소에서든-접근-가능">SSL VPN Layer4 Client to Site (사용자가 어느 장소에서든 접근 가능)</h4>
</blockquote>
<h3 id="ipsecinternet-protocol-security">IPSec(Internet Protocol Security)</h3>
<h3 id="운용-모드">운용 모드</h3>
<ul>
<li><h4 id="transport-mode단말-to-단말">Transport Mode:단말 to 단말</h4>
</li>
<li><h4 id="tunnel-mode-vpn-to-vpn">Tunnel Mode: VPN to VPN</h4>
<blockquote>
<blockquote>
<pre><code>   Origin IP Header(사설 IP)를 캡슐화하고 IP 패킷 전체를 인증 혹은 보호하며, VPN 장비가 이를 도맡아 하므로 사설 네트워크와 사설 네트워크 간 통신을 가능케 합니다.</code></pre></blockquote>
</blockquote>
</li>
</ul>
<h2 id="l2l3-l4-l7">L2,L3, L4, L7</h2>
<blockquote>
<p>상위 계층을 활용할 수 있는 장비들은 모두 하위 계층 또한 이해하고 활용할 줄 알아야 한다. 
&quot;L4 Virtual Server는 TCP/UDP만을 다루는 로드밸런서이고, L7 Virtual Server는 주로 HTTP/HTTPS만을 다루는 로드밸런서 아닌가요?&quot; 
<img src="https://velog.velcdn.com/images/jinman-kim/post/691dec0a-b03e-4c8b-b926-41d1de34714a/image.png" alt="">
&lt;Layer 4와 Layer 7(출처 : <a href="https://www.freeism.co.kr/wp/archives/698)&gt;">https://www.freeism.co.kr/wp/archives/698)&gt;</a>
 상위 레벨의 프로토콜 이해 없이 TCP/UDP 로드밸런싱이 필요하면 L4 Virtual Server를 사용하면 됩니다. HTTP를 비롯한 Layer 7 헤더 해석이 필요하다면 L7 Virtual Server를 사용하면 되겠죠.</p>
</blockquote>
<ul>
<li>layer7 헤더해석이 필요없는 트래픽은 layer4에서 밸런싱 하고 끝<ul>
<li>HTTP는 TCP 기반의 프로토콜입니다. 그렇기 때문에 HTTP 통신을 하기 위해서는 반드시 3-way handshake를 실시하여 신뢰성 있는 연결을 생성하여야 합니다. 그다음에 HTTP GET을 통해 리소스를 얻어오거나 POST를 통해 업데이트를 실시하는 것입니다.</li>
</ul>
</li>
</ul>
<h3 id="l4-load-balancing">L4 Load Balancing</h3>
<ul>
<li>IP와 Port를 활용하여 서버부하분산<h3 id="l7-load-balancing">L7 Load Balancing</h3>
</li>
<li>IP와 Port를 사용하여 로드밸런싱을 하는 것은 같으나 Layer 7 프로토콜을 통해 사용자 정의 로드밸런싱을 실시하거나 Layer 7 프로토콜 헤더를 조작 / 활용할 수 있다는 특징이 있습니다.</li>
<li>DNS 는 TCP/ UDP 모두 사용. 기본적으로 UDP 이지만, 전달해야 하는 패킷의 크기가 512bit 를 넘는다면 TCP를 사용, DNS를 제대로 Load Balancing 하기 위해서는 TCP/UDP Virtual Server 모두 생성해야함.</li>
</ul>
<h3 id="client---web-server---backend">Client - Web Server - BackEnd</h3>
<ul>
<li>Client와 Nginx 사이에는 https</li>
<li>Nginx와 django(web framework) 사이에는 http</li>
<li>성능: HTTPS는 암호화와 인증 과정이 필요하기 때문에 CPU 사용량이 높을 수 있습니다. 클라이언트와 Nginx 사이에서만 HTTPS를 사용하면, 이 오버헤드를 한 번만 처리하면 되어 백엔드에서의 추가 부하를 피할 수 있습니다.</li>
<li>단순화: HTTPS 인증서 관리와 SSL/TLS 설정은 복잡할 수 있습니다. 이러한 설정을 Nginx에서만 처리하면 백엔드 설정이 더 간단해집니다.</li>
<li>보안: Nginx와 Django가 같은 호스트 또는 동일한 내부 네트워크 내에서 실행되고 있다면, 내부 트래픽은 이미 보안된 환경 내에 있으므로 HTTPS로 암호화할 필요가 없을 수 있습니다.</li>
<li>Nginx 설정에서 이런 구성을 사용할 때, proxy_pass 지시어는 http로 시작하는 URL을 대상으로 합니다. 예를 들면:<blockquote>
<pre><code>nginx
Copy code
location / {
  proxy_pass http://127.0.0.1:8001;</code></pre></blockquote>
<h1 id="-나머지-proxy_set_header-설정들">... (나머지 proxy_set_header 설정들)</h1>
}<pre><code></code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[pinecone/vectordb] pinecone  튜토리얼]]></title>
            <link>https://velog.io/@jinman-kim/pineconevectordb-pinecone-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC</link>
            <guid>https://velog.io/@jinman-kim/pineconevectordb-pinecone-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC</guid>
            <pubDate>Fri, 04 Aug 2023 05:11:41 GMT</pubDate>
            <description><![CDATA[<p>API_KEY</p>
<h4 id="api_keypinecone_api">API_KEY=$PINECONE_API</h4>
<p>Region</p>
<h4 id="environmentgcp-starter">environment=&#39;gcp-starter&#39;</h4>
<pre><code class="language-python">import pinecone

API_KEY = &#39;your_api_key&#39;
ENVIRONMENT = &#39;your environment&#39;

#클라이언트 생성
pinecone.init(api_key=API_KEY, environment=ENVIRONMENT)

if index not in pinecone.list_indexes():
    index = pinecone.create_index(&#39;tutorial&#39;, dimension=1536, metric=&#39;cosine&#39;)

index = pinecone.Index(&#39;tutorial&#39;)

df = pd.DataFrame(data={&#39;question&#39;:question_list, &#39;vector&#39;:vector_list})

index.upsert(vectors=zip(df.question, df.vector))
벡터를 생성하는 데 사용할 임베딩 모델은 text-embedding-ada-0021536차원의 벡터를 출력합니다. ~~텍스트~~

</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[linux] sudo docker 명령어]]></title>
            <link>https://velog.io/@jinman-kim/linux-sudo-docker-%EB%AA%85%EB%A0%B9%EC%96%B4</link>
            <guid>https://velog.io/@jinman-kim/linux-sudo-docker-%EB%AA%85%EB%A0%B9%EC%96%B4</guid>
            <pubDate>Fri, 04 Aug 2023 00:15:14 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="진짜-별거-아닌데">진짜 별거 아닌데,</h3>
<p>docker ps, docker-compose up 같은
명령어  sudo 안주면 permission denied 준다
<img src="https://velog.velcdn.com/images/jinman-kim/post/226b1029-50b5-4849-bcaf-18e4ad523bf7/image.png" alt=""></p>
</blockquote>
<p>```
#sudo user modify  -add -Group docker 사용자이름
#수퍼유저 권한으로 사용자를 도커 그룹에 추가 하겠습니다.
sudo usermod -aG docker $USER</p>
<p>#새로고침
newgrp docker</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[VectorDB] 벡터 데이터베이스 개념]]></title>
            <link>https://velog.io/@jinman-kim/VectorDB-%EB%B2%A1%ED%84%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EA%B0%9C%EB%85%90</link>
            <guid>https://velog.io/@jinman-kim/VectorDB-%EB%B2%A1%ED%84%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EA%B0%9C%EB%85%90</guid>
            <pubDate>Thu, 27 Jul 2023 11:48:30 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="vectordb란">VectorDB란..?</h2>
<p>Large Language Model (LLM)의 솔루션이다.
<img src="https://velog.velcdn.com/images/jinman-kim/post/bc95c78c-29da-42ab-a619-613994291b36/image.png" alt="">
기존 스칼라 기반 데이터베이스에서 임베딩 작업의 어려움을 해결</p>
</blockquote>
<ol>
<li>Vector Embedding (벡터로 표현됨) = [ 0.34, 0,12 , -0.03, 1.3 ] </li>
<li>Vector Embedding과 원본 콘텐츠와 같이 Vector DB에 Insertion</li>
<li>Apllication이 Query를 발행 하여 Embedding Model을 통해 Embedding을 생성하고, 해당 임베딩을 사용하여 Vector DB에서 유사한 Vector Embedding을 쿼리
(한 마디로 벡터값 비슷한 문장 갖고 온다는 뜻)<h1 id="vector-db-장점">Vector DB 장점</h1>
</li>
<li>데이터 관리: 삽입 삭제 업데이트와 벡터 인덱스를 사용하는 것보다 벡터 데이터를 쉽게 관리하고 유지할 수 있다.</li>
<li>메타데이터 저장 및 필터링: 벡터 항목 관련 메타데이터를 저장할 수 있다. 필터를 이용하여 DB쿼리 가능</li>
<li>확장성:데이터 양이 많아질 수록 분산 및 병렬 처리됨 ( 샤딩, 수평 분할 ) </li>
<li>실시간 업데이트: 실시간 데이터 업데이트를 지원( 동적으로 변경 가능 )</li>
<li>백업 및 수집: 모든 데이터를 백업하는 일상적인 작업 처리(배치), Collections 형태로 백업 가능(NoSQL 특성)</li>
<li>에코시스템 통합: Spark, 태블로, 그라파나 같은?? 분석, 시각화 툴들과 생태계 연동 가능<h1 id="작동-메커니즘">작동 메커니즘</h1>
벡터 데이터베이스는 벡터에서 작동한다 -&gt; 기존 디비에서 최적화, 쿼리 날리던 방식과는 다르다는 의미
Similarity Metrics 를 사용 ( 벡터 유사도를 보는 거겠죠 ?? )</li>
</ol>
<p>-&gt; 가장 유사한 벡터를 찾기
벡터 데이터베이스는 ANN(Approximate Nearest Neighbor) 검색에 모두 참여하는 서로 다른 알고리즘의 조합을 사용한다. 
-&gt; 해싱, 양자화, 그래프 기반 검색
대략적인 결과를 제공하기 때문에 제일 중요한 트레이드 오프(Trade-Off) 는 바로 ..!!
-&gt; 정확도, 속도 이겠죠??
높은 정확도, 낮은 속도
낮은 정확도, 높은 속도
좋은 시스템은 높은 정확도 높은 속도(비용이 많이 들겠죠) 를 제공합니다(PineCone)
<img src="https://velog.velcdn.com/images/jinman-kim/post/8d0fdbb2-b0f4-4c81-923c-4db31f8ffdb2/image.png" alt=""></p>
<h3 id="1indexing">1.Indexing</h3>
<h3 id="2query">2.Query</h3>
<h3 id="3post-processing">3.Post Processing</h3>
<h1 id="알고리즘">알고리즘</h1>
<h2 id="1-random-projection-무작위-투영-">1. Random Projection( 무작위 투영 )</h2>
<p><img src="https://velog.velcdn.com/images/jinman-kim/post/ee3e81fa-1188-4d69-ac85-b3eaa0e71cf4/image.png" alt=""></p>
<h2 id="2-product-quantization">2. Product Quantization</h2>
<p><img src="https://velog.velcdn.com/images/jinman-kim/post/ffbca07f-736f-4ce5-80a6-8da0b8205f9b/image.png" alt=""></p>
<h2 id="3-locality-sensitive-hashing">3. Locality-sensitive hashing</h2>
<p><img src="https://velog.velcdn.com/images/jinman-kim/post/c6b791f2-0675-4ed4-a9e4-f9ddff53dd52/image.png" alt=""></p>
<h2 id="4hierarchical-navigable-small-worldhnsw">4.Hierarchical Navigable Small World(HNSW)</h2>
<p><img src="https://velog.velcdn.com/images/jinman-kim/post/49a21315-2dcb-4f7b-aceb-c2033b891491/image.png" alt=""></p>
<h1 id="유사성-측정">유사성 측정</h1>
<h3 id="코사인-유사성">코사인 유사성:</h3>
<p>벡터 공간에서 두 벡터 간의 각도의 코사인을 측정합니다. 범위는 -1에서 1까지이며, 여기서 1은 동일한 벡터를 나타내고, 0은 직교 벡터를 나타내고, -1은 정반대의 벡터를 나타냅니다.</p>
<h3 id="유클리드-거리">유클리드 거리:</h3>
<p>벡터 공간에서 두 벡터 사이의 직선 거리를 측정합니다. 범위는 0에서 무한대까지이며, 여기서 0은 동일한 벡터를 나타내고 값이 클수록 점점 더 다른 벡터를 나타냅니다.</p>
<h3 id="내적">내적:</h3>
<p>두 벡터 크기의 곱과 두 벡터 사이 각도의 코사인 값을 측정합니다. 범위는 -∞에서 ∞까지이며 양수 값은 같은 방향을 가리키는 벡터를 나타내고 0은 직교 벡터를 나타내고 음수 값은 반대 방향을 가리키는 벡터를 나타냅니다.</p>
<h1 id="필터링">필터링</h1>
<h3 id="사전-필터링">사전 필터링:</h3>
<p>이 접근 방식에서는 벡터 검색 전에 메타데이터 필터링이 수행됩니다. 이렇게 하면 검색 공간을 줄이는 데 도움이 되지만 시스템에서 메타데이터 필터 기준과 일치하지 않는 관련 결과를 간과할 수도 있습니다. 또한 광범위한 메타데이터 필터링으로 인해 계산 오버헤드가 추가되어 쿼리 프로세스가 느려질 수 있습니다.</p>
<h3 id="사후-필터링">사후 필터링:</h3>
<p>이 접근 방식에서는 벡터 검색 후에 메타데이터 필터링이 수행됩니다. 이렇게 하면 모든 관련 결과를 고려하는 데 도움이 될 수 있지만 검색이 완료된 후 관련 없는 결과를 필터링해야 하므로 추가 오버헤드가 발생하고 쿼리 프로세스 속도가 느려질 수도 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ELK/ DockerHub] credentials 에러]]></title>
            <link>https://velog.io/@jinman-kim/ELK-DockerHub-credentials-%EC%97%90%EB%9F%AC</link>
            <guid>https://velog.io/@jinman-kim/ELK-DockerHub-credentials-%EC%97%90%EB%9F%AC</guid>
            <pubDate>Tue, 25 Jul 2023 09:55:16 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="elk를-docker-compose-로-구성할때-발생한-에러">ELK를 Docker-Compose 로 구성할때 발생한 에러</h2>
<p>ElasticSearch 오피셜 git repo를 클론 떠서 compose up 했을 때에 credentials 에러가 발생
그래서 찾아본 결과
docker-hub 회원가입하고 
CLI 에 docker-login 해야함
그래야 Credentials 인증 되는데
cd ~/.docker
홈디렉토리 숨김 폴더 중  .docker 폴더 있는데 이 안에
config.json이 docker login 해도 반영 안되는 경우가 있어서
restart 때리거나 rm config.json
하고 다시 docker-login하면 문제 해결
<img src="https://velog.velcdn.com/images/jinman-kim/post/5615d463-c331-44ee-a9dc-2cd160a6305a/image.png" alt="">
rm ~/.docker/config.json
docker login
하면 터미널에서 Docker-Hub 회원 인증 됨!!
<img src="https://velog.velcdn.com/images/jinman-kim/post/f26258cd-7d69-48da-ab7a-f49604b6e3f7/image.png" alt=""></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[redis/ celery/ python] 비동기 작업 큐 (1)]]></title>
            <link>https://velog.io/@jinman-kim/redis-celery-python-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%9E%91%EC%97%85-%ED%81%90-1</link>
            <guid>https://velog.io/@jinman-kim/redis-celery-python-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%9E%91%EC%97%85-%ED%81%90-1</guid>
            <pubDate>Thu, 13 Jul 2023 14:23:03 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>원만한 서비스를 위해서
대부분의 작업들은 비동기로 수행 해야합니다
파이썬 기반 작업에서는 &#39;Celery&#39; 라는 녀석이 있습니다
채소 샐러리의 단면을 자르면 줄기와 심지가 많죠
파이프가 여러개라 여러 파이프라인으로 병렬(비동기)처리 한다고 생각하면 됩니다
오픈소스 개발자들의 기가 막히는 네이밍센스~ 그러면</p>
</blockquote>
<h3 id="의문">의문:</h3>
<p>멀티 쓰레딩보다 뭐가 낫냐 -&gt; 연결 유실이나 실패 등 재실행 옵션을 줄 수있다. (max_retries)</p>
<h3 id="구성요소-3가지">구성요소 3가지</h3>
<h4 id="1-broker--task를-worker에게-전달">1. Broker : task를 worker에게 전달</h4>
<h4 id="2-client--task-생성">2. Client : task 생성</h4>
<h4 id="3-worker--task-수행">3. Worker : task 수행</h4>
<h2 id="직관적이죠">직관적이죠?</h2>
<p>영화랑 드라마에서 브로커들이 항상 유통구조 중간에서 마약과 총기를 팔죠
중간 허브같은 지점입니다 개발에서는 업무를 보관하고 나눠주고!</p>
<h2 id="broker-종류">Broker 종류?</h2>
<ol>
<li>RabbitMQ</li>
<li>Redis</li>
<li>Zookeeper(잘안씀)
일반적으로 RabbitMQ 와 Redis를 많이 씁니다
redis는 MQ, NoSQL, CacheDB 로 쓰이는 고가용성 플러그인입니다!! 
다음 챕터엔 redis 실습 갈게요</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Airflow/EC2/트러블슈팅] airflow 크롤링 배치 파일 쓰기 권한 문제]]></title>
            <link>https://velog.io/@jinman-kim/AirflowEC2%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85-airflow-%ED%81%AC%EB%A1%A4%EB%A7%81-%EB%B0%B0%EC%B9%98-%ED%8C%8C%EC%9D%BC-%EC%93%B0%EA%B8%B0-%EA%B6%8C%ED%95%9C-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@jinman-kim/AirflowEC2%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85-airflow-%ED%81%AC%EB%A1%A4%EB%A7%81-%EB%B0%B0%EC%B9%98-%ED%8C%8C%EC%9D%BC-%EC%93%B0%EA%B8%B0-%EA%B6%8C%ED%95%9C-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Tue, 11 Jul 2023 10:55:40 GMT</pubDate>
            <description><![CDATA[<p>User / Group / Others
컨테이너가 데이터를 긁어다주면 컨테이너는 Others다
그래서 chmod 해서
write 권한 줘야 한다
이것때매 서버에서 크롤링 배치 돌리는데 애먹었다.
크롤링 주체가 컨테이너라 외부인 취급
다들 참고하세요
어디에도, GPT도 못알려주는..
컨테이너 내부 logs 깊숙이 들어와서 로그 보니까
csv 파일은 만들어졌는데 못써져서 dag error 뜨더라
어제 한시간 오늘 한시간 슈팅 하다가 아웃바운드 all traffic 에러였는데
하..
하여간 너무 기분 좋다 ㅎㅎ
<img src="https://velog.velcdn.com/images/jinman-kim/post/eb399b70-94e2-43a6-8d82-95ebc2f89ea0/image.png" alt="">
에러 로그 한번 구경..(컨테이너 내부 task log 7-depth 에서 발견한 Permission Denied)
호스트pc에서 아무리 컨테이너에 logs 찍어도 안나오길래..</p>
<p>airflow@0b77f1cca39a:/opt/airflow/logs/dag_id=binance/run_id=manual__2023-07-11T08:46:43.391781+00:00/task_id=binance_crawl$ sudo cat &#39;attempt=1.log&#39;</p>
<p>We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:</p>
<pre><code>#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.</code></pre><p>[sudo] password for airflow:
sudo: a password is required
airflow@0b77f1cca39a:/opt/airflow/logs/dag_id=binance/run_id=manual__2023-07-11T08:46:43.391781+00:00/task_id=binance_crawl$ vi &#39;attempt=1.log&#39;
airflow@0b77f1cca39a:/opt/airflow/logs/dag_id=binance/run_id=manual__2023-07-11T08:46:43.391781+00:00/task_id=binance_crawl$ vi &#39;attempt=1.log&#39;
airflow@0b77f1cca39a:/opt/airflow/logs/dag_id=binance/run_id=manual__2023-07-11T10:18:13.187454+00:00/task_id=binance_crawl$ cat &#39;attempt=1.log&#39;
[2023-07-11T10:18:19.471+0000] {taskinstance.py:1103} INFO - Dependencies all met for dep_context=non-requeueable deps ti=&lt;TaskInstance: binance.binance_crawl manual__2023-07-11T10:18:13.187454+00:00 [queued]&gt;
[2023-07-11T10:18:19.481+0000] {taskinstance.py:1103} INFO - Dependencies all met for dep_context=requeueable deps ti=&lt;TaskInstance: binance.binance_crawl manual__2023-07-11T10:18:13.187454+00:00 [queued]&gt;
[2023-07-11T10:18:19.481+0000] {taskinstance.py:1308} INFO - Starting attempt 1 of 1
[2023-07-11T10:18:19.502+0000] {taskinstance.py:1327} INFO - Executing &lt;Task(PythonOperator): binance_crawl&gt; on 2023-07-11 10:18:13.187454+00:00
[2023-07-11T10:18:19.508+0000] {standard_task_runner.py:57} INFO - Started process 1315 to run task
[2023-07-11T10:18:19.511+0000] {standard_task_runner.py:84} INFO - Running: [&#39;airflow&#39;, &#39;tasks&#39;, &#39;run&#39;, &#39;binance&#39;, &#39;binance_crawl&#39;, &#39;manual__2023-07-11T10:18:13.187454+00:00&#39;, &#39;--job-id&#39;, &#39;6&#39;, &#39;--raw&#39;, &#39;--subdir&#39;, &#39;DAGS_FOLDER/binance_crawl.py&#39;, &#39;--cfg-path&#39;, &#39;/tmp/tmp7pzfq8yh&#39;]
[2023-07-11T10:18:19.513+0000] {standard_task_runner.py:85} INFO - Job 6: Subtask binance_crawl
[2023-07-11T10:18:19.560+0000] {task_command.py:410} INFO - Running &lt;TaskInstance: binance.binance_crawl manual__2023-07-11T10:18:13.187454+00:00 [running]&gt; on host 0b77f1cca39a
[2023-07-11T10:18:19.895+0000] {taskinstance.py:1547} INFO - Exporting env vars: AIRFLOW_CTX_DAG_OWNER=&#39;airflow&#39; AIRFLOW_CTX_DAG_ID=&#39;binance&#39; AIRFLOW_CTX_TASK_ID=&#39;binance_crawl&#39; AIRFLOW_CTX_EXECUTION_DATE=&#39;2023-07-11T10:18:13.187454+00:00&#39; AIRFLOW_CTX_TRY_NUMBER=&#39;1&#39; AIRFLOW_CTX_DAG_RUN_ID=&#39;manual__2023-07-11T10:18:13.187454+00:00&#39;
[2023-07-11T10:18:20.231+0000] {taskinstance.py:1824} ERROR - Task failed with exception
Traceback (most recent call last):
  File &quot;/home/airflow/.local/lib/python3.7/site-packages/airflow/operators/python.py&quot;, line 181, in execute
    return_value = self.execute_callable()
  File &quot;/home/airflow/.local/lib/python3.7/site-packages/airflow/operators/python.py&quot;, line 198, in execute_callable
    return self.python_callable(<em>self.op_args, *</em>self.op_kwargs)
  File &quot;/opt/airflow/dags/binance_crawl.py&quot;, line 47, in _binance_api
    df.to_csv(f&#39;/home/airflow/data/{file_name}&#39;, index=False)
  File &quot;/home/airflow/.local/lib/python3.7/site-packages/pandas/core/generic.py&quot;, line 3482, in to_csv
    storage_options=storage_options,
  File &quot;/home/airflow/.local/lib/python3.7/site-packages/pandas/io/formats/format.py&quot;, line 1105, in to_csv
    csv_formatter.save()
  File &quot;/home/airflow/.local/lib/python3.7/site-packages/pandas/io/formats/csvs.py&quot;, line 243, in save
    storage_options=self.storage_options,
  File &quot;/home/airflow/.local/lib/python3.7/site-packages/pandas/io/common.py&quot;, line 707, in get_handle
    newline=&quot;&quot;,
PermissionError: [Errno 13] Permission denied: &#39;/home/airflow/data/bccusdt_1month.csv&#39;
[2023-07-11T10:18:20.239+0000] {taskinstance.py:1350} INFO - Marking task as FAILED. dag_id=binance, task_id=binance_crawl, execution_date=20230711T101813, start_date=20230711T101819, end_date=20230711T101820
[2023-07-11T10:18:20.266+0000] {standard_task_runner.py:109} ERROR - Failed to execute job 6 for task binance_crawl ([Errno 13] Permission denied: &#39;/home/airflow/data/bccusdt_1month.csv&#39;; 1315)
[2023-07-11T10:18:20.285+0000] {local_task_job_runner.py:225} INFO - Task exited with return code 1
[2023-07-11T10:18:20.303+0000] {taskinstance.py:2651} INFO - 0 downstream tasks scheduled from follow-on schedule check
airflow@0b77f1cca39a:/opt/airflow/logs/dag_id=binance/run_id=manual__2023-07-11T10:18:13.187454+00:00/task_id=binance_crawl$ cat &#39;attempt=1.log&#39;
[2023-07-11T10:18:19.471+0000] {taskinstance.py:1103} INFO - Dependencies all met for dep_context=non-requeueable deps ti=&lt;TaskInstance: binance.binance_crawl manual__2023-07-11T10:18:13.187454+00:00 [queued]&gt;
[2023-07-11T10:18:19.481+0000] {taskinstance.py:1103} INFO - Dependencies all met for dep_context=requeueable deps ti=&lt;TaskInstance: binance.binance_crawl manual__2023-07-11T10:18:13.187454+00:00 [queued]&gt;
[2023-07-11T10:18:19.481+0000] {taskinstance.py:1308} INFO - Starting attempt 1 of 1
[2023-07-11T10:18:19.502+0000] {taskinstance.py:1327} INFO - Executing &lt;Task(PythonOperator): binance_crawl&gt; on 2023-07-11 10:18:13.187454+00:00
[2023-07-11T10:18:19.508+0000] {standard_task_runner.py:57} INFO - Started process 1315 to run task
[2023-07-11T10:18:19.511+0000] {standard_task_runner.py:84} INFO - Running: [&#39;airflow&#39;, &#39;tasks&#39;, &#39;run&#39;, &#39;binance&#39;, &#39;binance_crawl&#39;, &#39;manual__2023-07-11T10:18:13.187454+00:00&#39;, &#39;--job-id&#39;, &#39;6&#39;, &#39;--raw&#39;, &#39;--subdir&#39;, &#39;DAGS_FOLDER/binance_crawl.py&#39;, &#39;--cfg-path&#39;, &#39;/tmp/tmp7pzfq8yh&#39;]
[2023-07-11T10:18:19.513+0000] {standard_task_runner.py:85} INFO - Job 6: Subtask binance_crawl
[2023-07-11T10:18:19.560+0000] {task_command.py:410} INFO - Running &lt;TaskInstance: binance.binance_crawl manual__2023-07-11T10:18:13.187454+00:00 [running]&gt; on host 0b77f1cca39a
[2023-07-11T10:18:19.895+0000] {taskinstance.py:1547} INFO - Exporting env vars: AIRFLOW_CTX_DAG_OWNER=&#39;airflow&#39; AIRFLOW_CTX_DAG_ID=&#39;binance&#39; AIRFLOW_CTX_TASK_ID=&#39;binance_crawl&#39; AIRFLOW_CTX_EXECUTION_DATE=&#39;2023-07-11T10:18:13.187454+00:00&#39; AIRFLOW_CTX_TRY_NUMBER=&#39;1&#39; AIRFLOW_CTX_DAG_RUN_ID=&#39;manual__2023-07-11T10:18:13.187454+00:00&#39;
[2023-07-11T10:18:20.231+0000] {taskinstance.py:1824} ERROR - Task failed with exception
Traceback (most recent call last):
  File &quot;/home/airflow/.local/lib/python3.7/site-packages/airflow/operators/python.py&quot;, line 181, in execute
    return_value = self.execute_callable()
  File &quot;/home/airflow/.local/lib/python3.7/site-packages/airflow/operators/python.py&quot;, line 198, in execute_callable
    return self.python_callable(<em>self.op_args, *</em>self.op_kwargs)
  File &quot;/opt/airflow/dags/binance_crawl.py&quot;, line 47, in _binance_api
    df.to_csv(f&#39;/home/airflow/data/{file_name}&#39;, index=False)
  File &quot;/home/airflow/.local/lib/python3.7/site-packages/pandas/core/generic.py&quot;, line 3482, in to_csv
    storage_options=storage_options,
  File &quot;/home/airflow/.local/lib/python3.7/site-packages/pandas/io/formats/format.py&quot;, line 1105, in to_csv
    csv_formatter.save()
  File &quot;/home/airflow/.local/lib/python3.7/site-packages/pandas/io/formats/csvs.py&quot;, line 243, in save
    storage_options=self.storage_options,
  File &quot;/home/airflow/.local/lib/python3.7/site-packages/pandas/io/common.py&quot;, line 707, in get_handle
    newline=&quot;&quot;,
PermissionError: [Errno 13] Permission denied: &#39;/home/airflow/data/bccusdt_1month.csv&#39;
[2023-07-11T10:18:20.239+0000] {taskinstance.py:1350} INFO - Marking task as FAILED. dag_id=binance, task_id=binance_crawl, execution_date=20230711T101813, start_date=20230711T101819, end_date=20230711T101820
[2023-07-11T10:18:20.266+0000] {standard_task_runner.py:109} ERROR - Failed to execute job 6 for task binance_crawl ([Errno 13] Permission denied: &#39;/home/airflow/data/bccusdt_1month.csv&#39;; 1315)
[2023-07-11T10:18:20.285+0000] {local_task_job_runner.py:225} INFO - Task exited with return code 1
[2023-07-11T10:18:20.303+0000] {taskinstance.py:2651} INFO - 0 downstream tasks scheduled from follow-on schedule check
airflow@0b77f1cca39a:/opt/airflow/logs/dag_id=binance/run_id=manual__2023-07-11T10:18:13.187454+00:00/task_id=binance_crawl$</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[airflow/docker-compose] Airflow 기본]]></title>
            <link>https://velog.io/@jinman-kim/airflowdocker-compose-Airflow-%EA%B8%B0%EB%B3%B8</link>
            <guid>https://velog.io/@jinman-kim/airflowdocker-compose-Airflow-%EA%B8%B0%EB%B3%B8</guid>
            <pubDate>Thu, 06 Jul 2023 15:46:10 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="docker-compose로-환경-구축하면-서버-금방-띄울-수-있음">Docker-compose로 환경 구축하면 서버 금방 띄울 수 있음!</h3>
<p>DAG개발 외에 관심사를 줄이기 위해 개발 환경을 Docker-compose로 구축
공식홈페이지의 yml 파일 참조</p>
</blockquote>
<h4 id="airflow-서버를-띄우는-시간-단축--5분---1분">Airflow 서버를 띄우는 시간 단축 : 5분 -&gt; 1분</h4>
<h4 id="개발-피드백-루프-시간-단축--1분commit---sync---5초">개발 피드백 루프 시간 단축 : 1분(Commit -&gt; Sync) -&gt; 5초</h4>
<h4 id="개발-클러스터에서-유휴-airflow들이-node를-점유하였던-문제-해결--2개-이상의-vm-절약">개발 클러스터에서 유휴 Airflow들이 Node를 점유하였던 문제 해결 : 2개 이상의 VM 절약</h4>
<h4 id="docker라는-표준-환경을-통해-airflow-서버의-불안정성을-낮추고-관리-비용을-줄임">Docker라는 표준 환경을 통해 Airflow 서버의 불안정성을 낮추고 관리 비용을 줄임</h4>
<p><img src="https://velog.velcdn.com/images/jinman-kim/post/6258cf74-8d68-41dc-98de-e6518fbf7e51/image.png" alt=""></p>
<h1 id="웹서버--스케쥴러--db">웹서버 / 스케쥴러 / DB</h1>
<h3 id="웹서버web-server">웹서버(Web Server):</h3>
<blockquote>
<blockquote>
<p>Airflow 웹서버는 사용자 인터페이스(UI)를 제공하고 데이터 파이프라인의 모니터링, 스케줄링, 실행 등의 작업을 관리합니다. 웹서버는 사용자가 DAG(Directed Acyclic Graph)를 정의하고 관리할 수 있도록 도와줍니다. 웹 인터페이스를 통해 작업의 실행 상태, 로그, 스케줄러 등을 확인하고 관리할 수 있습니다.</p>
</blockquote>
</blockquote>
<h3 id="스케줄러scheduler">스케줄러(Scheduler):</h3>
<blockquote>
<blockquote>
<p>Airflow 스케줄러는 정의된 DAG를 기반으로 작업 실행을 스케줄링합니다. 스케줄러는 설정된 실행 주기 또는 종속성을 기준으로 DAG의 작업들을 적절한 시간에 실행합니다. 스케줄러는 작업 상태를 추적하고 작업 간의 의존성을 관리하여 데이터 파이프라인의 실행을 조정합니다.</p>
</blockquote>
</blockquote>
<h3 id="executor">Executor:</h3>
<blockquote>
<blockquote>
<p>Executor는 Airflow에서 실행 중인 작업들을 처리하는 방식을 정의합니다. Airflow는 LocalExecutor, CeleryExecutor, KubernetesExecutor 등 다양한 Executor를 지원합니다. 각 Executor는 작업을 병렬로 실행하고 관리하는 방식이 다르며, 작업 처리량과 성능에 영향을 줄 수 있습니다.</p>
</blockquote>
</blockquote>
<h3 id="메타데이터-데이터베이스metadata-database">메타데이터 데이터베이스(Metadata Database):</h3>
<blockquote>
<blockquote>
<p>Airflow는 작업, DAG, 실행 상태 등의 메타데이터를 저장하기 위한 데이터베이스가 필요합니다. 메타데이터 데이터베이스는 작업 스케줄링, 실행 상태 추적, 작업 히스토리 등을 관리하는 데 사용됩니다. 일반적으로 SQLite, PostgreSQL, MySQL 등의 데이터베이스가 사용됩니다.</p>
</blockquote>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[빅데이터] DATA : Lake / WareHouse / Mart]]></title>
            <link>https://velog.io/@jinman-kim/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-DATA-Lake-WareHouse-Mart</link>
            <guid>https://velog.io/@jinman-kim/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-DATA-Lake-WareHouse-Mart</guid>
            <pubDate>Thu, 06 Jul 2023 14:41:44 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h1 id="데이터레이크">데이터레이크</h1>
<p>AWS의 서비스들로 구성해놨습니다.</p>
</blockquote>
<h3 id="1-cloud-storage--aws-s3-gcs-azure-blob-storage">1. Cloud Storage ( AWS S3, GCS, Azure Blob Storage)</h3>
<h3 id="2-etl--aws-glue">2. ETL ( AWS Glue)</h3>
<h3 id="3-처리-및-분석-aws-emr--elastic-mapreduce">3. 처리 및 분석( AWS EMR : Elastic MapReduce)</h3>
<h3 id="4-카탈로그-및-메타데이터-관리--aws-glue-data-catalog">4. 카탈로그 및 메타데이터 관리 ( AWS Glue Data Catalog)</h3>
<h4 id="위의-클라우드-서비스들을-보면-알겠지만-데이터레이크는-비정형raw데이터-를-모아놓는-것이다">위의 클라우드 서비스들을 보면 알겠지만, 데이터레이크는 비정형(raw)데이터 를 모아놓는 것이다!!!</h4>
<h4 id="정적-파일jpg-로그-데이터-센서-데이터-등등">정적 파일(jpg) 로그 데이터, 센서 데이터 등등</h4>
<h4 id="근데-웹서버nginx-conf-파일--location에-staticfilehtml-등을-모아-놓는-것은">근데 웹서버(nginx) conf 파일  Location에 staticfile(html) 등을 모아 놓는 것은</h4>
<h4 id="데이터-레이크가-아니다-아시죠-">데이터 레이크가 아니다~ 아시죠 ?!?!?</h4>
<blockquote>
<h1 id="데이터-웨어하우스">데이터 웨어하우스</h1>
<h3 id="전사-차원에서-bibusiness-intelligence로-활용하기-위해">전사 차원에서 BI(Business Intelligence)로 활용하기 위해</h3>
<h1 id="데이터-마트">데이터 마트</h1>
<h3 id="마트는-웨어하우스보다-작죠-그래서-좀더-작은-단위인-부서에서-자체-구축하는-사례입니다">마트는 웨어하우스보다 작죠? 그래서 좀더 작은 단위인 부서에서 자체 구축하는 사례입니다</h3>
<h2 id="위의-dw--dm-구축을-클라우드-플랫폼paas-에서-구축한다면">위의 DW / DM 구축을 클라우드 플랫폼(paas) 에서 구축한다면..?</h2>
</blockquote>
<h4 id="돈이-많이-들지만-책임-전가가-가능하고-안정성이-높고-확장성이-용이하겠죠-ㅎㅎ">돈이 많이 들지만, 책임 전가가 가능하고, 안정성이 높고 확장성이 용이하겠죠 ?ㅎㅎ</h4>
<h3 id="그래서-무슨-서비스냐">그래서 무슨 서비스냐?</h3>
<h1 id="aws-redshift">AWS Redshift,</h1>
<h1 id="google-bigquery">Google BigQuery,</h1>
<h1 id="azure-synapse-analytics">Azure Synapse Analytics</h1>
<h4 id="가-있습니다">가 있습니다.</h4>
<blockquote>
<blockquote>
<h2 id="클라우드-서비스를-빗대서-요약하면-데이터-레이크는-raw-데이터가-s3를-씁니다-용도에-따라-맵리듀스-붙일-수도-있는데-자체-하둡-구축할-수도-있고-emr-쓸-수도-있습니다--웨어하우스는-bi합니다-마트는-부서에서-분석용으로-씁니다-redshift-쓰면-서버리스-서비스라-저렴합니다-비용-산정은-따로-해봐야합니다">클라우드 서비스를 빗대서 요약하면 데이터 레이크는 raw 데이터가 S3를 씁니다. 용도에 따라 맵리듀스 붙일 수도 있는데, 자체 하둡 구축할 수도 있고, EMR 쓸 수도 있습니다.  웨어하우스는 BI합니다. 마트는 부서에서 분석용으로 씁니다. RedShift 쓰면 서버리스 서비스라 저렴합니다 !!(비용 산정은 따로 해봐야합니다.)</h2>
<p>S3, Redshift, EMR 짱이다!!</p>
</blockquote>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[딥러닝/파이토치] m1 pytorch gpu]]></title>
            <link>https://velog.io/@jinman-kim/%EB%94%A5%EB%9F%AC%EB%8B%9D%ED%8C%8C%EC%9D%B4%ED%86%A0%EC%B9%98-m1-pytorch-gpu</link>
            <guid>https://velog.io/@jinman-kim/%EB%94%A5%EB%9F%AC%EB%8B%9D%ED%8C%8C%EC%9D%B4%ED%86%A0%EC%B9%98-m1-pytorch-gpu</guid>
            <pubDate>Sun, 25 Jun 2023 09:05:55 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="m1--pytorch-gpu-활성화하기">m1 , pytorch GPU 활성화하기</h3>
<p>m1, m2 : arm64 아키텍처 사용자라면
텐서플로우와 파이토치로 로컬에서 GPU를 사용하고 싶고
사용할 수 있다!!
하지만 어떻게~?!?!
tensorflow에 관한 게시글은 너무 많아서 패스하고
토치에 대해 간단하게 설명을 하면
일단 Tensorflow 같은 경우는 conda설치( Miniforge) 후에 가상환경 만들고 관리하고 환경변수 설정도 해줬던 것 같음 ( bashrc, export ) 등등
pytorch도 비슷하게 conda에 가상환경 만들었는데 안되는거임 버전이슈인가 했는데.
그래서 그냥 conda 가상환경에서 나오고 </p>
</blockquote>
<pre><code>깨알 conda 명령어
가상환경 종류 확인
conda info --envs
가상환경 생성
conda create --name &lt;이름&gt; &lt;옵션줄수있음,파이썬버전등,나는잘안줌)
가상환경 나오기
conda deactivate</code></pre><p>로컬에 가상환경 python -m venv &lt;가상환경이름&gt;
해서 거기서 </p>
<pre><code>pip install torch
python</code></pre><p>쉘 드가자!!</p>
<pre><code>import torch
torch.backends.mps.is_avaiable()</code></pre><p><img src="https://velog.velcdn.com/images/jinman-kim/post/60ce8106-0503-4102-8d85-d96df570ee5b/image.png" alt="">
True 뜨면 끝!
GPU 활성상태 확인은
is_available() 구절을 참 좋아함 ㅋ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[hadoop/flume] flume 기본]]></title>
            <link>https://velog.io/@jinman-kim/hadoopflume-flume-%EA%B8%B0%EB%B3%B8</link>
            <guid>https://velog.io/@jinman-kim/hadoopflume-flume-%EA%B8%B0%EB%B3%B8</guid>
            <pubDate>Wed, 14 Jun 2023 10:52:12 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="flume-기본">flume 기본</h3>
<p><img src="https://velog.velcdn.com/images/jinman-kim/post/5c65b0e3-1f5d-41c5-83c6-8ef117f36a8e/image.png" alt=""></p>
</blockquote>
<p>여러 was, pod라고 볼수도 있고, 각 was에 Flume Agent를 배치하고
flume으로 갖고오면
Source -&gt; Channel -&gt; Sink 과정을 거쳐서</p>
<ol>
<li>또 다른 Flume Agent를 줄 수도 있고,</li>
<li>ELK(Elastic-Search, Logstash, Kibana) 줄 수도 있고,</li>
<li>하둡+(하이브,슈마허) 줄 수도 있음.
즉 Message Broker 느낌도 있는듯?</li>
</ol>
<p>flume이 kafka랑 비슷해보이는데... 그럼 차이는?</p>
<blockquote>
</blockquote>
<h3 id="flume">Flume:</h3>
<p>데이터 수집 및 로그 전송을 위한 분산 시스템입니다.
Flume은 로그 데이터를 수집하고 신뢰성 있는 방식으로 중앙 집중형 데이터 스토리지 또는 분산 시스템으로 전송합니다.
Agent, Source, Channel, Sink 등으로 구성되며, Source는 데이터 소스에서 데이터를 수집하고, Channel은 데이터를 보관하며, Sink는 데이터를 대상 시스템으로 전송합니다.
주로 로그 파일, 디렉토리, 웹서버 로그 등의 데이터를 수집하고, Hadoop HDFS, Apache HBase, Elasticsearch 등과 같은 시스템으로 전송할 때 사용됩니다.</p>
<h3 id="kafka">Kafka:</h3>
<p>분산 스트리밍 플랫폼으로, 대량의 데이터를 실시간으로 처리하는 데 중점을 둡니다.
메시지 큐 시스템으로, 데이터 스트리밍과 이벤트 처리를 지원합니다.
데이터는 Topic으로 구성된다. Producer가 데이터를 Topic에 전송하고, Consumer가 Topic에서 데이터를 읽을 수 있습니다.
데이터는 영속적으로 보관되며, 다양한 Consumer가 동일한 데이터를 읽을 수 있습니다.
스케일 아웃 및 고가용성에 강점을 가지며, 실시간 데이터 처리, 로그 분석, 웹 애플리케이션 모니터링 등에 사용됩니다.
요약하자면, Flume은 데이터 수집과 전송에 중점을 둔 분산 시스템이고, Kafka는 대량의 실시간 데이터 처리와 이벤트 스트리밍을 위한 분산 스트리밍 플랫폼입니다. Flume은 데이터를 수집하여 다른 시스템으로 전송하는 데 사용되며, Kafka는 메시지 큐 시스템으로 데이터를 실시간으로 처리하고 스트림으로 전달하는 데 사용됩니다. 선택은 사용 사례, 요구 사항 및 아키텍처에 따라 달라집니다.</p>
<blockquote>
<h2 id="하둡">하둡</h2>
<p> 파일 생성, 삭제, append 만 가능 (즉, 수정 불가)</p>
</blockquote>
<h3 id="no-modify">NO MODIFY!!</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AWS/DNS/Route53] Route53]]></title>
            <link>https://velog.io/@jinman-kim/AWSDNSRoute53-Route53</link>
            <guid>https://velog.io/@jinman-kim/AWSDNSRoute53-Route53</guid>
            <pubDate>Wed, 14 Jun 2023 10:52:04 GMT</pubDate>
            <description><![CDATA[<ol>
<li>도메인(naver.com) 네임서버에 접속</li>
<li>네임서버에 연결된 IP 
도메인 -&gt; 네임서버 -&gt; IP 서버 -&gt; 브라우저의 서버 내용 출력</li>
</ol>
<p>구입한 도메인이 &#39;네임서버&#39;
-&gt; .com .net .co.kr .org</p>
<ol start="3">
<li>Route 53 서버 연결하기 (S3)
2개 네임서버 (www 붙이고 / 안 붙이고)
www.웹사이트이름.com
웹사이트.com
S3: 정적 웹사이트 호스팅(nginx 에서 location에 담아 놓은
static 파일: html템플릿 서빙)<ol>
<li>Overview에 html 파일들 담기</li>
<li>Properties 에 Static website hosting 활성화</li>
<li>Index document에 업로드한 파일 이름 입력(index.html)</li>
<li>Permissions 탭  Bucket Policy에서 GetObject 허용하는 Policy JSON 작성
<img src="https://velog.velcdn.com/images/jinman-kim/post/9b230e39-3959-4a75-bdfe-cbd8c36ab003/image.png" alt=""></li>
</ol>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[명령어모음집]]]></title>
            <link>https://velog.io/@jinman-kim/%EB%AA%85%EB%A0%B9%EC%96%B4%EB%AA%A8%EC%9D%8C%EC%A7%91</link>
            <guid>https://velog.io/@jinman-kim/%EB%AA%85%EB%A0%B9%EC%96%B4%EB%AA%A8%EC%9D%8C%EC%A7%91</guid>
            <pubDate>Thu, 25 May 2023 05:11:31 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h1 id="linux">Linux</h1>
</blockquote>
<pre><code class="language-linux">파일 만들고 쓰기
vi &lt;filename&gt;
-파일 만들고만 싶을 때
touch &lt;filename&gt;
touch와 vi의 차이는 vi는 파일을 만들고 쓰러 들어가고
touch는 만들어만 놓는다. 쓰러 안들어감( 톡, 터치해서 만들기만한다고 생각하면 편함)
-디렉토리(폴더)를 만들고 파일을 만들때 종종쓰는 커맨드
test폴더에 test1, test2, test3 파일을 만들기
test폴더도 만들어야 한다
-폴더 만들기
mkdir test
-파일 만들기
cd test
touch test1.py
touch test2.py
touch test3.py
간략하게 써보면
mkdir test &amp;&amp; cd test &amp;&amp; touch test1.py test2.py test3.py &amp;&amp; cd ..
1.폴더생성 - &gt; 2. 폴더로 이동 -&gt; 
3. 파일 3개 만들기(띄어쓰기하면 여러개 생성할 수 있음)-&gt; 4. 다시 돌아오기
- 파일 지울때
remove 커맨드
rm -r (--recursive 재귀적으로 삭제)
rm -f 강력한 삭제
rm -rf 완전 강력한 삭제
폴더, 파일 다 삭제 가능
정리를 하면
파일 하나 없앨 때는
rm &lt;filename&gt;
폴더를 지울 때는(파일만 삭제도 가능함)
rm -r &lt;foldername&gt;
폴더 안에 있는 파일이 여러개여서 이걸 재귀적으로 방문하면서 지우는 거라
-r옵션임
근데 잘안지워지면
rm -rf &lt;foldername&gt;
현재 위치에서 여기에 있는 모든 파일, 폴더를 지우고 싶을때
rm -rf *
*은 항상 와일드 카드 느낌
rm -i &lt;filename&gt;
i 옵션은 파일을 삭제할때 os가 저에게 재차 확인합니다
삭제하시겠습니까? 대화를 하기때문에 i는 interactive의 약자입니다.
rm -rif
rm -irf
rm -ifr 
다 똑같습니다 -에 옵션주는 건 순서 상관 없이 들어갑니다
즉 위의 명령어는 &quot;강력하게&quot; &quot;재귀적으로&quot; &quot;삭제할지 물어보며&quot;
삭제하는 명령어입니다.
-뒤에 옵션 여러개 주는 것과 순서가 상관 없단 것 중요!
</code></pre>
]]></description>
        </item>
    </channel>
</rss>