<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>쫄보의삽질 블로그</title>
    <link>https://ninano1109.tistory.com/</link>
    <description>쫄보가 삽질하는 과정을 담은 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Sat, 20 Jun 2026 14:40:34 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>쫄보삽질러</managingEditor>
    <image>
      <title>쫄보의삽질 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/3897187/attach/5d3484ce54684cbb95efa08f533f0a58</url>
      <link>https://ninano1109.tistory.com</link>
    </image>
    <item>
      <title>Airflow 3.0.1 remote logging 에러 해결</title>
      <link>https://ninano1109.tistory.com/307</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;기존 2.10.3 버전을 사용중이던 Airflow를 3점대 버전으로 업그레이드 하는 과정에서 마주한 에러해결 과정을 공유해봅니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;⚙️ 개발 환경&lt;br&gt;airflow를 ECS에서 멀티클러스터로 구축했습니다.&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;api-server&lt;/li&gt;&lt;li&gt;scheduler&lt;/li&gt;&lt;li&gt;dag-processor&lt;/li&gt;&lt;li&gt;worker(CeleryExecutor)&lt;/li&gt;&lt;li&gt;redis&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;Airflow UI에서 DAG 실행을 하면&lt;br&gt;1. DAG run이 생성이 되고 metadata DB에 &lt;b&gt;queued&lt;/b&gt; 상태로 저장됨&lt;br&gt;2. dag-processor가 DAG를 파싱하고 DB내 DAG의 metadata 업데이트 함&lt;br&gt;3. Scheduler가 DB를 감지하고 있다가 queued task 정보(DAG ID, task ID, execution date, etc.)를 redis에 메세지로 보냄&lt;br&gt;4. 이 task는 Celery worker가 가져가서 작업할 수 있게 &quot;available&quot; 상태가 됨&lt;br&gt;5. Celery worker는 redis 큐에서 task 메세지를 가져가서 실행하고, DB에 running 상태로 업데이트 함&lt;br&gt;6. 작업 종료 후 DB에 task 상태를 success/fail로 업데이트하고 이후 작업이 남아있다면 Scheduler가 다시 체크하는 식의 반복&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;이러한 프로세스로 DAG가 실행되는데, 5번 worker가 작업을 실행하면 로컬 경로에 로그파일을 저장합니다.&lt;br&gt;하지만 컨테이너 기반의 서비스를 운영할 때의 문제점인 &lt;b&gt;특정 서버 의존성&lt;/b&gt;을 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;방지&lt;/b&gt;&lt;/span&gt;하기 위해&amp;nbsp;&lt;br&gt;&quot;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;중앙 집중식 로그 저장&lt;/b&gt;&lt;/span&gt;&quot;인 s3 remote logging 방식을 사용하려고 합니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;이 때 로그 저장 및 read 프로세스는&lt;br&gt;1. airflow.cfg에 &lt;span style=&quot;color: #569cd6;&quot;&gt;remote_logging&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;= True&amp;nbsp;&amp;nbsp;&lt;/span&gt;를 설정했다면 retmote logging에서 read 먼저 시도&lt;br&gt;2. remote logging이 실패해서 읽어들이지 못한다면, falls back to local 로컬 경로에서 읽기 시도&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;다음은 remote logging 설정 방법입니다:&lt;/p&gt;&lt;blockquote data-ke-style=&quot;style3&quot;&gt;# airflow.cfg&lt;br&gt;remote_logging= True&lt;br&gt;&lt;br&gt;remote_log_conn_id = s3_conn&lt;br&gt;remote_base_log_folder = s3://airflow-logs&amp;nbsp; # 로그 저장할 버킷 경로&amp;nbsp;&lt;br&gt;&lt;br&gt;delete_local_logs = False&amp;nbsp; # 로그 삭제는 기본으로 허용하지 않음&lt;br&gt;remote_task_handler_kwargs = {&quot;delete_local_copy&quot;: true}&amp;nbsp; # remote logging에 성공했을 시 로그 삭제&lt;/blockquote&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;remote_log_conn_id&lt;/span&gt;&lt;/span&gt;에는 airflow connections에 추가할 변수명을 입력하고 airflow connections에도 다음과 같이 추가합니다.&lt;/p&gt;&lt;blockquote data-ke-style=&quot;style3&quot;&gt;--airflow CLI&lt;br&gt;airflow connections add 's3_conn'&amp;nbsp; --conn-type 'aws'&amp;nbsp; --conn-extra '{&quot;region&quot;: &quot;ap-northeast-2&quot;}'&amp;nbsp;&lt;/blockquote&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;*airflow 2.x 버전에서는 conn-type이 's3'였지만, 3점대 부터는 'aws'로 변경해줄 것&lt;br&gt;AWS IAM role을 사용하면 직접&amp;nbsp;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #353638;&quot;&gt;Access Key와 Secret Access Key를 사용하지 않아도 됨으로 보안상 안전함!&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #353638;&quot;&gt;위와 같이 설정을 하고 난 이후에도 DAG task를 실행하면 계속 fail이 났는데 에러를 보면,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;# UI 실행
::group::Log message source details: sources=[&quot;Could not read served logs: Invalid URL 'http://:8793/log/dag_id=init_test_3.0.1/run_id=manual__2025-05-22T01:53:43.876152+00:00/task_id=print_time/attempt=1.log': No host supplied&quot;]
&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# webserver container cli
- test/success
details: sources=[&quot;Could not read served logs: HTTPConnectionPool(host='ip-172-XX-X-XXX.ap-northeast-2.compute.internal', port=8793): Max retries exceeded with url: /log/dag_id=init_test_3.0.1/run_id=manual__2025-05-22T02:23:08.251172+00:00/task_id=print_time/attempt=1.log (Caused by NewConnectionError('&amp;lt;urllib3.connection.HTTPConnection object at 0xffff795e7080&amp;gt;: Failed to establish a new connection: [Errno 111] Connection refused'))&quot;]

- trigger/fail
details: sources=[&quot;Could not read served logs: Invalid URL 'http://:8793/log/dag_id=init_test_3.0.1/run_id=manual__2025-05-22T02:23:51.280531+00:00_chCfWUle/task_id=print_day/attempt=1.log': No host supplied&quot;]&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# worker container cli
- test/success
details: sources=[&quot;Could not read served logs: 404 Client Error: NOT FOUND for url: &amp;lt;http://ip-172-XX-X-XXX.ap-northeast-2.compute.internal:8793/log/dag_id=init_test_3.0.1/run_id=manual__2025-05-22T02:27:10.433362+00:00/task_id=print_time/attempt=1.log&amp;gt;&quot;]

- trigger/fail
details: sources=[&quot;Could not read served logs: Invalid URL 'http://:8793/log/dag_id=init_test_3.0.1/run_id=manual__2025-05-22T02:27:45.665350+00:00_QmabUKOl/task_id=print_time/attempt=1.log': No host supplied&quot;]&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;UI에서도 실행해보고, airflow cli로 airflow dags test와 trigger로도 실행해봐도&lt;br&gt;worker host를 찾지못하거나 connection error가 발생했습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;worker container 로그를 보면, task가 killed되어 죽는 것을 볼 수 있었고, 405 Method Not Allowed 에러를 발견했습니다.&lt;br&gt;또한 컨테이너 logs/ 경로 아래에도 보면 로그 파일은 쌓이지만, 빈 로그 파일이었기 때문에,&lt;br&gt;task를 실행하기도 전에 죽어서 task를 실행하지 못하고 있음을 볼 수 있었습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;또 다른 에러로는 scheduler container 로그에서 &lt;span style=&quot;background-color: #000000;&quot;&gt;&lt;span style=&quot;color: #1f2328;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;not_found in serialized_dag table &lt;/span&gt;&lt;/span&gt;에러를 발견했는데&amp;nbsp;&lt;br&gt;scheduler container log:&lt;/p&gt;&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt; ERROR - DAG 'init_test_3.0.1' for task instance &amp;lt;TaskInstance: init_test_3.0.1.print_time manual__2025-05-23T01:11:24.335987+00:00 [queued]&amp;gt; not found in serialized_dag table&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;해당 DAG를 찾지 못하는 것 같아서 DB에 serialized_dag 테이블을 확인해보면 DAG가 잘 저장되어 있었습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;그래서 refresh 차원에서 airflow db migrate와 airflow dags reserialize를 실행해 봤지만, 결과는 똑같았습니다..&lt;br&gt;&amp;nbsp;&lt;br&gt;그러다가!! 찾은 한줄기 빛!! ✨&amp;nbsp;&lt;br&gt;&lt;a href=&quot;https://github.com/apache/airflow/issues/50191&quot; target=&quot;_self&quot;&gt;&lt;span&gt;https://github.com/apache/airflow/issues/50191&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;base_url gives state mismatch and task fail error. · Issue #50191 · apache/airflow&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;Apache Airflow version 3.0.0 If &amp;quot;Other Airflow 2 version&amp;quot; selected, which one? No response What happened? Recently, I upgraded Airflow from 2.10 to 3.0. I've deployed Airflow behind Nginx. I was ab...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/apache/airflow/issues/50191&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bl7vXb/hyYWYQh8x2/NjjdoSXc9ZS0VrdtNHe4UK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/biOxkT/hyY093p4UO/c9oekBK6jbnuC07EUAcWKK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot; data-og-url=&quot;https://github.com/apache/airflow/issues/50191&quot;&gt;&lt;a href=&quot;https://github.com/apache/airflow/issues/50191&quot; target=&quot;_blank&quot; data-source-url=&quot;https://github.com/apache/airflow/issues/50191&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bl7vXb/hyYWYQh8x2/NjjdoSXc9ZS0VrdtNHe4UK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/biOxkT/hyY093p4UO/c9oekBK6jbnuC07EUAcWKK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600')&quot;&gt; &lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;base_url gives state mismatch and task fail error. · Issue #50191 · apache/airflow&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;Apache Airflow version 3.0.0 If &quot;Other Airflow 2 version&quot; selected, which one? No response What happened? Recently, I upgraded Airflow from 2.10 to 3.0. I've deployed Airflow behind Nginx. I was ab...&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;airflow git issue로 올라온 비슷한 케이스를 발견하고&amp;nbsp;아래 방법을 시도해봤습니다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1898&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nUmWv/btsOaUyp8Wj/Yx3XtSKy5laxSWztIJolfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nUmWv/btsOaUyp8Wj/Yx3XtSKy5laxSWztIJolfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nUmWv/btsOaUyp8Wj/Yx3XtSKy5laxSWztIJolfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnUmWv%2FbtsOaUyp8Wj%2FYx3XtSKy5laxSWztIJolfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1898&quot; height=&quot;318&quot; data-origin-width=&quot;1898&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;✅ 해결 방안&lt;br&gt;처음 3버전으로 setting 후 dag를 실행했을 때 발생한 worker 에러가 있었는데,&lt;/p&gt;&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;AirflowConfigException: section/key [core/execution_api_server_url] not found in config&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;Airflow 3.0+에서는 CeleryExecutor를 사용하면 worker가 webserver에 호출될 때&amp;nbsp;&lt;b&gt;execution API endpoint&lt;/b&gt;로 호출되므로,&lt;br&gt;API가 아래와 같이 airflow.cfg에 추가가 되어야 합니다:&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;[core]
execution_api_server_url = http://&amp;lt;your-webserver-host&amp;gt;:8080&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;그래서 처음 초반에 &amp;lt;url&amp;gt;:8080으로 설정해놨었는데&lt;br&gt;default(주석처리)라면 endpoint path에 &amp;lt;base_url&amp;gt;/execution/ 이 붙겠지만,&lt;br&gt;custom하게 설정하면 뒤에 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;/execution/&lt;/b&gt;&lt;/span&gt;을 붙여주어야 했습니다.&lt;/p&gt;&lt;blockquote data-ke-style=&quot;style3&quot;&gt;[core]&lt;br&gt;execution_api_server_url = http://&amp;lt;url&amp;gt;:8080/execution/&lt;/blockquote&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;그래서 제가 마주한 에러를 순서대로 나열하자면, 이렇게 정리해 볼 수 있을 것 같습니다.&lt;br&gt;host not found &amp;gt; scheduler mark task state fail &amp;gt; no worker instace recorded&amp;gt; scheduler log &lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;not_found in serialized_dag table&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;에러 해결 과정에서 등록한 github issue도 공유합니다!&lt;br&gt;&lt;a href=&quot;https://github.com/apache/airflow/issues/50866&quot; target=&quot;_self&quot;&gt;&lt;span&gt;https://github.com/apache/airflow/issues/50866&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;remote logging for s3 fails while still looking for internal logs · Issue #50866 · apache/airflow&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;Apache Airflow version 3.0.1 If &amp;quot;Other Airflow 2 version&amp;quot; selected, which one? No response What happened? After upgrading to airflow 3.0.1, remote logging is not working as intended. I have set air...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/apache/airflow/issues/50866&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b2PAyu/hyYYyKv13y/CKfAk2dKV3hRaVcritJUmK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/LWtMI/hyY0qK8O40/K6rprbkLWJk7WMVICu3Ckk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot; data-og-url=&quot;https://github.com/apache/airflow/issues/50866&quot;&gt;&lt;a href=&quot;https://github.com/apache/airflow/issues/50866&quot; target=&quot;_blank&quot; data-source-url=&quot;https://github.com/apache/airflow/issues/50866&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b2PAyu/hyYYyKv13y/CKfAk2dKV3hRaVcritJUmK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/LWtMI/hyY0qK8O40/K6rprbkLWJk7WMVICu3Ckk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600')&quot;&gt; &lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;remote logging for s3 fails while still looking for internal logs · Issue #50866 · apache/airflow&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;Apache Airflow version 3.0.1 If &quot;Other Airflow 2 version&quot; selected, which one? No response What happened? After upgrading to airflow 3.0.1, remote logging is not working as intended. I have set air...&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;- 이상 오늘의 삽질일기 끄읏 &lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: center;&quot;&gt;&lt;i&gt;&lt;b&gt;여기저기 삽질도 해보고&lt;/b&gt;&lt;/i&gt;&lt;br&gt;&lt;i&gt;&lt;b&gt;날려도 먹으면서&lt;/b&gt;&lt;/i&gt;&lt;br&gt;&lt;i&gt;&lt;b&gt;배우는 게&lt;/b&gt;&lt;/i&gt;&lt;br&gt;&lt;i&gt;&lt;b&gt;결국 남는거다&lt;/b&gt;&lt;/i&gt;&lt;br&gt;&lt;i&gt;-&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;Z.Sabziller&lt;/i&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Airflow</category>
      <category>airflow 3.0</category>
      <category>airflow 업그레이드</category>
      <category>remote logging</category>
      <author>쫄보삽질러</author>
      <guid isPermaLink="true">https://ninano1109.tistory.com/307</guid>
      <comments>https://ninano1109.tistory.com/307#entry307comment</comments>
      <pubDate>Sun, 25 May 2025 11:57:23 +0900</pubDate>
    </item>
    <item>
      <title>Crontab 설치가 실패한다면? 마지막 줄에 줄바꿈 체크하기!</title>
      <link>https://ninano1109.tistory.com/299</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-바쁜 현대인들을 위한 한 줄 summary-&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lsquo;newline before EOF&amp;rsquo; 오류 해결: 줄바꿈 문자 확인하기&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;crontab을 docker container에서 실행하기 위해&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;아래의 명령어를 &lt;/span&gt;Dockerfile에 추가하고 image 빌드하는 순간,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;RUN crontab -u airflow /opt/crontab.sh&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;/opt/crontab.sh 파일을 &quot;airflow&quot; user의 crontab(cron 잡)으로 설정하기 위한 명령어&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 에러가 발생했습니다. &lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;gt; [4/9] RUN crontab -u airflow /opt/crontab.sh &amp;amp;&amp;amp; chmod u+s /usr/sbin/cron: #6 0.344 new crontab file is missing newline before EOF, can't install. ------ executor failed running [/bin/bash -o pipefail -o errexit -o nounset -o nolog -c crontab -u airflow /opt/crontab.sh &amp;amp;&amp;amp; chmod u+s /usr/sbin/cron]: exit code: 1&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, crontab.sh 파일에 줄바꿈 문자가 빠져있음을 의미하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맨 마지막줄에 띄어쓰기(엔터)를 해주면 깔끔하게 해결쓰.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 다른 방법으로는,&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;RUN echo &amp;gt;&amp;gt; /opt/crontab.sh&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. cron job 스크립트 파일에 빈 줄을 추가해주거나&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;RUN sed -i -e '$a\' /opt/crontab.sh&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 파일 마지막에 newline이 있는지 체크하고 없으면 추가하는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;으로 해결할 수 있는데, crontab이나 JSON, Dockerfile과 같이 명령어의 구조가 명확한 파일 타입의 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번을 더 추천드립니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style1&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;여기저기 삽질도 해보고&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;날려도 먹으면서&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;배우는 게&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;결국 남는거다&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;Z.Sabziller&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발Tip</category>
      <category>crontab</category>
      <category>dockerfile</category>
      <category>EOF</category>
      <author>쫄보삽질러</author>
      <guid isPermaLink="true">https://ninano1109.tistory.com/299</guid>
      <comments>https://ninano1109.tistory.com/299#entry299comment</comments>
      <pubDate>Sun, 5 Jan 2025 15:43:06 +0900</pubDate>
    </item>
    <item>
      <title>python multiprocessing Pool을 활용한 데이터 병렬 처리</title>
      <link>https://ninano1109.tistory.com/298</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  배경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tfidf 추천 모델의 cosine 유사도 추출 후 추천 결과를 뽑기 위한 단계에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16만건의 유저 데이터를 처리하기 위한 분산처리 및 최적화가 필요했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  해결방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python의  threading은 GIL(Global Interpreter Lock) 기능 때문에 병렬처리가 어려움으로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;여러 작업을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;효율적으로 병렬 처리&lt;/b&gt;할 수 있는 방식인 multiprocessing.Pool을 활용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ninano1109.tistory.com/294&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ninano1109.tistory.com/294&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742564939389&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;multithread vs multiprocess (feat. Process, Pool 비교)&quot; data-og-description=&quot;멀티스레드와 멀티프로세스는 모두 데이터 병렬처리를 위한 python 모듈로 약간의 차이점과 용도별 차이가 있습니다.&amp;nbsp;스레드 vs 프로세스스레드하나의 프로세스 안에 여러개의 스레드 존재4가지&quot; data-og-host=&quot;ninano1109.tistory.com&quot; data-og-source-url=&quot;https://ninano1109.tistory.com/294&quot; data-og-url=&quot;https://ninano1109.tistory.com/294&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eMwhDL/hyYuc8u6R3/cr2HepB1kLBgPM8euQyIFK/img.png?width=800&amp;amp;height=323&amp;amp;face=0_0_800_323,https://scrap.kakaocdn.net/dn/cneeYI/hyYuqr9GRC/hYi9bQW9YeRmeXqjfBf8kk/img.png?width=800&amp;amp;height=323&amp;amp;face=0_0_800_323,https://scrap.kakaocdn.net/dn/pAg2f/hyYvnuNXh5/5v3jjVhzIH9c95vSwB8at0/img.png?width=1514&amp;amp;height=880&amp;amp;face=0_0_1514_880&quot;&gt;&lt;a href=&quot;https://ninano1109.tistory.com/294&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ninano1109.tistory.com/294&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eMwhDL/hyYuc8u6R3/cr2HepB1kLBgPM8euQyIFK/img.png?width=800&amp;amp;height=323&amp;amp;face=0_0_800_323,https://scrap.kakaocdn.net/dn/cneeYI/hyYuqr9GRC/hYi9bQW9YeRmeXqjfBf8kk/img.png?width=800&amp;amp;height=323&amp;amp;face=0_0_800_323,https://scrap.kakaocdn.net/dn/pAg2f/hyYvnuNXh5/5v3jjVhzIH9c95vSwB8at0/img.png?width=1514&amp;amp;height=880&amp;amp;face=0_0_1514_880');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;multithread vs multiprocess (feat. Process, Pool 비교)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;멀티스레드와 멀티프로세스는 모두 데이터 병렬처리를 위한 python 모듈로 약간의 차이점과 용도별 차이가 있습니다.&amp;nbsp;스레드 vs 프로세스스레드하나의 프로세스 안에 여러개의 스레드 존재4가지&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ninano1109.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pool의 장점으로는:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;1. 미리 지정된 수의 프로세스 생성 후 프로세스 풀에서 작업 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;2. 작업이 완료된 프로세스는 다시 풀에 반환되어 작업을 재실행하므로 프로세스 풀의 재사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;3. 배치 작업 시 유용하며 효율적인 자원 사용이 가능하며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;4. 이 모든 프로세스를 자동으로 관리해줌이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;process_chunks&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;num_processes&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;chunk_size&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3000&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; results&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[]&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; &amp;nbsp; with&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;mp&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Pool&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;processes&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;num_processes&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;pool&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;tqdm&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;range&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;),&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;chunk_size&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)):&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; chunk&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;chunk_size&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;pool&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;imap_unordered&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;work&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;chunk&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;):&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; results&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; pool&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;close&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; pool&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; &amp;nbsp; return&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;results&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pool을 사용해 병렬 작업을 위한 함수를 만들어줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1. 먼저 병렬처리를 위해 데이터를 청크 사이즈 3000으로 나누어 전체 데이터를 3000개씩 쪼개어 작업을 병렬로 처리합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2. mp.Pool로 멀티프로세싱을 위한 풀을 생성하고&amp;nbsp;num_processes 수 만큼 프로세스를 병렬로 생성하여 작업을 처리합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 3. 청크 사이즈로 쪼갠 데이터를 pool.imap_unordered를 사용하여 병렬로 work 함수를 실행 후 결과 값 results에 저장합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &lt;b&gt;imap&lt;/b&gt;은 한 번에 모든 데이터 처리하지 않고, 필요한 시점에 결과 생성 =&amp;gt; 대용량 데이터 처리 시 메모리 사용 최적화!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 4. 더 이상 추가 작업이 남아 있지 않다면 pool을 종료하고, pool.join()으로 모든 프로세스가 끝날 때까지 기다립니다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;work&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(user&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;_pair&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;):&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; user&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; user&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;_pair&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; top_view_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; user&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;_pair&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;#Top 5&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&amp;nbsp; &amp;nbsp; # 해당 user가 조회한 전체 item&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; view_all_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; view_all_dict[user&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; temp_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; []&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; &amp;nbsp; for&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;top_view_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; recomm_&lt;span style=&quot;background-color: #1f1f1f; color: #9cdcfe; text-align: start;&quot;&gt;item&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; cosine_sim_df.loc[&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;span style=&quot;background-color: #1f1f1f; color: #9cdcfe; text-align: start;&quot;&gt;item&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)].drop_duplicates().sort_values(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;ascending&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;False&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)[:&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; recomm_&lt;span style=&quot;background-color: #1f1f1f; color: #9cdcfe; text-align: start;&quot;&gt;item&lt;/span&gt;_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;zip&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;recomm_&lt;span style=&quot;background-color: #1f1f1f; color: #9cdcfe; text-align: start;&quot;&gt;item&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.index, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;recomm_&lt;span style=&quot;background-color: #1f1f1f; color: #9cdcfe; text-align: start;&quot;&gt;item&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)) &lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;#index = &lt;span style=&quot;background-color: #1f1f1f; color: #9cdcfe; text-align: start;&quot;&gt;item&lt;/span&gt;, recomm_&lt;span style=&quot;background-color: #1f1f1f; color: #9cdcfe; text-align: start;&quot;&gt;item&lt;/span&gt; = 유사도&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 추천 대상 item 중 본 item, 추천 대상 리스트 중복, 유사도 1 제외&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; final_recomm_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;r&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;r&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;recomm_&lt;span style=&quot;background-color: #1f1f1f; color: #9cdcfe; text-align: start;&quot;&gt;item&lt;/span&gt;_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;r&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;not&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;view_all_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;and&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;r&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;not&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;temp_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;and&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;r&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]) &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; temp_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;extend&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;final_recomm_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; except&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Exception&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pass&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; new_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;temp_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;))&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; new_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;sort&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;lambda&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;], &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;reverse&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; final_list&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;new_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[:&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; recomm_df&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; pd.DataFrame(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;final_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;columns&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'&lt;span style=&quot;background-color: #1f1f1f; color: #9cdcfe; text-align: start;&quot;&gt;item&lt;/span&gt;'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'cos_sim'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;])&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; recomm_df&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.insert(&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'user'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, user&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; &amp;nbsp; return&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;recomm_df&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 데이터 작업을 위한 work 함수를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;1. user가 가장 많이 조회한 item top 5와 조회한 전체 item 리스트를 저장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;2. top_view_list의 아이템 각각에 대하여 코사인 유사도 데이터프레임에서 가장 유사한 12개의 추천 대상 아이템을 가져옵니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; * (5X12= 총 60개의 추천 대상 아이템 추출하기)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;3. 위 추천 대상 아이템 중에서 user가 이미 본 아이템이거나, 중복된 아이템이거나, 유사도가 1인(스펙이 똑같은) 아이템은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;제외한 나머지를 최종 추천 아이템 리스트에 저장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;4. 어느정도 추려진 추천 대상 중 유사도가 높은 순으로 정렬하여 최종적으로 12개의 item을 뽑아서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pandas 데이터프레임으로 반환하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;nbsp;최종코드&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;tqdm&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;tqdm&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;multiprocessing&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;mp&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;work&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(user&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;_pair&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; user&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;user&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;_pair&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; top_view_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;user&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;_pair&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;#Top 5&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&amp;nbsp; &amp;nbsp; # 해당 user가 조회한 전체 item&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; view_all_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;view_all_dict[user&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; temp_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[]&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; &amp;nbsp; for&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;top_view_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; recomm_&lt;span style=&quot;background-color: #1f1f1f; color: #9cdcfe; text-align: start;&quot;&gt;item&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;cosine_sim_df.loc[&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;span style=&quot;background-color: #1f1f1f; color: #9cdcfe; text-align: start;&quot;&gt;item&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)].drop_duplicates().sort_values(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;ascending&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;False&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)[:&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; recomm_&lt;span style=&quot;background-color: #1f1f1f; color: #9cdcfe; text-align: start;&quot;&gt;item&lt;/span&gt;_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;zip&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;recomm_&lt;span style=&quot;background-color: #1f1f1f; color: #9cdcfe; text-align: start;&quot;&gt;item&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.index,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;recomm_&lt;span style=&quot;background-color: #1f1f1f; color: #9cdcfe; text-align: start;&quot;&gt;item&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;))&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;#index =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #1f1f1f; color: #9cdcfe; text-align: start;&quot;&gt;item&lt;/span&gt;, recomm_&lt;span style=&quot;background-color: #1f1f1f; color: #9cdcfe; text-align: start;&quot;&gt;item&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;= 유사도&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 추천 대상 item 중 본 item, 추천 대상 리스트 중복, 유사도 1 제외&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; final_recomm_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;r&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;r&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;recomm_&lt;span style=&quot;background-color: #1f1f1f; color: #9cdcfe; text-align: start;&quot;&gt;item&lt;/span&gt;_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;r&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;not&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;view_all_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;and&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;r&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;not&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;temp_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;and&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;r&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;])&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; temp_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;extend&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;final_recomm_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; except&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Exception&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pass&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; new_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;temp_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;))&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; new_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;sort&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;lambda&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;],&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;reverse&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; final_list&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;new_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[:&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; recomm_df&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;pd.DataFrame(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;final_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;columns&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'&lt;span style=&quot;background-color: #1f1f1f; color: #9cdcfe; text-align: start;&quot;&gt;item&lt;/span&gt;'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'cos_sim'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;])&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; recomm_df&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.insert(&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'user'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, user&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; &amp;nbsp; return&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;recomm_df&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;process_chunks&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;num_processes&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;chunk_size&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3000&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; results&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[]&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; &amp;nbsp; with&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;mp&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Pool&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;processes&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;num_processes&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;pool&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;tqdm&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;range&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;),&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;chunk_size&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)):&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; chunk&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;chunk_size&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;pool&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;imap_unordered&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;work&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;chunk&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;):&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; results&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; pool&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;close&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;nbsp; &amp;nbsp; pool&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div style=&quot;color: #cccccc; text-align: start;&quot;&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; &amp;nbsp; return&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;results&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;num_processes&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;mp&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;cpu_count&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;#712 cores&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;results&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;process_chunks&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(user_recomm_list, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;num_processes&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;all_user&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; pd.concat(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;results&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;ignore_index&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총 코어 수 712개와 청크 사이즈 3000으로 설정했을 때,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저 수 16만개에 대한 병렬 처리 작업의 소요 시간을 9분 정도로 줄일 수 있었습니다!(기존: days+&lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: start;&quot;&gt;'&amp;alpha;'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-03-21 at 10.20.41 PM.png&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUiuzS/btsMSPj4S2U/W9G5rDo8KBsOtKnG7XkSp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUiuzS/btsMSPj4S2U/W9G5rDo8KBsOtKnG7XkSp1/img.png&quot; data-alt=&quot;multiprocess.Pool을 활용한 병렬처리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUiuzS/btsMSPj4S2U/W9G5rDo8KBsOtKnG7XkSp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUiuzS%2FbtsMSPj4S2U%2FW9G5rDo8KBsOtKnG7XkSp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;824&quot; height=&quot;126&quot; data-filename=&quot;Screenshot 2025-03-21 at 10.20.41 PM.png&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;126&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;multiprocess.Pool을 활용한 병렬처리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style1&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;당신이 어떤 것을&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;할머니에게 설명해주지 못한다면,&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span&gt;&lt;b&gt;그것은 진정으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;&lt;b&gt;이해한 것이 아니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span&gt;- A.Einstein&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>MLOps</category>
      <category>multiprocessing</category>
      <category>pool</category>
      <category>Python</category>
      <category>멀티프로세스</category>
      <category>병렬처리</category>
      <author>쫄보삽질러</author>
      <guid isPermaLink="true">https://ninano1109.tistory.com/298</guid>
      <comments>https://ninano1109.tistory.com/298#entry298comment</comments>
      <pubDate>Sun, 8 Dec 2024 21:59:51 +0900</pubDate>
    </item>
    <item>
      <title>[Airflow] Airflow db 업그레이드 에러 해결(feat. 2.10.0 버전)</title>
      <link>https://ninano1109.tistory.com/297</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;airflow db upgrade 명령어 실행 시,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;(airflow 2.7.0 대 버전 부터 airflow db upgrade -&amp;gt; airflow db migrate)&lt;/p&gt;
&lt;pre id=&quot;code_1730183705048&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;[SQL: ALTER TABLE dag_run ADD COLUMN clear_number INTEGER DEFAULT '0' NOT NULL]
ERROR:  column &quot;clear_number&quot; of relation &quot;dag_run&quot; already exists&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;위와 같은 에러가 발생함&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;db 접속 후 해당 컬럼을 삭제해주고(저는 metadata db로 postgresql을 사용했습니다)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;ALTER&amp;nbsp;TABLE&amp;nbsp;dag_run&amp;nbsp;DROP&amp;nbsp;COLUMN&amp;nbsp;IF&amp;nbsp;EXISTS&amp;nbsp;clear_number;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;다시 airflow db upgrade 명령어를 실행하면,&lt;/p&gt;
&lt;pre id=&quot;code_1730183705049&quot; class=&quot;pgsql&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;ALTER TABLE log ADD COLUMN owner_display_name VARCHAR(500);
ERROR:  column &quot;owner_display_name&quot; of relation &quot;log&quot; already exists&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1730183705050&quot; class=&quot;subunit&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;ALTER TABLE import_error ADD COLUMN processor_subdir VARCHAR(2000);
ERROR:  column &quot;processor_subdir&quot; of relation &quot;import_error&quot; already exists&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이런식으로 해당 컬럼을 삭제해도 다른 컬럼이 없다는 에러 계속 반복..&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;airflow_db=&amp;gt;&amp;nbsp;SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;alembic_version;&lt;/p&gt;
&lt;pre id=&quot;code_1730183705050&quot; class=&quot;asciidoc&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt; version_num
--------------
 405de8318b3a&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://airflow.apache.org/docs/apache-airflow/2.10.0/migrations-ref.html&quot;&gt;https://airflow.apache.org/docs/apache-airflow/2.10.0/migrations-ref.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;405de8318b3a는&amp;nbsp;기존&amp;nbsp;2.7.0점&amp;nbsp;대&amp;nbsp;버전의&amp;nbsp;Revision&amp;nbsp;ID&amp;nbsp;이고,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;다음&amp;nbsp;버전인&amp;nbsp;2.8.0점&amp;nbsp;버전으로&amp;nbsp;업데이트&amp;nbsp;하는&amp;nbsp;과정에서&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;add&amp;nbsp;new&amp;nbsp;field&amp;nbsp;&amp;lsquo;clear_number&amp;rsquo;&amp;nbsp;to&amp;nbsp;dagrun&amp;nbsp;명령을&amp;nbsp;실해하던&amp;nbsp;중&amp;nbsp;에러&amp;nbsp;발생.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=&amp;gt; 바로 버전을 2.10.0으로 바꾸어주어 문제 해결&lt;/p&gt;
&lt;pre id=&quot;code_1730183909926&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;airflow_db=&amp;gt; UPDATE alembic_version SET version_num = '22ed7efa9da2';
UPDATE 1&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;다시&amp;nbsp;airflow&amp;nbsp;upgrade를&amp;nbsp;해주면&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1730183928188&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INFO - Creating tables
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
Database migrating done!&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;성공적으로 migrate 됩니다!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 이상 오늘의 삽질일기 끄읏 &lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;여기저기 삽질도 해보고&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;날려도 먹으면서&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;배우는 게&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;결국 남는거다&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;-&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;Z.Sabziller&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span&gt;&lt;a style=&quot;color: #666666;&quot; href=&quot;https://ninano1109.tistory.com/3?category=902553&quot;&gt;'쫄보의삽질' 블로그 탄생스토리가 궁금하다면:&lt;/a&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730187074069&quot; style=&quot;color: #333333; text-align: left;&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Git push 취소 방법 (feat. '쫄보의삽질' 블로그 탄생 배경)&quot; data-og-description=&quot;아래는 저의 생생한 경험담을 바탕으로 작성한 것 입니다. Github 관리 폴더의 이름을 실수로 변경하고 삭제해버렸다. 작업 후 commit 하려고 아무리 찾아봐도 폴더가 보이지 않았다. 나의 피땀눈물&quot; data-og-host=&quot;ninano1109.tistory.com&quot; data-og-source-url=&quot;https://ninano1109.tistory.com/3?category=902553&quot; data-og-url=&quot;https://ninano1109.tistory.com/3&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8MnH4/hyKk9Xz6PZ/tvGmjHvGKVXcyw9DtIBfxk/img.png?width=800&amp;amp;height=505&amp;amp;face=0_0_800_505,https://scrap.kakaocdn.net/dn/b6amJp/hyKlh2nOUk/RI2IUmk4BhZ0zpdTauGryk/img.png?width=800&amp;amp;height=505&amp;amp;face=0_0_800_505,https://scrap.kakaocdn.net/dn/ccBNd8/hyKjE5YrlE/aHPWRdUpYSgKmBTMI9avik/img.png?width=2000&amp;amp;height=1264&amp;amp;face=0_0_2000_1264&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://ninano1109.tistory.com/3?category=902553&quot; data-source-url=&quot;https://ninano1109.tistory.com/3?category=902553&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;Git push 취소 방법 (feat. '쫄보의삽질' 블로그 탄생 배경)&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 저의 생생한 경험담을 바탕으로 작성한 것 입니다. Github 관리 폴더의 이름을 실수로 변경하고 삭제해버렸다. 작업 후 commit 하려고 아무리 찾아봐도 폴더가 보이지 않았다. 나의 피땀눈물&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;ninano1109.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Airflow</category>
      <category> db</category>
      <category>2.10.0</category>
      <category>airflow</category>
      <category>metadata</category>
      <category>PostgreSQL</category>
      <category>버전업그레이드</category>
      <author>쫄보삽질러</author>
      <guid isPermaLink="true">https://ninano1109.tistory.com/297</guid>
      <comments>https://ninano1109.tistory.com/297#entry297comment</comments>
      <pubDate>Tue, 29 Oct 2024 21:35:17 +0900</pubDate>
    </item>
    <item>
      <title>Debezium - Oracle 접속 실패</title>
      <link>https://ninano1109.tistory.com/296</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 변화 감지(CDC)를 위해 debezium과 oracle(aws rds) 연동 시 oracle DB 접속에 실패하는 에러가 발생했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. o&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;racle-connector error&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;{&quot;error_code&quot;:400,&quot;message&quot;:&quot;Connector configuration is invalid and contains the following 1 error(s):\nUnable to connect: Failed to resolve Oracle database version}&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;먼저 oracle-connector로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;REST API를 생성할 때 나타난 에러이고,&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;span&gt;실행 중이던 kafka connect에 나타난 에러를 보면 다음과 같습니다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;2. &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;kafka connect error&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Caused by: java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@test-db.ct.ap-northeast-2.rds.amazonaws.com:1521/ORCL&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 에러는 oracle에 접속하기 위한 jdbc driver를 찾지 못해서 발생한 오류로 &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;ojdbc8.jar 파일의 경로를 바꿔주어 해결했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;먼저 로컬에서 ojdbc8.jar 파일 다운로드 후, kafka&amp;nbsp;container에&amp;nbsp;복사해주었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727335796023&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker cp ojdbc8.jar kafka:/opt/kafka_2.13-2.8.1/connectors/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; &lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;기존 plugin.path=/opt/kafka_2.13-2.8.1/connectors에 설정한대로,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;해당 플러그인 경로에 복사했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 계속해서 동일한 에러가 발생했고, debezium 공식문서를 참고한 결과,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;# debezium 공식문서 참고&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-09-26 at 10.48.10 AM.png&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bljT3b/btsJM3eyOBO/szdfA1mtN2x9lN8sOMuQe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bljT3b/btsJM3eyOBO/szdfA1mtN2x9lN8sOMuQe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bljT3b/btsJM3eyOBO/szdfA1mtN2x9lN8sOMuQe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbljT3b%2FbtsJM3eyOBO%2FszdfA1mtN2x9lN8sOMuQe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1436&quot; height=&quot;138&quot; data-filename=&quot;Screenshot 2024-09-26 at 10.48.10 AM.png&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/kafka/libs/ 디렉토리 아래에 다시 파일을 옮겨주었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1727335832994&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mv ojdbc8.jar ../libs/&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1727335845491&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# oracle-connector 실행
curl -X POST -H &quot;Content-Type: application/json&quot; --data @oracle-config.json http://localhost:8083/connectors&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 oracle-connector를 재실행 했더니 정상적으로 oracle db 접속에 성공했습니다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_edited_Screenshot 2024-09-26 at 10.36.36 AM.png&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bceHAl/btsJNCt4GD0/Ldekk3VWePMePytMWGip0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bceHAl/btsJNCt4GD0/Ldekk3VWePMePytMWGip0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bceHAl/btsJNCt4GD0/Ldekk3VWePMePytMWGip0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbceHAl%2FbtsJNCt4GD0%2FLdekk3VWePMePytMWGip0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1844&quot; height=&quot;153&quot; data-filename=&quot;edited_edited_edited_Screenshot 2024-09-26 at 10.36.36 AM.png&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;153&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이상 오늘의 삽질일기 끄읏 &lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;여기저기 삽질도 해보고&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;날려도 먹으면서&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;배우는 게&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;결국 남는거다&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;-&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;Z.Sabziller&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span&gt;&lt;a style=&quot;color: #666666;&quot; href=&quot;https://ninano1109.tistory.com/3?category=902553&quot;&gt;'쫄보의삽질' 블로그 탄생스토리가 궁금하다면:&lt;/a&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730187143021&quot; style=&quot;color: #333333; text-align: left;&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Git push 취소 방법 (feat. '쫄보의삽질' 블로그 탄생 배경)&quot; data-og-description=&quot;아래는 저의 생생한 경험담을 바탕으로 작성한 것 입니다. Github 관리 폴더의 이름을 실수로 변경하고 삭제해버렸다. 작업 후 commit 하려고 아무리 찾아봐도 폴더가 보이지 않았다. 나의 피땀눈물&quot; data-og-host=&quot;ninano1109.tistory.com&quot; data-og-source-url=&quot;https://ninano1109.tistory.com/3?category=902553&quot; data-og-url=&quot;https://ninano1109.tistory.com/3&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8MnH4/hyKk9Xz6PZ/tvGmjHvGKVXcyw9DtIBfxk/img.png?width=800&amp;amp;height=505&amp;amp;face=0_0_800_505,https://scrap.kakaocdn.net/dn/b6amJp/hyKlh2nOUk/RI2IUmk4BhZ0zpdTauGryk/img.png?width=800&amp;amp;height=505&amp;amp;face=0_0_800_505,https://scrap.kakaocdn.net/dn/ccBNd8/hyKjE5YrlE/aHPWRdUpYSgKmBTMI9avik/img.png?width=2000&amp;amp;height=1264&amp;amp;face=0_0_2000_1264&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://ninano1109.tistory.com/3?category=902553&quot; data-source-url=&quot;https://ninano1109.tistory.com/3?category=902553&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;Git push 취소 방법 (feat. '쫄보의삽질' 블로그 탄생 배경)&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 저의 생생한 경험담을 바탕으로 작성한 것 입니다. Github 관리 폴더의 이름을 실수로 변경하고 삭제해버렸다. 작업 후 commit 하려고 아무리 찾아봐도 폴더가 보이지 않았다. 나의 피땀눈물&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;ninano1109.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CDC Pipeline</category>
      <category>AWS RDS</category>
      <category>CDC</category>
      <category>debezium</category>
      <category>JDBC</category>
      <category>oracle</category>
      <author>쫄보삽질러</author>
      <guid isPermaLink="true">https://ninano1109.tistory.com/296</guid>
      <comments>https://ninano1109.tistory.com/296#entry296comment</comments>
      <pubDate>Thu, 26 Sep 2024 21:12:49 +0900</pubDate>
    </item>
    <item>
      <title>[Datahub] slack notification 연동하기(feat. docker-compose.yml env 적용)</title>
      <link>https://ninano1109.tistory.com/295</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;Datahub 내 발생하는 변동 및 업데이트 사항에 대해 slack 알림을 받을 수 있는 설정을 해보려고 합니다.&lt;br /&gt;먼저 공식문서에 나와 있는 링크를 참고합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;a href=&quot;https://datahubproject.io/docs/actions/actions/slack/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;https://datahubproject.io/docs/actions/actions/slack/&lt;/span&gt;&lt;/a&gt;&lt;/blockquote&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;Slack | DataHub&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;| | |&quot; data-og-host=&quot;datahubproject.io&quot; data-og-source-url=&quot;https://datahubproject.io/docs/actions/actions/slack/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Wlj6U/hyWGWZNT84/XwKIwPe0ZXTqhsIfQAhHsk/img.png?width=1422&amp;amp;height=1146&amp;amp;face=0_0_1422_1146,https://scrap.kakaocdn.net/dn/bUkUCa/hyWCNQ0leK/JZWkpXM7zHG6OJCEji4kJ0/img.png?width=1214&amp;amp;height=746&amp;amp;face=1109_32_1152_79,https://scrap.kakaocdn.net/dn/cnA67y/hyWGTvgcDy/JfUucBNKLuT51nlzPw1Zzk/img.png?width=979&amp;amp;height=667&amp;amp;face=0_0_979_667&quot; data-og-url=&quot;https://datahubproject.io/docs/actions/actions/slack&quot;&gt;&lt;a href=&quot;https://datahubproject.io/docs/actions/actions/slack&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://datahubproject.io/docs/actions/actions/slack/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Wlj6U/hyWGWZNT84/XwKIwPe0ZXTqhsIfQAhHsk/img.png?width=1422&amp;amp;height=1146&amp;amp;face=0_0_1422_1146,https://scrap.kakaocdn.net/dn/bUkUCa/hyWCNQ0leK/JZWkpXM7zHG6OJCEji4kJ0/img.png?width=1214&amp;amp;height=746&amp;amp;face=1109_32_1152_79,https://scrap.kakaocdn.net/dn/cnA67y/hyWGTvgcDy/JfUucBNKLuT51nlzPw1Zzk/img.png?width=979&amp;amp;height=667&amp;amp;face=0_0_979_667');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Slack | DataHub&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;| | |&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;datahubproject.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;공식문서에서 확인할 수 있듯이&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Adding or Removing a tag from an entity (dataset, dashboard etc.)&lt;/li&gt;
&lt;li&gt;Updating documentation at the entity or field (column) level.&lt;/li&gt;
&lt;li&gt;Adding or Removing ownership from an entity (dataset, dashboard, etc.)&lt;/li&gt;
&lt;li&gt;Creating a Domain&lt;/li&gt;
&lt;li&gt;and many more.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와 같은 datahub가 관리하는 metadata에 여러가지 변경 사항을 업데이트 할 때, slack으로 실시간 noti를 보내줍니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;설정을 위해서 해야할 것은 아래 두가지가 있는데요,&lt;br /&gt;1. slack api 설정&lt;br /&gt;2. datahub 설정&lt;br /&gt;&amp;nbsp;&lt;br /&gt;1번 slack api에서의 설정은 공식문서를 보면 아주 자세~히 나와있기 때문에 무난하게 설정할 수 있으므로 pass! 하구요,&lt;br /&gt;이번 글에서는 2번 datahub 설정을 다뤄보겠습니다.(이 부분이 시간을 많이 잡아먹었..)&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;먼저 공식문서에서 볼 수 있듯이,&lt;br /&gt;어떤 설치 방법으로 datahub를 설치했는지에 따라 slack 설정 또한 4가지 방법으로 나뉠 수 있는데요.&lt;br /&gt;저는 가장 무난하게 또 쉽게 사용할 수 있는 방법인 #Quickstart 버전으로 사용했기 때문에, 해당 방법을 참고하겠습니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;여기서 보면&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #1c1e21;&quot;&gt; docker compose로 설치하는&amp;nbsp;&lt;/span&gt;&lt;/span&gt;datahub-actions&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #1c1e21;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #1c1e21;&quot;&gt;container에 이미&amp;nbsp; Slack action이 미리 설치가 되어 있기 때문에,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #1c1e21;&quot;&gt;몇가지 환경변수 설정만 해주면 끝! 입니다.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;export DATAHUB_ACTIONS_SLACK_ENABLED=true &lt;br /&gt;export DATAHUB_ACTIONS_SLACK_SIGNING_SECRET='65e...' &lt;br /&gt;export DATAHUB_ACTIONS_SLACK_BOT_TOKEN='xoxb-601...' &lt;br /&gt;export DATAHUB_ACTIONS_SLACK_CHANNEL='C0..'&lt;br /&gt;&lt;br /&gt;# 이후 docker 재실행&lt;br /&gt;datahub docker quickstart --stop &amp;amp;&amp;amp; datahub docker quickstart&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;문제는 이거를 어디다가 적용하느냐! 인것인데..&lt;br /&gt;저도 처음에는 호스트 서버에서 명령어를 입력하고 docker restart를 했지만, 실패했습니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;docker logs {&lt;span style=&quot;background-color: #292d3e;&quot;&gt;&lt;span style=&quot;color: #bfc7d5;&quot;&gt;datahub-actions-1 &lt;/span&gt;&lt;/span&gt;&amp;nbsp;container id} 를 실행해보면 아래와 같이 slack_action이 아직 비활성화 상태임을 볼 수 있습니다.&lt;br /&gt;....&lt;br /&gt;Skipping pipeline datahub_slack_action as it is not enabled&lt;br /&gt;Skipping pipeline datahub_teams_action as it is not enabled&lt;br /&gt;&amp;nbsp;Action Pipeline with name 'ingestion_executor' is now running.&lt;br /&gt;...&lt;br /&gt;&amp;nbsp;&lt;br /&gt;그리고 datahub 커뮤니티에서 간신히 발견한 한줄기 빛.&lt;br /&gt;host가 아닌 docker container 안에 환경변수가 포함되어야 할 것!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/psHEB/btsIOktJZdL/ZTZuSycST3wXDvhFPKuhp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/psHEB/btsIOktJZdL/ZTZuSycST3wXDvhFPKuhp1/img.png&quot; data-alt=&quot;그저 빛.. &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/psHEB/btsIOktJZdL/ZTZuSycST3wXDvhFPKuhp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpsHEB%2FbtsIOktJZdL%2FZTZuSycST3wXDvhFPKuhp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;385&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;882&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그저 빛.. &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;그러면 방법은 quickstart로 docker를 띄울 때 환경변수를 포함시키는 것.&lt;br /&gt;그러나, docker datahub quickstart로는 환경변수를 넘길 수 없고, 실행하는 순간 새로운 docker-compose.yml 파일을 내려받아서&amp;nbsp;&lt;br /&gt;컨테이너를 띄우기 때문에, 임의로 환경변수 값을 넣은 &lt;span style=&quot;color: #333333;&quot;&gt;커스텀 파일로 quickstart를 해보자!&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;docker-compose-custom.yml 이라는 명으로 파일을 하나 생성 후&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uld1R/btsIMFeQDDt/6dp7r6xyVuPwGjBdFegiw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uld1R/btsIMFeQDDt/6dp7r6xyVuPwGjBdFegiw1/img.png&quot; data-alt=&quot;docker-compose.yml 파일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uld1R/btsIMFeQDDt/6dp7r6xyVuPwGjBdFegiw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuld1R%2FbtsIMFeQDDt%2F6dp7r6xyVuPwGjBdFegiw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;606&quot; height=&quot;622&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;622&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker-compose.yml 파일&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;datahub-actions 컨테이너 아래 env 부분에 4개의 환경변수를 추가해줍니다.&lt;br /&gt;이때 또 중요한 것은 저는 각 변수 값을 스트링으로('') 감쌌더니 에러가 나서 살짝 당황할뻔 했지만,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;# 대충 이런 에러&lt;br /&gt;BoltError: `token` is invalid (auth.test result: {'ok': False, 'error': 'invalid_auth'})&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;# 아무 터미널에서 실행&lt;br /&gt;$curl -X POST -H 'Authorization: Bearer xox...' https://slack.com/api/auth.test&lt;br /&gt;=&amp;gt; {&quot;ok&quot;:true,&quot;url&quot;:&quot;https://X.slack.com/&quot;,...}%&amp;nbsp; &amp;nbsp;--토큰값 정상 확인&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;curl 명령어로 확인했을 때 토큰 값도 잘 맞았기 때문에, 고민하다가, docker-compose.yml 파일 내 다른 변수들에 string이 없길래 없애고 시도해봤더니 에러 없이 성공했습니다.&lt;br /&gt;사실 저는 그냥 값을 하드코딩으로 넣었지만.. .env를 활용한 숨기는 방향으로 고민해보시는 것도 좋을 것 같습니다.&amp;nbsp;&lt;br /&gt;(단, quickstart 명령어가 아닌 docker compose로 실행해야 합니다.)&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;다시 docker를 재실행 합니다. 이때 -f 로 커스텀으로 사용할 파일을 명시합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;datahub docker quickstart --stop &amp;amp;&amp;amp; datahub docker quickstart -f docker-compose-custom.yml&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2260&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DIhb8/btsINfmD8tm/0nqakGa5elvlJN3GfskuuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DIhb8/btsINfmD8tm/0nqakGa5elvlJN3GfskuuK/img.png&quot; data-alt=&quot;datahub-actions 컨테이너 log&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DIhb8/btsINfmD8tm/0nqakGa5elvlJN3GfskuuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDIhb8%2FbtsINfmD8tm%2F0nqakGa5elvlJN3GfskuuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2260&quot; height=&quot;442&quot; data-origin-width=&quot;2260&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;datahub-actions 컨테이너 log&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;컨테이너 로그에도 성공적으로 활성화된 상태를 확인할 수 있고,&amp;nbsp;&lt;br /&gt;바로 실시간으로 slack 알림 메시지도 확인 가능합니다:)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QmhS6/btsINpvO3XO/qAafyaOHjeTsGBkrcW9xTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QmhS6/btsINpvO3XO/qAafyaOHjeTsGBkrcW9xTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QmhS6/btsINpvO3XO/qAafyaOHjeTsGBkrcW9xTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQmhS6%2FbtsINpvO3XO%2FqAafyaOHjeTsGBkrcW9xTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;882&quot; height=&quot;328&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;- 이상 오늘의 삽질일기 끄읏 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[datahub] 오픈소스 컨트리뷰트 후기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://ninano1109.tistory.com/286&quot;&gt;https://ninano1109.tistory.com/286&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1742726148942&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;나의 인생 첫 오픈소스 컨트리뷰트 성공 후기&quot; data-og-description=&quot;예전부터 오픈소스 컨트리뷰터라고 하면 뭔가 &amp;quot;찐개발자&amp;quot; 같다는 생각을 하곤 했다.그래서 나의 버킷리스트이기도 했던 꿈의 오픈소스 컨트리뷰트를 예상치 못한 시점(?)에얼떨결에 하게 되었&quot; data-og-host=&quot;ninano1109.tistory.com&quot; data-og-source-url=&quot;https://ninano1109.tistory.com/286&quot; data-og-url=&quot;https://ninano1109.tistory.com/286&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kKfMl/hyYrXLi3Dm/Zrtfc7wDsFKUWTZ9qSoflk/img.png?width=800&amp;amp;height=1137&amp;amp;face=0_0_800_1137,https://scrap.kakaocdn.net/dn/bBeFmd/hyYuhCpH3J/iekwXGyJnl778iHdLX8NS1/img.png?width=800&amp;amp;height=1137&amp;amp;face=0_0_800_1137,https://scrap.kakaocdn.net/dn/FixGn/hyYrSpE3Ai/5dvG3d3LOwv0pf6kThyIs0/img.png?width=1868&amp;amp;height=786&amp;amp;face=0_0_1868_786&quot;&gt;&lt;a href=&quot;https://ninano1109.tistory.com/286&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ninano1109.tistory.com/286&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kKfMl/hyYrXLi3Dm/Zrtfc7wDsFKUWTZ9qSoflk/img.png?width=800&amp;amp;height=1137&amp;amp;face=0_0_800_1137,https://scrap.kakaocdn.net/dn/bBeFmd/hyYuhCpH3J/iekwXGyJnl778iHdLX8NS1/img.png?width=800&amp;amp;height=1137&amp;amp;face=0_0_800_1137,https://scrap.kakaocdn.net/dn/FixGn/hyYrSpE3Ai/5dvG3d3LOwv0pf6kThyIs0/img.png?width=1868&amp;amp;height=786&amp;amp;face=0_0_1868_786');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;나의 인생 첫 오픈소스 컨트리뷰트 성공 후기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;예전부터 오픈소스 컨트리뷰터라고 하면 뭔가 &quot;찐개발자&quot; 같다는 생각을 하곤 했다.그래서 나의 버킷리스트이기도 했던 꿈의 오픈소스 컨트리뷰트를 예상치 못한 시점(?)에얼떨결에 하게 되었&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ninano1109.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;여기저기 삽질도 해보고&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;날려도 먹으면서&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;배우는 게&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;결국 남는거다&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;-&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;Z.Sabziller&lt;/i&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DDP 플랫폼/Datahub</category>
      <category>datahub</category>
      <category>DDP</category>
      <category>slack</category>
      <author>쫄보삽질러</author>
      <guid isPermaLink="true">https://ninano1109.tistory.com/295</guid>
      <comments>https://ninano1109.tistory.com/295#entry295comment</comments>
      <pubDate>Thu, 25 Jul 2024 20:17:34 +0900</pubDate>
    </item>
    <item>
      <title>multithread vs multiprocess (feat. Process, Pool 비교)</title>
      <link>https://ninano1109.tistory.com/294</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;멀티스레드와 멀티프로세스는 모두 &lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;데이터 병렬처리&lt;/b&gt;&lt;/span&gt;를 위한 python 모듈로 약간의 차이점과 용도별 차이가 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;스레드 vs 프로세스&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스레드&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 프로세스 안에 여러개의 스레드 존재&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-03-19 at 9.18.01 PM.png&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rsaBr/btsMTZzd5IV/GLTyMS4a0H8bYzbCapqAs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rsaBr/btsMTZzd5IV/GLTyMS4a0H8bYzbCapqAs1/img.png&quot; data-alt=&quot;출처: Inpa Dev&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rsaBr/btsMTZzd5IV/GLTyMS4a0H8bYzbCapqAs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrsaBr%2FbtsMTZzd5IV%2FGLTyMS4a0H8bYzbCapqAs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1576&quot; height=&quot;638&quot; data-filename=&quot;Screenshot 2025-03-19 at 9.18.01 PM.png&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;638&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: Inpa Dev&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;4가지 메모리 영역중 스레드는 고유의 stack을 보유함 &amp;gt; stack은 독립적 함수 호출 가능 &amp;gt; 독립적 실행 흐름 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-03-19 at 9.33.43 PM.png&quot; data-origin-width=&quot;1514&quot; data-origin-height=&quot;880&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c25y5L/btsMSF2YrlU/i2WblE9T3WsPCHm8YYCUh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c25y5L/btsMSF2YrlU/i2WblE9T3WsPCHm8YYCUh1/img.png&quot; data-alt=&quot;출처: Inpa Dev&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c25y5L/btsMSF2YrlU/i2WblE9T3WsPCHm8YYCUh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc25y5L%2FbtsMSF2YrlU%2Fi2WblE9T3WsPCHm8YYCUh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1514&quot; height=&quot;880&quot; data-filename=&quot;Screenshot 2025-03-19 at 9.33.43 PM.png&quot; data-origin-width=&quot;1514&quot; data-origin-height=&quot;880&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: Inpa Dev&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리 내 별도의 주소 공간에서 실행(독립적 구조)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;동시성(concurrency) vs &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;병렬성(parallel)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동시성: 동시에 실행하는 것처럼 보이는 &amp;rarr; 각 프로세스 작업을 작게 쪼개어 번갈아 처리 &amp;rarr; context switching&lt;/li&gt;
&lt;li&gt;병렬성: 실제 물리적인 동시 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;멀티스레드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 여러개의 스레드가 하나의 프로세스 내에서 실행되며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 동일한 메모리 공간을 공유&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. context switching이 가벼워 메모리 및 성능 효율적이며, 스레드 간의 데이터 공유가 용이함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 파일을 읽고 쓰기위한 I/O 작업에 적합함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 동시성(concurrency)을 주로 다룸 =&amp;gt; CPU가 스레드 간에 전환하면서 작업 실행(동시 처리처럼 보이는)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;멀티프로세스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 각 프로세는 독립적 메모리 공간에서 실행됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 프로세스간 직접적인 데이터 공유 불가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 메모리 공간이 독립적이므로, 한 프로세스에의 오류가 다른 프로세스에 영향 미치지 않음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. cpu 집약적 작업에 적합함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 진정한 병렬성 구현 가능 =&amp;gt; 여러 작업 동시 처리 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Python multiprocessing 모듈&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. Process&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 작업에 대해 개별 프로세스 생성하여 독립적으로 실행&lt;/li&gt;
&lt;li&gt;여러작업 병렬로 처리 위해 여러 process 객체 생성&lt;/li&gt;
&lt;li&gt;독립적 메모리 공간에서 서로 직접적인 데이터 공유 X&lt;/li&gt;
&lt;li&gt;프로세스 직접 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-03-21 at 10.45.51 PM.png&quot; data-origin-width=&quot;1028&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhdfvD/btsMT2ig5Rn/BehpzVPgMFIkOC5iARDij1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhdfvD/btsMT2ig5Rn/BehpzVPgMFIkOC5iARDij1/img.png&quot; data-alt=&quot;Process 예시코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhdfvD/btsMT2ig5Rn/BehpzVPgMFIkOC5iARDij1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhdfvD%2FbtsMT2ig5Rn%2FBehpzVPgMFIkOC5iARDij1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1028&quot; height=&quot;676&quot; data-filename=&quot;Screenshot 2025-03-21 at 10.45.51 PM.png&quot; data-origin-width=&quot;1028&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Process 예시코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. Pool&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;미리 지정된 수의 프로세스 생성 후 프로세스 풀에서 작업 처리&lt;/li&gt;
&lt;li&gt;작업이 완료된 프로세스는 다시 풀에 반환되어 작업 재실행 &amp;rArr; 프로세스 풀 재사용&lt;/li&gt;
&lt;li&gt;배치 작업 시 유용하며 효율적인 자원 사용 가능&lt;/li&gt;
&lt;li&gt;프로세스 자동관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-03-21 at 10.45.58 PM.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKGq8t/btsMTNMseVr/EKZs1qUyefKhEeF6JTuGB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKGq8t/btsMTNMseVr/EKZs1qUyefKhEeF6JTuGB1/img.png&quot; data-alt=&quot;Pool 예시코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKGq8t/btsMTNMseVr/EKZs1qUyefKhEeF6JTuGB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKGq8t%2FbtsMTNMseVr%2FEKZs1qUyefKhEeF6JTuGB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1018&quot; height=&quot;462&quot; data-filename=&quot;Screenshot 2025-03-21 at 10.45.58 PM.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;462&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Pool 예시코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ref:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742564493262&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot; &amp;zwj;  &amp;zwj;완전히 정복하는 프로세스 vs 스레드 개념&quot; data-og-description=&quot;한눈에 이해하는 프로세스 &amp;amp; 스레드 개념 전공 지식 없이 컴퓨터의 프로그램을 이용하는데는 문제 없어 왔지만 소프트웨어를 개발하는 사람으로서 컴퓨터 실행 내부 요소를 따져보게 될때, 아&quot; data-og-host=&quot;inpa.tistory.com&quot; data-og-source-url=&quot;https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4&quot; data-og-url=&quot;https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/YiUg6/hyYul5qJoW/EesWr6kbP5U47FwIkHJUIk/img.png?width=800&amp;amp;height=352&amp;amp;face=0_0_800_352,https://scrap.kakaocdn.net/dn/bdKzUp/hyYumJ2WA1/nGkW9BePOHN0y3uhJ9aJUK/img.png?width=800&amp;amp;height=352&amp;amp;face=0_0_800_352,https://scrap.kakaocdn.net/dn/bCGCr1/hyYrUuaWaV/isSXggiQf3P1UToCdeKXv0/img.png?width=1403&amp;amp;height=618&amp;amp;face=0_0_1403_618&quot;&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/YiUg6/hyYul5qJoW/EesWr6kbP5U47FwIkHJUIk/img.png?width=800&amp;amp;height=352&amp;amp;face=0_0_800_352,https://scrap.kakaocdn.net/dn/bdKzUp/hyYumJ2WA1/nGkW9BePOHN0y3uhJ9aJUK/img.png?width=800&amp;amp;height=352&amp;amp;face=0_0_800_352,https://scrap.kakaocdn.net/dn/bCGCr1/hyYrUuaWaV/isSXggiQf3P1UToCdeKXv0/img.png?width=1403&amp;amp;height=618&amp;amp;face=0_0_1403_618');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt; &amp;zwj;  &amp;zwj;완전히 정복하는 프로세스 vs 스레드 개념&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;한눈에 이해하는 프로세스 &amp;amp; 스레드 개념 전공 지식 없이 컴퓨터의 프로그램을 이용하는데는 문제 없어 왔지만 소프트웨어를 개발하는 사람으로서 컴퓨터 실행 내부 요소를 따져보게 될때, 아&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;inpa.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style1&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;당신이 어떤 것을&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;할머니에게 설명해주지 못한다면,&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span&gt;&lt;b&gt;그것은 진정으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;&lt;b&gt;이해한 것이 아니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span&gt;- A.Einstein&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;</description>
      <category>IT용어정리</category>
      <category>multiprocess</category>
      <category>multithread</category>
      <category>pool</category>
      <category>Process</category>
      <category>Python</category>
      <category>멀티스레드</category>
      <category>멀티프로세스</category>
      <category>병렬처리</category>
      <author>쫄보삽질러</author>
      <guid isPermaLink="true">https://ninano1109.tistory.com/294</guid>
      <comments>https://ninano1109.tistory.com/294#entry294comment</comments>
      <pubDate>Wed, 8 May 2024 18:55:24 +0900</pubDate>
    </item>
    <item>
      <title>[Airflow] Airflow dag 추가 에러 현상</title>
      <link>https://ninano1109.tistory.com/290</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Airflow에 새로운 DAG를 추가할 때 db 관련 에러가 발생하여 db 업그레이드 진행 시 에러발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; airflow&amp;nbsp;db&amp;nbsp;upgrade&lt;/p&gt;
&lt;pre id=&quot;code_1730186270405&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;raise sa_exc.PendingRollbackError(
sqlalchemy.exc.PendingRollbackError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (psycopg2.errors.NotNullViolation) null value in column &quot;max_consecutive_failed_dag_runs&quot; of relation &quot;dag&quot; violates not-null constraint
DETAIL:  Failing row contains (boaz_analysis_dag, null, t, f, t, 2024-01-11 02:31:28.735741+00, null, null, null, null, /airflow/dags/analysis_dag.py, null, airflow, null, grid, null, Never, external triggers only, 16, 16, f, f, null, null, null, null, null, null, null).

[SQL: INSERT INTO dag (dag_id, root_dag_id, is_paused, is_subdag, is_active, last_parsed_time, last_pickled, last_expired, scheduler_lock, pickle_id, fileloc, processor_subdir, owners, description, default_view, schedule_interval, timetable_description, max_active_tasks, max_active_runs, has_task_concurrency_limits, has_import_errors, next_dagrun, next_dagrun_data_interval_start, next_dagrun_data_interval_end, next_dagrun_create_after) VALUES (%(dag_id)s, %(root_dag_id)s, %(is_paused)s, %(is_subdag)s, %(is_active)s, %(last_parsed_time)s, %(last_pickled)s, %(last_expired)s, %(scheduler_lock)s, %(pickle_id)s, %(fileloc)s, %(processor_subdir)s, %(owners)s, %(description)s, %(default_view)s, %(schedule_interval)s, %(timetable_description)s, %(max_active_tasks)s, %(max_active_runs)s, %(has_task_concurrency_limits)s, %(has_import_errors)s, %(next_dagrun)s, %(next_dagrun_data_interval_start)s, %(next_dagrun_data_interval_end)s, %(next_dagrun_create_after)s)]
[parameters: ({'dag_id': 'analysis_dag', 'root_dag_id': None, 'is_paused': True, 'is_subdag': False, 'is_active': True, 'last_parsed_time': datetime.datetime(2024, 1, 11, 2, 31, 28, 735741, tzinfo=Timezone('UTC')), 'last_pickled': None, 'last_expired': None, 'scheduler_lock': None, 'pickle_id': None, 'fileloc': '/airflow/dags/analysis_dag.py', 'processor_subdir': None, 'owners': 'airflow', 'description': None, 'default_view': 'grid', 'schedule_interval': 'null', 'timetable_description': 'Never, external triggers only', 'max_active_tasks': 16, 'max_active_runs': 16, 'has_task_concurrency_limits': False, 'has_import_errors': False, 'next_dagrun': None, 'next_dagrun_data_interval_start': None, 'next_dagrun_data_interval_end': None, 'next_dagrun_create_after': None}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;  원인&lt;br /&gt;&lt;br /&gt;metadat DB의 dag 테이블 내 max_consecutive_failed_dag_runs 컬럼이 not null로 설정되어 있는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NOT NULL CONSTRAINT 조건에 violate하여 에러 발생&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;해당&amp;nbsp;DAG에&amp;nbsp;값이&amp;nbsp;빠져&amp;nbsp;있는&amp;nbsp;원인은&amp;nbsp;2가지&amp;nbsp;정도로&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있는데:&lt;br /&gt;&lt;br /&gt;1.&lt;b&gt;Missing Field in DAG Definition&lt;/b&gt;: The DAG definition might not include the `max_consecutive_failed_dag_runs` field, or it might not be initialized properly when the DAG is created. This field should have a default value, but sometimes during upgrades or custom DAG creation, this might not be set automatically.&lt;br /&gt;2. &lt;b&gt;Database Inconsistency&lt;/b&gt;: During migrations or upgrades, the database might have missed setting the default value for the `max_consecutive_failed_dag_runs` field for existing DAGs, leading to this issue during migrations.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;DAG를&amp;nbsp;작성했을&amp;nbsp;때의&amp;nbsp;DAG&amp;nbsp;Definition이&amp;nbsp;제대로&amp;nbsp;작동하지&amp;nbsp;않았거나,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. DB 업그레이드 시 디폴트 값 설정하는 부분에서 누락이 발생했을 수 있음&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  해결방안&lt;/p&gt;
&lt;pre id=&quot;code_1730186452035&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pg 접속
=&amp;gt; \d dag;

=&amp;gt; ALTER TABLE dag
   ALTER COLUMN max_consecutive_failed_dag_runs SET DEFAULT 0;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;Casae1. dag file name != dag id&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;1) Dag id 이름만 바꿨을 때, scheduler log:&lt;/p&gt;
&lt;pre id=&quot;code_1730186530847&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    - INFO - Deleted DAG tableau_EC2_management_dag in serialized_dag table 
    - INFO - Deactivated 1 DAGs which are no longer present in file. 
    - INFO - DAG tableau_EC2_management_dag is missing and will be deactivated.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp; 2) airflow dag table 확인&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;이전 EC2 dag_id 의 fileloc 컬럼 = 현재 dag 위치와 동일&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;'/airflow/dags/A_dag.py'&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;=&amp;gt; 현재와 다른 새로운 이름으로 바꿔주기&lt;/p&gt;
&lt;pre id=&quot;code_1730186737313&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  UPDATE dag
  SET fileloc = '/airflow/dags/A.py'
  WHERE dag_id = 'A';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;processor_subdir = NULL&lt;br /&gt;=&amp;gt; 현재 dag_folder 경로로 바꿔주기&lt;/p&gt;
&lt;pre id=&quot;code_1730186858631&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  UPDATE dag
  SET processor_subdir = '/airflow/dags/
  WHERE dag_id = 'A';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;airflow scheduler 재가동 이후, scheduler log에 더이상 에러 메세지 나타나지 않음.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이전 삭제된 DAG, tasks들 스케줄 되어 trigger 되는 현상:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;metadata DB에 이전 기록들이 남아있는 상태로, 종료되지 않은 상태로 유지되어 있으면&lt;/li&gt;
&lt;li&gt;scheduler 재가동 시 매번 해당 dag 정보를 가져오는 현상&lt;/li&gt;
&lt;li&gt;db clean으로 오래된 데이터를 삭제하기&lt;/li&gt;
&lt;li&gt;airflow db clean --clean-before-timestamp '2024-01-01'&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이상 오늘의 삽질일기 끄읏 &lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;여기저기 삽질도 해보고&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;날려도 먹으면서&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;배우는 게&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;결국 남는거다&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;-&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;Z.Sabziller&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span&gt;&lt;a style=&quot;color: #666666;&quot; href=&quot;https://ninano1109.tistory.com/3?category=902553&quot;&gt;'쫄보의삽질' 블로그 탄생스토리가 궁금하다면:&lt;/a&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730187108437&quot; style=&quot;color: #333333; text-align: left;&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Git push 취소 방법 (feat. '쫄보의삽질' 블로그 탄생 배경)&quot; data-og-description=&quot;아래는 저의 생생한 경험담을 바탕으로 작성한 것 입니다. Github 관리 폴더의 이름을 실수로 변경하고 삭제해버렸다. 작업 후 commit 하려고 아무리 찾아봐도 폴더가 보이지 않았다. 나의 피땀눈물&quot; data-og-host=&quot;ninano1109.tistory.com&quot; data-og-source-url=&quot;https://ninano1109.tistory.com/3?category=902553&quot; data-og-url=&quot;https://ninano1109.tistory.com/3&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8MnH4/hyKk9Xz6PZ/tvGmjHvGKVXcyw9DtIBfxk/img.png?width=800&amp;amp;height=505&amp;amp;face=0_0_800_505,https://scrap.kakaocdn.net/dn/b6amJp/hyKlh2nOUk/RI2IUmk4BhZ0zpdTauGryk/img.png?width=800&amp;amp;height=505&amp;amp;face=0_0_800_505,https://scrap.kakaocdn.net/dn/ccBNd8/hyKjE5YrlE/aHPWRdUpYSgKmBTMI9avik/img.png?width=2000&amp;amp;height=1264&amp;amp;face=0_0_2000_1264&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://ninano1109.tistory.com/3?category=902553&quot; data-source-url=&quot;https://ninano1109.tistory.com/3?category=902553&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;Git push 취소 방법 (feat. '쫄보의삽질' 블로그 탄생 배경)&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 저의 생생한 경험담을 바탕으로 작성한 것 입니다. Github 관리 폴더의 이름을 실수로 변경하고 삭제해버렸다. 작업 후 commit 하려고 아무리 찾아봐도 폴더가 보이지 않았다. 나의 피땀눈물&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;ninano1109.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Airflow</category>
      <category>airflow</category>
      <category>DAG</category>
      <category>metadata</category>
      <category>scheduler</category>
      <author>쫄보삽질러</author>
      <guid isPermaLink="true">https://ninano1109.tistory.com/290</guid>
      <comments>https://ninano1109.tistory.com/290#entry290comment</comments>
      <pubDate>Sat, 24 Feb 2024 14:04:08 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] ec2 방화벽 port 설정 명령어(feat. firewall-cmd)</title>
      <link>https://ninano1109.tistory.com/288</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-mark=&quot;-&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;방화벽 등록 리스트 확인&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #333333; text-align: left;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ sudo firewall-cmd --list--all&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-02-01 at 2.14.32 PM.png&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KGtmi/btsEf0HGRzv/q35OZXkZH50ZHjBcchKAV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KGtmi/btsEf0HGRzv/q35OZXkZH50ZHjBcchKAV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KGtmi/btsEf0HGRzv/q35OZXkZH50ZHjBcchKAV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKGtmi%2FbtsEf0HGRzv%2Fq35OZXkZH50ZHjBcchKAV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;558&quot; height=&quot;260&quot; data-filename=&quot;Screenshot 2024-02-01 at 2.14.32 PM.png&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-mark=&quot;-&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;방화벽 상태 check&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #333333; text-align: left;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ sudo firewall-cmd --state&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-02-01 at 2.21.22 PM.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R2YTm/btsEdJNtCUf/uDwxoCdzzauagbLKlKh0x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R2YTm/btsEdJNtCUf/uDwxoCdzzauagbLKlKh0x0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R2YTm/btsEdJNtCUf/uDwxoCdzzauagbLKlKh0x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR2YTm%2FbtsEdJNtCUf%2FuDwxoCdzzauagbLKlKh0x0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;578&quot; height=&quot;53&quot; data-filename=&quot;Screenshot 2024-02-01 at 2.21.22 PM.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;53&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-mark=&quot;-&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;방화벽 port 등록&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #333333; text-align: left;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ sudo firewall-cmd --permanent --add-port={port number}/tcp&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-02-01 at 2.24.57 PM.png&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cb3Bd2/btsEeLcXFIE/kWTnNdW3nKHRFIp6O3ZS6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cb3Bd2/btsEeLcXFIE/kWTnNdW3nKHRFIp6O3ZS6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cb3Bd2/btsEeLcXFIE/kWTnNdW3nKHRFIp6O3ZS6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcb3Bd2%2FbtsEeLcXFIE%2FkWTnNdW3nKHRFIp6O3ZS6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;831&quot; height=&quot;365&quot; data-filename=&quot;Screenshot 2024-02-01 at 2.24.57 PM.png&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;365&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;=&amp;gt; 바로 반영 안됨&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-mark=&quot;-&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;방화벽 리로드&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #333333; text-align: left;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ sudo firewall-cmd --reload&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-02-01 at 2.18.45 PM.png&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcGFwC/btsEjVd3RwB/2nnKvarFfNKiuJW5WeGTi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcGFwC/btsEjVd3RwB/2nnKvarFfNKiuJW5WeGTi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcGFwC/btsEjVd3RwB/2nnKvarFfNKiuJW5WeGTi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcGFwC%2FbtsEjVd3RwB%2F2nnKvarFfNKiuJW5WeGTi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;615&quot; height=&quot;319&quot; data-filename=&quot;Screenshot 2024-02-01 at 2.18.45 PM.png&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;당신이 어떤 것을&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;할머니에게 설명해주지 못한다면,&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span&gt;&lt;b&gt;그것은 진정으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;&lt;b&gt;이해한 것이 아니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span&gt;- A.Einstein&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발Tip</category>
      <category>EC2</category>
      <category>Firewall</category>
      <category>firewall-cmd</category>
      <category>port</category>
      <category>방화벽</category>
      <author>쫄보삽질러</author>
      <guid isPermaLink="true">https://ninano1109.tistory.com/288</guid>
      <comments>https://ninano1109.tistory.com/288#entry288comment</comments>
      <pubDate>Thu, 1 Feb 2024 22:27:40 +0900</pubDate>
    </item>
    <item>
      <title>나의 인생 첫 오픈소스 컨트리뷰트 성공 후기</title>
      <link>https://ninano1109.tistory.com/286</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;예전부터 오픈소스 컨트리뷰터라고 하면 뭔가 &quot;찐개발자&quot; 같다는 생각을 하곤 했다.&lt;br /&gt;그래서 나의 버킷리스트이기도 했던 꿈의 오픈소스 컨트리뷰트를 예상치 못한 시점(?)에&lt;br /&gt;얼떨결에 하게 되었다는,,  후기를 남겨보려고 합니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;때는 바야흐로.. 데이터 디스커버리 플랫폼(A.K.A DDP)인 Datahub를 구축하고,&lt;br /&gt;내부 기능들을 살피던 중 코드 커스텀화를 위해 공식문서와 github 코드들을 리뷰하던 때였다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;datahub의 metadata-ingestion source를 tableau로 활용했기 때문에,&lt;br /&gt;tableau recipe 코드를 탐색하던 중 config에 뭔가 빠져있는 듯한 허전한 느낌이었다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;그래서 내가 짰던 recipe 코드와 비교해보니 token값이 빠져있는 것을 발겼했고,&lt;br /&gt;저의 경우 token 값이 빠져있어 생기던 에러를 token 값을 추가함으로써 해결했기 때문에,&lt;br /&gt;꼭 token이 필요한 경우(예를 들면 tableau 서버 접속에 2차 인증이 필요한 경우)도 있을 수 있다고 판단하여&lt;br /&gt;token value를 추가하여 commit 했고, 바로 approved를 받을 수 있었다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1868&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kXe5H/btsB8UIDcsx/xVSTG7APFHgT3G3RbI8eOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kXe5H/btsB8UIDcsx/xVSTG7APFHgT3G3RbI8eOK/img.png&quot; data-alt=&quot;첫 commit 후 받았던 approved 메세지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kXe5H/btsB8UIDcsx/xVSTG7APFHgT3G3RbI8eOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkXe5H%2FbtsB8UIDcsx%2FxVSTG7APFHgT3G3RbI8eOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1868&quot; height=&quot;786&quot; data-origin-width=&quot;1868&quot; data-origin-height=&quot;786&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;첫 commit 후 받았던 approved 메세지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;사실 반신반의 하며 했던 commit이었기도 했고, 어차피 수락 아니면 거절이었기 때문에&lt;br /&gt;시작이 반이다라는 말처럼 첫 &lt;span style=&quot;color: #333333;&quot;&gt;컨트리뷰트 &lt;/span&gt;시도라도 해보자는 마인드로 무작정 커밋을 했던 터라&lt;br /&gt;이 때까지만해도 거절당하지 않고 reviewer에게 approved라도 받을 수 있어서 매우매우 기뻤따!!&lt;br /&gt;그리고 token이 필수 사항은 아니었어서 옆에 (optional)이라는 추가 코멘트와 함께 commit이 되었다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;그리고 막상 merge까지는 몇일 더 걸렸는데,&lt;br /&gt;이 몇일이 계속 긴장의 연속이었다,, 하루에도 몇번을 들락날락하면서 확인하고 또 확인했다.&lt;br /&gt;그래서 approved 이후에 merge가 안되는 이유도 계속 구글링하면서 기다리다 그냥 포기하고 있던 시점에&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2218&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxDvEX/btsB5BpWTiS/GDcuUA2RvHJR9zKFeSFKsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxDvEX/btsB5BpWTiS/GDcuUA2RvHJR9zKFeSFKsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxDvEX/btsB5BpWTiS/GDcuUA2RvHJR9zKFeSFKsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxDvEX%2FbtsB5BpWTiS%2FGDcuUA2RvHJR9zKFeSFKsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2218&quot; height=&quot;606&quot; data-origin-width=&quot;2218&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2714&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cb7zEY/btsB5WOtk4A/T4XQ85Ajqma2iEmKwORvk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cb7zEY/btsB5WOtk4A/T4XQ85Ajqma2iEmKwORvk1/img.png&quot; data-alt=&quot;merge된 나의 commit!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cb7zEY/btsB5WOtk4A/T4XQ85Ajqma2iEmKwORvk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcb7zEY%2FbtsB5WOtk4A%2FT4XQ85Ajqma2iEmKwORvk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2714&quot; height=&quot;162&quot; data-origin-width=&quot;2714&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;merge된 나의 commit!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 뙇! Merge가 되어버려땋,,,&lt;br /&gt;크으으 감격의 순간 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;이유는 모르겠지만 내부적으로 reviewer 사이에서 논의가 있었던 것도 같구 흠 &lt;br /&gt;암튼 내 github 프로필에 가보니 이런것도 새로 생김ㅎㅎㅎㅎ 뿌듯 &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;1336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciiM3c/btsB8UIEgvY/ZNk6YS9NfG8BkNPTmEFCvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciiM3c/btsB8UIEgvY/ZNk6YS9NfG8BkNPTmEFCvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciiM3c/btsB8UIEgvY/ZNk6YS9NfG8BkNPTmEFCvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciiM3c%2FbtsB8UIEgvY%2FZNk6YS9NfG8BkNPTmEFCvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;940&quot; height=&quot;1336&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;1336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;앞으로도 더 많은 오픈소스에 컨트리뷰트를 해봐야겠다는 각오를 다지는 시간이었다.&amp;nbsp;&lt;br /&gt;급 마무리ㅎㅎㅎ&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;나도 이제 오픈소스 컨트리뷰터닷! &amp;zwj;♀️&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span&gt;&lt;a style=&quot;color: #666666;&quot; href=&quot;https://ninano1109.tistory.com/3?category=902553&quot;&gt;'쫄보의삽질' 블로그 탄생스토리가 궁금하다면:&lt;/a&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730187222852&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Git push 취소 방법 (feat. '쫄보의삽질' 블로그 탄생 배경)&quot; data-og-description=&quot;아래는 저의 생생한 경험담을 바탕으로 작성한 것 입니다. Github 관리 폴더의 이름을 실수로 변경하고 삭제해버렸다. 작업 후 commit 하려고 아무리 찾아봐도 폴더가 보이지 않았다. 나의 피땀눈물&quot; data-og-host=&quot;ninano1109.tistory.com&quot; data-og-source-url=&quot;https://ninano1109.tistory.com/3?category=902553&quot; data-og-url=&quot;https://ninano1109.tistory.com/3&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8MnH4/hyKk9Xz6PZ/tvGmjHvGKVXcyw9DtIBfxk/img.png?width=800&amp;amp;height=505&amp;amp;face=0_0_800_505,https://scrap.kakaocdn.net/dn/b6amJp/hyKlh2nOUk/RI2IUmk4BhZ0zpdTauGryk/img.png?width=800&amp;amp;height=505&amp;amp;face=0_0_800_505,https://scrap.kakaocdn.net/dn/ccBNd8/hyKjE5YrlE/aHPWRdUpYSgKmBTMI9avik/img.png?width=2000&amp;amp;height=1264&amp;amp;face=0_0_2000_1264&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://ninano1109.tistory.com/3?category=902553&quot; data-source-url=&quot;https://ninano1109.tistory.com/3?category=902553&quot;&gt;
&lt;div style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/8MnH4/hyKk9Xz6PZ/tvGmjHvGKVXcyw9DtIBfxk/img.png?width=800&amp;amp;height=505&amp;amp;face=0_0_800_505,https://scrap.kakaocdn.net/dn/b6amJp/hyKlh2nOUk/RI2IUmk4BhZ0zpdTauGryk/img.png?width=800&amp;amp;height=505&amp;amp;face=0_0_800_505,https://scrap.kakaocdn.net/dn/ccBNd8/hyKjE5YrlE/aHPWRdUpYSgKmBTMI9avik/img.png?width=2000&amp;amp;height=1264&amp;amp;face=0_0_2000_1264');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;Git push 취소 방법 (feat. '쫄보의삽질' 블로그 탄생 배경)&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 저의 생생한 경험담을 바탕으로 작성한 것 입니다. Github 관리 폴더의 이름을 실수로 변경하고 삭제해버렸다. 작업 후 commit 하려고 아무리 찾아봐도 폴더가 보이지 않았다. 나의 피땀눈물&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;ninano1109.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>개발Tip</category>
      <category>datahub</category>
      <category>오픈소스</category>
      <category>컨트리뷰터</category>
      <author>쫄보삽질러</author>
      <guid isPermaLink="true">https://ninano1109.tistory.com/286</guid>
      <comments>https://ninano1109.tistory.com/286#entry286comment</comments>
      <pubDate>Sun, 17 Dec 2023 21:54:16 +0900</pubDate>
    </item>
  </channel>
</rss>