<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>N년차 개발자</title>
    <link>https://peachh.tistory.com/</link>
    <description>야금야금 공부기록</description>
    <language>ko</language>
    <pubDate>Mon, 6 Jul 2026 09:10:20 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>peachh</managingEditor>
    <image>
      <title>N년차 개발자</title>
      <url>https://tistory1.daumcdn.net/tistory/4323528/attach/6751aea5797d4197964937c3064bf55e</url>
      <link>https://peachh.tistory.com</link>
    </image>
    <item>
      <title>[Spring] 정적 컨텐츠 vs MVC 패턴 vs API</title>
      <link>https://peachh.tistory.com/283</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;정적 컨텐츠, MVC 패턴, API는 스프링 웹 개발에 주로 사용되는 3가지 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정적 컨텐츠&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약속된 경로(ex. /resources/static)에 저장된 html 파일을 그대로 내려준다.&lt;br /&gt;요청과 관련된 컨트롤러가 있는지 먼저 확인하고 없다면 정적 컨텐츠를 찾는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-10 오전 1.22.29.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjQ5qf/btsQqLyJe2z/1cPF5YFoGX3n1T3qTMg1p1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjQ5qf/btsQqLyJe2z/1cPF5YFoGX3n1T3qTMg1p1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjQ5qf/btsQqLyJe2z/1cPF5YFoGX3n1T3qTMg1p1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjQ5qf%2FbtsQqLyJe2z%2F1cPF5YFoGX3n1T3qTMg1p1%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;752&quot; height=&quot;372&quot; data-filename=&quot;스크린샷 2025-09-10 오전 1.22.29.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;372&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;h3 data-ke-size=&quot;size23&quot;&gt;MVC 패턴&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관심사에 따라 Model-View-Controller 로 구분된 패턴이며, 템플릿 엔진을 사용해서 html 파일을 적절히 가공해서 내려준다.&lt;br /&gt;Controller는 템플릿과 모델을 ViewResolver에게 넘긴다.&lt;br /&gt;ViewResolver가 템플릿을 찾아서 템플릿 엔진에 넘기면 템플릿 엔진이 렌더링해서 완성된 HTML을 내려준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-10 오전 1.22.14.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgaeyU/btsQroQu0wn/E1m7BsgmkDIeXIjalU6rQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgaeyU/btsQroQu0wn/E1m7BsgmkDIeXIjalU6rQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgaeyU/btsQroQu0wn/E1m7BsgmkDIeXIjalU6rQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgaeyU%2FbtsQroQu0wn%2FE1m7BsgmkDIeXIjalU6rQK%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;752&quot; height=&quot;372&quot; data-filename=&quot;스크린샷 2025-09-10 오전 1.22.14.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;372&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;h3 data-ke-size=&quot;size23&quot;&gt;API&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;html이 아니라 데이터 그 자체를 내려준다.&lt;br /&gt;컨트롤러의 메소드에 @ResponseBody 를 사용하면 ViewResolver를 사용하는 대신에 HttpMessageConverter를 사용한다.&lt;br /&gt;클라이언트의 Accept 헤더와 데이터 타입에 대한 정보를 조합하여 StringConverter, JsonConverter 등 적절한 컨버터를 사용한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-10 오전 1.23.57.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciSQae/btsQpWUNmbE/6zVeqf6m6Qwj8lNmhS6mx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciSQae/btsQpWUNmbE/6zVeqf6m6Qwj8lNmhS6mx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciSQae/btsQpWUNmbE/6zVeqf6m6Qwj8lNmhS6mx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciSQae%2FbtsQpWUNmbE%2F6zVeqf6m6Qwj8lNmhS6mx0%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;752&quot; height=&quot;372&quot; data-filename=&quot;스크린샷 2025-09-10 오전 1.23.57.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;372&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;h3 data-ke-size=&quot;size23&quot;&gt;Reference&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #ffffff; color: #0070d1; text-align: center;&quot; href=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8&quot;&gt;스프링&amp;nbsp;입문&amp;nbsp;-&amp;nbsp;코드로&amp;nbsp;배우는&amp;nbsp;스프링&amp;nbsp;부트,&amp;nbsp;웹&amp;nbsp;MVC,&amp;nbsp;DB&amp;nbsp;접근&amp;nbsp;기술&lt;/a&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;</description>
      <category>Back-end/Spring</category>
      <author>peachh</author>
      <guid isPermaLink="true">https://peachh.tistory.com/283</guid>
      <comments>https://peachh.tistory.com/283#entry283comment</comments>
      <pubDate>Wed, 10 Sep 2025 01:58:19 +0900</pubDate>
    </item>
    <item>
      <title>[하둡 완벽 가이드] Chapter 03. 하둡 분산 파일시스템(4)</title>
      <link>https://peachh.tistory.com/280</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 읽기&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클라이언트는 DistributedFileSystem 인스턴스인 FileSystem 객체의 open() 메소드를 호출하여 파일을 연다.&lt;/li&gt;
&lt;li&gt;DistributedFileSystem은 파일 블록의 위치를 파악하기 위해 RPC(Remote Procedure Call)을 사용하여 네임 노드를 호출한다.&lt;/li&gt;
&lt;li&gt;네임 노드는 각 블록마다 복제본을 가진 데이터 노드의 주소를 반환한다. 이때 클러스터의 네트워크 위상에 따라 클라이언트와 가까운 순으로 데이터 노드가 정렬된다.&lt;/li&gt;
&lt;li&gt;DistributedFileSystemd은 파일 탐색을 위한 입력 스트림인 FSDataInputStream을 클라이언트에 반환한다. FSDataInputStream은 네임 노드와 데이터 노드의 통신을 처리하는 DFSInputStream으로 Wrapping 된다.&lt;/li&gt;
&lt;li&gt;클라이언트는 스트림을 읽기 위해 read() 메소드를 호출한다.&lt;/li&gt;
&lt;li&gt;FSDataInputStream은 각 블록의 복제본을 가진 클라이언트와 가장 가까운 데이터 노드에 연결하여 파일의 데이터를 전송한다.&lt;br /&gt;클라이언트 관점에서는 이 과정이 투명하여 단순히 연속된 스트림을 읽는 것처럼 느껴진다.&lt;/li&gt;
&lt;li&gt;모든 데이터를 읽으면 클라이언트는 FSDataInputStream의 close() 메소드를 호출한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트는 다음 블록의 데이터 노드 위치를 얻기 위해 블록을 순서대로 하나씩 읽고, DFSInputStream은 하나의 블록을 읽을 때마다 데이터 노드와 새로운 연결을 맺는다. 데이터를 읽다가 데이터 노드에 장애가 발생하거나 블록이 손상된 경우에는 다른 데이터 노드에 연결을 시도하여 데이터를 읽는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 쓰기&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클라이언트는 DistributedFileSystem의 create() 메소드를 호출하여 파일을 생성한다.&lt;/li&gt;
&lt;li&gt;DistributedFileSystem은 파일시스템의 네임스페이스에 새로운 파일을 생성하기 위해 RPC(Remote Procedure Call)을 사용하여 네임 노드를 호출한다. 이때 블록에 대한 정보는 보내지 않는다.&lt;/li&gt;
&lt;li&gt;네임 노드는 파일이 생성될 수 있는지 검사하여 통과하면 새로운 파일의 레코드를 만들고, 그렇지 않으면 파일 생성이 실패하며 클라이언트의 IOException이 발생한다.&lt;/li&gt;
&lt;li&gt;DistributedFileSystemd은 파일 쓰기를 위한 출력 스트림인 FSDataOutputStream을 클라이언트에 반환한다. FSDataOutputStream은 네임 노드와 데이터 노드의 통신을 처리하는 DFSOutputStream으로 Wrapping 된다.&lt;/li&gt;
&lt;li&gt;클라이언트가 데이터를 쓸 때 DFSOutputStream은 데이터를 패킷으로 분리하고, 내부의 데이터 큐로 패킷을 보낸다.&lt;/li&gt;
&lt;li&gt;DataStreamer는 데이터 큐의 패킷을 처리한다.&lt;br /&gt;(1) 네임 노드에 복제본을 저장할 데이터 노드의 목록을 요청한다. (복제 계수만큼&lt;br /&gt;(2) 목록의 데이터 노드는 파이프라인을 형성한다.&lt;br /&gt;(3) DataStreamer는 파이프라인의 첫 번째 데이터 노드로 패킷을 전송하고, 각 노드는 패킷을 저장한 후 다음 노드로 보낸다.&lt;/li&gt;
&lt;li&gt;DFSOutputStream의 ACK 큐는 데이터 노드의 승인 여부를 기다리며, 모든 노드로부터 ACK 응답을 받아야 큐에 있는 패킷이 제거된다.&lt;/li&gt;
&lt;li&gt;데이터 쓰기 작업이 완료되면 close() 메소드를 호출한다.&lt;br /&gt;(1) 파이프라인에 남아 있는 모든 패킷을 flush 하고 ACK를 기다린다.&lt;br /&gt;(2) 모든 패킷이 완전히 전송되면 네임 노드에 &quot;File is Complete&quot; 신호를 보낸다.&lt;br /&gt;(3) 네임 노드는 최소한의 블록 복제가 완료되면 최종적으로 성공 신호를 반환한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 쓰기 작업은 dfs.namenode.replication.min에 설정된 개수만큼의 블록이 저장되면 성공한 것으로 간주된다. 기본값은 1이며, 나머지 복제 작업은 비동기적으로 수행된다. 하둡은 신뢰성, 쓰기 대역폭, 읽기 성능, 분산도 등의 균형을 전체적으로 고려하여 복제본을 저장할 데이터 노드를 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 쓰기 중 장애가 발생하는 경우&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;파이프라인이 닫히고 ACK 큐에 있는 모든 패킷이 데이터 큐 앞쪽에 다시 추가된다. &amp;rarr; 패킷이 유실되지 않는다.&lt;/li&gt;
&lt;li&gt;정상 데이터 노드는 네임 노드로부터 새로운 ID를 받아서 장애가 발생한 데이터 노드를 제외한 나머지 데이터 노드로 새로운 파이프라인을 구성한다.&lt;/li&gt;
&lt;li&gt;데이터는 새로운 파이프라인으로 전송되며, 네임 노드는 불완전 복제임을 인지하고 있으므로 나중에 다른 노드에 복제본이 생성되도록 조치한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;장애가 발생한 데이터 노드가 복구되면 불완전한 블록은 삭제된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Big Data/Hadoop</category>
      <category>빅데이터</category>
      <category>하둡</category>
      <author>peachh</author>
      <guid isPermaLink="true">https://peachh.tistory.com/280</guid>
      <comments>https://peachh.tistory.com/280#entry280comment</comments>
      <pubDate>Sat, 10 Sep 2022 18:30:09 +0900</pubDate>
    </item>
    <item>
      <title>[하둡 완벽 가이드] Chapter 03. 하둡 분산 파일시스템(3)</title>
      <link>https://peachh.tistory.com/279</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;하둡 파일시스템&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하둡은 파일시스템의 추상화 개념을 가지고 있고, HDFS는 그 구현체 중 하나이다. FTP, S3, Azure 등 여러 구현체가 존재한다. 위에서 살펴본 명령어는 모든 파일시스템에서 잘 동작한다. 하지만 대용량 데이터를 처리할 때는 HDFS와 같이 데이터 지역성 최적화가 가능한 분산 파일시스템을 선택하는 것이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인터페이스&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하둡은 파일시스템의 추상화 개념을 가지고 있고, 다음은 그 구현체의 목록이다. 맵리듀스 프로그램은 어떠한 파일시스템도 쉽게 실행할 수 있지만 대용량 데이터를 처리할 때는 HDFS처럼 데이터 지역성 최적화가 가능한 분산 파일시스템을 선택하는 것이 좋다. 파일시스템의 인스턴스에 접근할 때는 주로 URI 스킴을 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 231px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 20.5813%; height: 19px;&quot;&gt;파일시스템&lt;/td&gt;
&lt;td style=&quot;width: 15.349%; height: 19px;&quot;&gt;URI 스킴&lt;/td&gt;
&lt;td style=&quot;width: 36.6279%; height: 19px;&quot;&gt;자바 구현체 (org.apache.hadoop.)&lt;/td&gt;
&lt;td style=&quot;width: 27.4418%; height: 19px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 20.5813%; height: 38px;&quot;&gt;Local&lt;/td&gt;
&lt;td style=&quot;width: 15.349%; height: 38px;&quot;&gt;file&lt;/td&gt;
&lt;td style=&quot;width: 36.6279%; height: 38px;&quot;&gt;fs.LocalFileSystem&lt;/td&gt;
&lt;td style=&quot;width: 27.4418%; height: 38px;&quot;&gt;클라이언트 측 체크섬을 사용하는 로컬 디스크를 위한 파일시스템&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 20.5813%; height: 38px;&quot;&gt;HDFS&lt;/td&gt;
&lt;td style=&quot;width: 15.349%; height: 38px;&quot;&gt;hdfs&lt;/td&gt;
&lt;td style=&quot;width: 36.6279%; height: 38px;&quot;&gt;hdfs.DistributedFileSystem&lt;/td&gt;
&lt;td style=&quot;width: 27.4418%; height: 38px;&quot;&gt;맵리듀스와 효율적으로 연동하기 위한 파일시스템&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20.5813%; height: 17px;&quot;&gt;WebHDFS&lt;/td&gt;
&lt;td style=&quot;width: 15.349%; height: 17px;&quot;&gt;webhdfs&lt;/td&gt;
&lt;td style=&quot;width: 36.6279%; height: 17px;&quot;&gt;hdfs.web.WebHdfsFileSystem&lt;/td&gt;
&lt;td style=&quot;width: 27.4418%; height: 17px;&quot;&gt;HTTP를 통해 HDFS에 접근할 수 있는 파일시스템&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20.5813%; height: 17px;&quot;&gt;SecureWebHDFS&lt;/td&gt;
&lt;td style=&quot;width: 15.349%; height: 17px;&quot;&gt;swebhdfs&lt;/td&gt;
&lt;td style=&quot;width: 36.6279%; height: 17px;&quot;&gt;hdfs.web.SWebHdfsFileSystem&lt;/td&gt;
&lt;td style=&quot;width: 27.4418%; height: 17px;&quot;&gt;WebHDFS의 HTTPS 버전&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20.5813%; height: 17px;&quot;&gt;HAR&lt;/td&gt;
&lt;td style=&quot;width: 15.349%; height: 17px;&quot;&gt;har&lt;/td&gt;
&lt;td style=&quot;width: 36.6279%; height: 17px;&quot;&gt;fs.HarFileSystem&lt;/td&gt;
&lt;td style=&quot;width: 27.4418%; height: 17px;&quot;&gt;아카이브 파일을 위한 파일시스템&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20.5813%; height: 17px;&quot;&gt;View&lt;/td&gt;
&lt;td style=&quot;width: 15.349%; height: 17px;&quot;&gt;viewfs&lt;/td&gt;
&lt;td style=&quot;width: 36.6279%; height: 17px;&quot;&gt;viewfs.ViewFileSystem&lt;/td&gt;
&lt;td style=&quot;width: 27.4418%; height: 17px;&quot;&gt;다른 하둡 파일시스템을 위한 클라리언트 측 마운트 테이블&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20.5813%; height: 17px;&quot;&gt;FTP&lt;/td&gt;
&lt;td style=&quot;width: 15.349%; height: 17px;&quot;&gt;ftp&lt;/td&gt;
&lt;td style=&quot;width: 36.6279%; height: 17px;&quot;&gt;fs.ftp.FTPFileSystem&lt;/td&gt;
&lt;td style=&quot;width: 27.4418%; height: 17px;&quot;&gt;FTP 서버를 지원하는 파일시스템&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20.5813%; height: 17px;&quot;&gt;S3&lt;/td&gt;
&lt;td style=&quot;width: 15.349%; height: 17px;&quot;&gt;s3a&lt;/td&gt;
&lt;td style=&quot;width: 36.6279%; height: 17px;&quot;&gt;fs.s3a.S3AFileSystem&lt;/td&gt;
&lt;td style=&quot;width: 27.4418%; height: 17px;&quot;&gt;아마존 S3를 지원하는 파일시스템&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20.5813%; height: 17px;&quot;&gt;Azure&lt;/td&gt;
&lt;td style=&quot;width: 15.349%; height: 17px;&quot;&gt;wasb&lt;/td&gt;
&lt;td style=&quot;width: 36.6279%; height: 17px;&quot;&gt;fs.azure.NativeAzureFileSystem&lt;/td&gt;
&lt;td style=&quot;width: 27.4418%; height: 17px;&quot;&gt;마이크로소프트의 Azure를 지원하는 파일시스템&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20.5813%; height: 17px;&quot;&gt;Swift&lt;/td&gt;
&lt;td style=&quot;width: 15.349%; height: 17px;&quot;&gt;swift&lt;/td&gt;
&lt;td style=&quot;width: 36.6279%; height: 17px;&quot;&gt;fs.swift.snative.SwiftNativeFileSystem&lt;/td&gt;
&lt;td style=&quot;width: 27.4418%; height: 17px;&quot;&gt;오픈스택 Swift르르 지원하는 파일시스템&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자바 인터페이스&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FileSystem 클래스는 데이터를 읽고 쓰는 것 외에도 디렉터리, 파일시스템 질의, 파일 목록 조회, 파일 패턴, PathFilter, 데이터 삭제를 위한 다양한 메소드를 지원한다. 각 메소드에 대한 자세한 내용은 &lt;a href=&quot;https://hadoop.apache.org/docs/stable/api/org/apache/hadoop/fs/FileSystem.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;하둡 문서&lt;/a&gt;에 설명되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제 코드 실행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662729847743&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 다운로드한 예제 코드 폴더로 이동
$ cd ~/hadoop-book/ch03-hdfs

# 빌드 (maven은 미리 설치)
$ mvn install

# 하둡 디렉터리로 복사 (examples 디렉터리는 미리 생성)
$ cp target/ch03-hdfs-4.0.jar $HADOOP_HOME/examples

# 실행
$ hadoop jar $HADOOP_HOME/examples/ch03.jar URLCat hdfs://localhost/user/$USER/sample.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Big Data/Hadoop</category>
      <category>빅데이터</category>
      <category>하둡</category>
      <author>peachh</author>
      <guid isPermaLink="true">https://peachh.tistory.com/279</guid>
      <comments>https://peachh.tistory.com/279#entry279comment</comments>
      <pubDate>Fri, 9 Sep 2022 23:46:55 +0900</pubDate>
    </item>
    <item>
      <title>[하둡 완벽 가이드] Chapter 03. 하둡 분산 파일시스템(2)</title>
      <link>https://peachh.tistory.com/278</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;명령행 인터페이스&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;도움말&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662733379264&quot; class=&quot;dos&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ hadoop fs -help&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로컬에서 HDFS로 복사하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662733379264&quot; class=&quot;elixir&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ hadoop fs -copyFromLocal ~/Desktop/quangle.txt hdfs://localhost/user/$USER/quangle.txt	# 전체 경로
$ hadoop fs -copyFromLocal ~/Desktop/quangle.txt /user/$USER/quangle.txt				# core-site.xml에 설정된 fs.defaultFS 값 사용
$ hadoop fs -copyFromLocal ~/Desktop/quangle.txt quangle.txt						# 홈 디렉터리 (/user/$USER)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HDFS에서 로컬로 복사하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662733379265&quot; class=&quot;dockerfile&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ hadoop fs -copyToLocal quangle.txt ~/Desktop/quangle.copy.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;두 파일이 동일한지 확인하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662733379265&quot; class=&quot;elixir&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ md5 ~/Desktop/quangle.txt ~/Desktop/quangle.copy.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HDFS 파일 목록 확인하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662733379265&quot; class=&quot;dos&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ hadoop fs -ls&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Big Data/Hadoop</category>
      <category>빅데이터</category>
      <category>하둡</category>
      <author>peachh</author>
      <guid isPermaLink="true">https://peachh.tistory.com/278</guid>
      <comments>https://peachh.tistory.com/278#entry278comment</comments>
      <pubDate>Fri, 9 Sep 2022 23:23:20 +0900</pubDate>
    </item>
    <item>
      <title>MacOS에서 Maven 설치하기</title>
      <link>https://peachh.tistory.com/277</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;1. &lt;a href=&quot;https://maven.apache.org/download.cgi&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Maven 홈페이지&lt;/a&gt;에서 바이너리 파일 다운로드&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-09-09 오후 9.27.35.png&quot; data-origin-width=&quot;3584&quot; data-origin-height=&quot;1858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBMW4o/btrLKuWOHZA/HvkS05NlDQG9yylkNKbDdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBMW4o/btrLKuWOHZA/HvkS05NlDQG9yylkNKbDdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBMW4o/btrLKuWOHZA/HvkS05NlDQG9yylkNKbDdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBMW4o%2FbtrLKuWOHZA%2FHvkS05NlDQG9yylkNKbDdk%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;3584&quot; height=&quot;1858&quot; data-filename=&quot;스크린샷 2022-09-09 오후 9.27.35.png&quot; data-origin-width=&quot;3584&quot; data-origin-height=&quot;1858&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;&lt;b&gt;2. 압축 해제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662726602798&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ tar xvf apache-maven-3.8.6-bin.tar.gz&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;b&gt;3. 환경 변수 설정&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662726716970&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ vi ~/.zshrc

# 다음 내용 추가 후 [ESC] 누르고 :wq로 저장
export M3_HOME=/Users/jimin/Downloads/apache-maven-3.8.6
export PATH=$PATH:$M3_HOME/bin

$ source ~/.zshrc&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;b&gt;4. 설치 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662726841528&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mvn -version&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Tech</category>
      <category>maven</category>
      <category>메이븐</category>
      <category>설치가이드</category>
      <author>peachh</author>
      <guid isPermaLink="true">https://peachh.tistory.com/277</guid>
      <comments>https://peachh.tistory.com/277#entry277comment</comments>
      <pubDate>Fri, 9 Sep 2022 21:37:15 +0900</pubDate>
    </item>
    <item>
      <title>하둡 실행하기 (의사 분산 모드)</title>
      <link>https://peachh.tistory.com/276</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;환경 설정 파일 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하둡의 환경 설정 파일은 &lt;span style=&quot;background-color: #000000; color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #000000; color: #ffffff;&quot;&gt;$HADOOP_HOME/etc/hadoop&amp;nbsp;&lt;/span&gt; 경로에 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;core-site.xml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662697476931&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;configuration&amp;gt;
	&amp;lt;property&amp;gt;
		&amp;lt;name&amp;gt;fs.defaultFS&amp;lt;/name&amp;gt;
		&amp;lt;value&amp;gt;hdfs://localhost/&amp;lt;/value&amp;gt;
	&amp;lt;/property&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;hdfs-site.xml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662697502046&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;configuration&amp;gt;
	&amp;lt;property&amp;gt;
		&amp;lt;name&amp;gt;dfs.replication&amp;lt;/name&amp;gt;
		&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;
	&amp;lt;/property&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;mapred-site.xml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662697547935&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;configuration&amp;gt;
	&amp;lt;property&amp;gt;
		&amp;lt;name&amp;gt;mapreduce.framework.name&amp;lt;/name&amp;gt;
		&amp;lt;value&amp;gt;yarn&amp;lt;/value&amp;gt;
	&amp;lt;/property&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;yarn-site.xml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662697543558&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;configuration&amp;gt;
	&amp;lt;property&amp;gt;
		&amp;lt;name&amp;gt;yarn.resourcemanager.hostname&amp;lt;/name&amp;gt;
		&amp;lt;value&amp;gt;localhost&amp;lt;/value&amp;gt;
	&amp;lt;/property&amp;gt;
	&amp;lt;property&amp;gt;
		&amp;lt;name&amp;gt;yarn.nodemanager.aux-services&amp;lt;/name&amp;gt;
		&amp;lt;value&amp;gt;mapreduce_shuffle&amp;lt;/value&amp;gt;
	&amp;lt;/property&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SSH 설정&lt;/h2&gt;
&lt;pre id=&quot;code_1662697852606&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt-get install ssh

# MAC OS인 경우, [시스템 환경설정]-[공유]-[원격 로그인]을 활성화해야 함

$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys
$ ssh localhost&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HDFS 포맷&lt;/h2&gt;
&lt;pre id=&quot;code_1662697927814&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ hdfs namenode -format&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데몬의 시작 및 종료&lt;/h2&gt;
&lt;pre id=&quot;code_1662698065263&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ start-dfs.sh                                  # HDFS 데몬 시작
$ start-yarn.sh                                 # YARN 데몬 시작
$ mr-jobhistory-daemon.sh start historyserver   # 맵리듀스 데몬 시작&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행중인 데몬을 확인하려면 다음 명령어를 사용하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1662723057861&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ jps
2755 NameNode
3126 ResourceManager
3225 NodeManager
2858 DataNode
3309 Jps&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 링크에서 웹 UI로도 확인할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네임 노드 웹 UI : http://localhost:50070/&lt;/li&gt;
&lt;li&gt;리소스 매니저 웹 UI :&lt;span&gt;&amp;nbsp;&lt;/span&gt;http://localhost:8088/&lt;/li&gt;
&lt;li&gt;히스토리 서버 웹 UI :&lt;span&gt;&amp;nbsp;&lt;/span&gt;http://localhost:19888/&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1662698338027&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ stop-dfs.sh                                   # HDFS 데몬 종료
$ stop-yarn.sh                                  # YARN 데몬 종료
$ mr-jobhistory-daemon.sh stop historyserver    # 맵리듀스 데몬 종료&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 한 번에 모든 데몬을 시작 및 종료할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1662702528644&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ start-all.sh    # 전체 데몬 시작
$ stop-all.sh     # 전체 데몬 종료&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용자 디렉터리 생성&lt;/h2&gt;
&lt;pre id=&quot;code_1662698471953&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ hadoop fs -mkdir -p /user/$USER&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Big Data/Hadoop</category>
      <category>빅데이터</category>
      <category>하둡</category>
      <author>peachh</author>
      <guid isPermaLink="true">https://peachh.tistory.com/276</guid>
      <comments>https://peachh.tistory.com/276#entry276comment</comments>
      <pubDate>Fri, 9 Sep 2022 13:46:45 +0900</pubDate>
    </item>
    <item>
      <title>[하둡 완벽 가이드] Chapter 03. 하둡 분산 파일시스템(1)</title>
      <link>https://peachh.tistory.com/275</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HDFS&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HDFS는 Hadoop Distributed File System의범용 하드웨어로 구성된 클러스터에서 실행되고 스트리밍 방식의 데이터 접근 패턴으로 대용량 파일을 다룰 수 있도록 설계된&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;분산 파일시스템&lt;/b&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;스트리밍 방식의 데이터 접근 : 데이터를 한 번 쓰고 여러 번 읽음, 첫 번째 레코드를 읽는 시간보다 전체 데이터셋을 읽는 시간이 더 중요함&lt;/li&gt;
&lt;li&gt;대용량 파일 : 수백 MB, GB, TB를 넘어 PB 크기의 데이터를 저장&lt;/li&gt;
&lt;li&gt;분산 파일시스템 : 네트워크로 연결된 여러 머신의 스토리지를 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;블록&lt;/h2&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;파일시스템 &amp;rarr; n KB&lt;/li&gt;
&lt;li&gt;디스크 &amp;rarr; 512 bytes&lt;/li&gt;
&lt;li&gt;HDFS &amp;rarr; 128 MB&amp;nbsp; &amp;nbsp; &amp;nbsp;  탐색 비용을 최소화하기 위해 블록의 크기가 큼&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일 크기가 블록 크기보다 작은 경우&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단일 디스크를 위한 파일시스템 &amp;rarr; 하나의 블록 전체를 점유&lt;/li&gt;
&lt;li&gt;HDFS &amp;rarr; 파일 크기 만큼만 점유&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;블록 추상화의 이점&lt;/b&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;스토리지의 서브시스템을 단순화할 수 있다. 블록이 고정 크기이므로 저장하기 위한 디스크 용량만 계산하면 되기 때문에 스토리지 관리가 단순해진다. 그리고 파일의 메타데이터와 데이터를 함께 저장하지 않아도 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;블록 수준에서 파일시스템의 유지 관리를 위한 도구&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;df : 디스크 여유 공간 확인&lt;/li&gt;
&lt;li&gt;fsck : 파일시스템 일관성 확인 및 대화형 복구 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;네임 노드와 데이터 노드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HDFS는 하나의 네임 노드와 여러 개의 데이터 노드로 구성되며 이는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Master-Worker 패턴&lt;/b&gt;으로 동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클라이언트&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Client)&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;POSIX와 유사한 파일시스템 인터페이스 제공함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;네임 노드&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;(Name Node)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일시스템의 메타데이터 유지 : Namespace Image와 Edit Log라는 두 종류의 파일로 로컬 디스크에 영속적으로 저장함&lt;/li&gt;
&lt;li&gt;파일의 블록이 저장된 데이터 노드 파악 : 시스템 시작 시 데이터 노드로부터 정보를 받음 (영속적으로 저장 X)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터 노드&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;(Data Node)&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;저장하고 있는 블록의 목록을 주기적으로 네임 노드에게 알림&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;보조 네임 노드&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Secondary Name Node)&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;네임 노드에 장애가 발생하면 파일시스템이 동작하지 않기 때문에 장애 대비용으로 존재함&lt;/li&gt;
&lt;li&gt;Edit Log 가 너무 커지지 않도록 주기적으로 Namespace Image와 Edit Log를 병합하여 최신 버전의 Namespace Image를 생성함&lt;/li&gt;
&lt;li&gt;장애 발생에 대비해 Namespace Image의 복제본을 보관함 (시간차 복제로 인한 손실은 불가피함)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;블록 캐싱&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 접근되는 블록은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Off-Heap 블록 캐시&lt;/b&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;사용자나 애플리케이션 : 캐시 풀(Cache Pool)에 캐시 지시자(Cache Directive)를 추가하여 특정 파일을 캐싱할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;페더레이션&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HDFS 페더레이션(Federation)을 활용하면 각 네임 노드가 파일시스템의 네임스페이스를 나누어 관리하는 방식으로 새로운 네임 노드를 추가할 수 있다. 즉, 페더레이션은 네임 노드의 확장성 문제를 해결하기 위한 방안이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페더레이션을 적용하면 각 네임 노드는 네임스페이스 볼륨(Namespace Volume)과 블록 풀(Block Pool)을 관리한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네임스페이스 볼륨(Namespace Volume) : 네임스페이스의 메타데이터를 구성함 (네임 노드마다 독립 O)&lt;/li&gt;
&lt;li&gt;블록 풀(Block Pool) : 네임스페이스에 포함된 파일의 전체 블록을 보관함 (네임 노드마다 독립 X)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트는 페더레이션 클러스터에 접근하기 위해 파일 경로와 네임 노드를 매핑한 클라이언트 측 마운트 테이블을 이용한다. 이는 환경 설정에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://hadoop.apache.org/docs/r3.0.0/api/org/apache/hadoop/fs/viewfs/ViewFileSystem.html&quot;&gt;ViewFileSystem&lt;/a&gt;과&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/ViewFs.html#How_The_Clusters_Look&quot;&gt;viewfs://URI&lt;/a&gt;를 사용해서 관리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;고가용성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 손실을 방지하기 위해 네임 노드의 메타데이터를 다수의 파일시스템에 복제하는 방식과 보조 네임 노드를 사용하여 체크포인트를 생성하는 방식을 조합하여 사용할 수 있다. 하지만 여전히 네임 노드는 단일 고장 지점(Single Point Of Failure, SPOF)이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네임 노드에 장애가 발생하면 새로운 네임 노드를 구동하고 요청을 처리하기 위한 준비를 마칠 때까지 아무런 처리도 하지 못한다. 대형 클러스터에서는 30분 이상 소요되기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 해결하기 위해 HDFS 고가용성(High Availability, HA)은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Active-Standby 상태&lt;/b&gt;의 네임 노드 쌍으로 구현된다. Active 네임 노드에 장애가 발생하면 Standby 네임 노드가 그 역할을 이어받아 큰 중단 없이 요청을 처리할 수 있다. (1분 정도 소요)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고가용성을 지원하기 위해 HDFS의 구조가 약간 변경된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Edit Log를 공유하기 위해 고가용성 공유 스토리지를 사용함 (NFS or QJM)&lt;/li&gt;
&lt;li&gt;데이터 노드는 블록 정보를 두 개의 네임 노드에게 보고함 (네임 노드의 메모리에 저장됨)&lt;/li&gt;
&lt;li&gt;Standby 네임 노드는 Secondary 네임 노드의 역할을 포함함&lt;/li&gt;
&lt;/ul&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;장애 복구 컨트롤러는 Standby 네임 노드를 활성화시키는 전환 작업을 관리하며, 단 하나의 네임 노드만 Active 상태에 있는 것을 보장하기 위해 주키퍼로 구현된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우아한 장애 복구(Graceful Failover) : 정기적인 유지 관리를 위해 관리자가 수동으로 초기화함&lt;/li&gt;
&lt;li&gt;우아하지 않은 장애 복구(Ungraceful Failover) : 장애가 발생한 네임 노드가 중단됐다는 것을 확신하기 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고가용성을 위해 기존의 Active 네임 노드가 시스템을 손상시키지 않도록 하기 위해 펜싱(fencing) 메소드가 제공된다. 공유 스토리지 접근 제한, 원력으로 네트워크 포트 차단 등 다양한 펜싱 메커니즘이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Big Data/Hadoop</category>
      <category>빅데이터</category>
      <category>하둡</category>
      <author>peachh</author>
      <guid isPermaLink="true">https://peachh.tistory.com/275</guid>
      <comments>https://peachh.tistory.com/275#entry275comment</comments>
      <pubDate>Wed, 7 Sep 2022 01:26:08 +0900</pubDate>
    </item>
    <item>
      <title>하둡 설치하기</title>
      <link>https://peachh.tistory.com/274</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;1. &lt;a href=&quot;https://cwiki.apache.org/confluence/display/HADOOP/Hadoop+Java+Versions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;하둡 위키 페이지&lt;/a&gt;에서 필요한 자바 버전 확인&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-08-26 오전 1.31.40.png&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dody3b/btrKAjufpLH/tGdOwO8DXoEUBKsZbnzNf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dody3b/btrKAjufpLH/tGdOwO8DXoEUBKsZbnzNf0/img.png&quot; data-alt=&quot;설치하려는 하둡 버전에 따라 필요한 자바 버전을 확인한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dody3b/btrKAjufpLH/tGdOwO8DXoEUBKsZbnzNf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdody3b%2FbtrKAjufpLH%2FtGdOwO8DXoEUBKsZbnzNf0%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;1164&quot; height=&quot;313&quot; data-filename=&quot;스크린샷 2022-08-26 오전 1.31.40.png&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설치하려는 하둡 버전에 따라 필요한 자바 버전을 확인한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1662722561619&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ java version&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;스크린샷 2022-08-26 오전 2.41.45.png&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo6sYn/btrKzKTswfJ/A0Sr38k6xsgaOWDgCXDkh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo6sYn/btrKzKTswfJ/A0Sr38k6xsgaOWDgCXDkh0/img.png&quot; data-alt=&quot;설치된 자바 버전을 확인한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo6sYn/btrKzKTswfJ/A0Sr38k6xsgaOWDgCXDkh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo6sYn%2FbtrKzKTswfJ%2FA0Sr38k6xsgaOWDgCXDkh0%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;851&quot; height=&quot;92&quot; data-filename=&quot;스크린샷 2022-08-26 오전 2.41.45.png&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;92&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. &lt;a href=&quot;https://hadoop.apache.org/releases.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;하둡 배포 페이지&lt;/a&gt;에서 배포판 바이너리 다운로드&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-08-26 오전 1.22.51.png&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U7dH8/btrKwUPR7cU/5IGkytWX9MPkbqoCbbZuJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U7dH8/btrKwUPR7cU/5IGkytWX9MPkbqoCbbZuJ0/img.png&quot; data-alt=&quot;원하는 버전의 binary 를 클릭하면 아래 화면으로 이동한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U7dH8/btrKwUPR7cU/5IGkytWX9MPkbqoCbbZuJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU7dH8%2FbtrKwUPR7cU%2F5IGkytWX9MPkbqoCbbZuJ0%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;1153&quot; height=&quot;354&quot; data-filename=&quot;스크린샷 2022-08-26 오전 1.22.51.png&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;원하는 버전의 binary 를 클릭하면 아래 화면으로 이동한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-08-26 오전 1.27.26.png&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBMaCm/btrKwWGTyZQ/J7dSv9VO0KTHABZSypkhd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBMaCm/btrKwWGTyZQ/J7dSv9VO0KTHABZSypkhd1/img.png&quot; data-alt=&quot;링크를 클릭해서 다운로드 한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBMaCm/btrKwWGTyZQ/J7dSv9VO0KTHABZSypkhd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBMaCm%2FbtrKwWGTyZQ%2FJ7dSv9VO0KTHABZSypkhd1%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;1186&quot; height=&quot;432&quot; data-filename=&quot;스크린샷 2022-08-26 오전 1.27.26.png&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;432&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 압축 풀기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662702386093&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ tar xzf hadoop-3.3.4.tar.gz     # 다운로드한 파일&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;스크린샷 2022-08-26 오전 2.44.05.png&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wye4G/btrKA3qZ7Rw/mBCdhjFUgkSDgG8MAokGT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wye4G/btrKA3qZ7Rw/mBCdhjFUgkSDgG8MAokGT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wye4G/btrKA3qZ7Rw/mBCdhjFUgkSDgG8MAokGT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwye4G%2FbtrKA3qZ7Rw%2FmBCdhjFUgkSDgG8MAokGT1%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;847&quot; height=&quot;72&quot; data-filename=&quot;스크린샷 2022-08-26 오전 2.44.05.png&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;72&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;&lt;b&gt;4. 환경 변수 설정&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662702115151&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ export HADOOP_HOME=/Users/jimin/Downloads/hadoop-3.3.4    # 하둡이 설치된 경로
$ export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin&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;스크린샷 2022-08-26 오전 2.49.47.png&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;71&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHJxSf/btrKzZbGwrb/QmIKhYKnzt7E6NSAQYtYv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHJxSf/btrKzZbGwrb/QmIKhYKnzt7E6NSAQYtYv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHJxSf/btrKzZbGwrb/QmIKhYKnzt7E6NSAQYtYv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHJxSf%2FbtrKzZbGwrb%2FQmIKhYKnzt7E6NSAQYtYv0%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;849&quot; height=&quot;71&quot; data-filename=&quot;스크린샷 2022-08-26 오전 2.49.47.png&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;71&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;&lt;b&gt;5. 하둡 버전 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662702268260&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ hadoop version&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;스크린샷 2022-08-26 오전 2.50.02.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOhCXZ/btrKz3kIC28/RslAW7NGzUEgGYk6MKZw71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOhCXZ/btrKz3kIC28/RslAW7NGzUEgGYk6MKZw71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOhCXZ/btrKz3kIC28/RslAW7NGzUEgGYk6MKZw71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOhCXZ%2FbtrKz3kIC28%2FRslAW7NGzUEgGYk6MKZw71%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;850&quot; height=&quot;121&quot; data-filename=&quot;스크린샷 2022-08-26 오전 2.50.02.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;121&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;&lt;b&gt;6. 환경 설정&lt;/b&gt;&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;독립 모드 (standalone) : 데몬이 실행되지 않고 모든 것이 단독 JVM 내에서 실행된다.&lt;/li&gt;
&lt;li&gt;의사 분산 모드 (pseudo-distributed) : 모든 하둡 데몬을 로컬 머신에서 실행한다.&lt;/li&gt;
&lt;li&gt;완전 분산 모드 (fully-distributed) : 하둡 데몬을 여러 대의 머신으로 구성된 클러스터에서 실행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 동작 모드에 따라 설정 파일을 수정해야 한다. 설정 파일은 &lt;span style=&quot;color: #ffffff; background-color: #000000;&quot;&gt;&amp;nbsp;/etc/hadoop &lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&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;스크린샷 2022-08-26 오전 2.57.34.png&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ndZgI/btrKALcYIQU/vJQKKk2JpKT9xz84qxBxt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ndZgI/btrKALcYIQU/vJQKKk2JpKT9xz84qxBxt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ndZgI/btrKALcYIQU/vJQKKk2JpKT9xz84qxBxt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FndZgI%2FbtrKALcYIQU%2FvJQKKk2JpKT9xz84qxBxt0%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;849&quot; height=&quot;136&quot; data-filename=&quot;스크린샷 2022-08-26 오전 2.57.34.png&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Big Data/Hadoop</category>
      <category>빅데이터</category>
      <category>하둡</category>
      <author>peachh</author>
      <guid isPermaLink="true">https://peachh.tistory.com/274</guid>
      <comments>https://peachh.tistory.com/274#entry274comment</comments>
      <pubDate>Fri, 26 Aug 2022 03:07:10 +0900</pubDate>
    </item>
    <item>
      <title>[하둡 완벽 가이드] Chapter 02. 맵리듀스</title>
      <link>https://peachh.tistory.com/273</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;단일 머신에서 멀티 스레드를 활용한 병렬 처리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 작업을 동일한 크기로 나누기 어려움&lt;br /&gt;처리해야 할 파일마다 크기가 다른 경우, 결국엔 가장 큰 파일을 처리하는 시간에 의해 전체 처리 시간이 결정된다.&lt;br /&gt;최대한 동일한 크기로 나누고 싶다면 각 파일을 고정 길이의 청크 단위로 나누어 처리할 수는 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 병렬 처리된 결과를 병합하는 데 더 많은 처리가 필요할 수 있음&lt;br /&gt;파일을 병렬 처리하여 얻은 중간 결과를 모아서 추가적인 처리를 해야만 최종 결과를 얻을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 단일 머신의 처리 능력에 한계가 있음&lt;br /&gt;만약 단일 머신에서 여러 개의 프로세서로 처리할 수 있는 최적의 수행 시간이 20분이라면 그 이상 빨라질 수는 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 병렬 처리는 매우 복잡하므로 하둡과 같은 프레임워크를 활용하는 것이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;하둡을 활용한 병렬 처리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하둡이 제공하는 병렬 처리를 이용하기 위해 요구사항을 맵리듀스 작업으로 표현해야 한다. 맵리듀스는 맵 단계와 리듀스 단계로 구분되며, 프로그래머가 맵 함수와 리듀스 함수를 작성해야 한다. 각 단계의 입력과 출력은 key-value 쌍이며 타입은 상관없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #456771; color: #ffffff;&quot;&gt;[예제] 날씨 데이터를 가지고 연도별 최고 기온 구하기&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;원본 데이터가 맵 함수의 입력으로 주어진다.&lt;br /&gt;&lt;span style=&quot;color: #456771;&quot;&gt;하나의 레코드는 연도, 위도, 경도, 기온, 풍향 등을 포함한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;맵 단계에서 주어진 입력에서 연도와 기온을 추출한다. + 잘못된 레코드 필터링&lt;/li&gt;
&lt;li&gt;맵 단계의 결과로 &amp;lt;연도, 기온&amp;gt; 쌍들이 반환된다.&lt;br /&gt;&lt;span style=&quot;color: #456771;&quot;&gt;&amp;lt;2000, 24&amp;gt; &lt;span style=&quot;color: #456771;&quot;&gt;&amp;lt;2001, 14&amp;gt; &lt;/span&gt;&amp;lt;2000, 32&amp;gt; &amp;lt;2000, 18&amp;gt; &amp;lt;2001, 22&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;셔플 단계에서 같은 key를 가지는 데이터를 모으고 key를 기준으로 정렬한다. (key = 연도)&lt;br /&gt;&lt;span style=&quot;color: #456771;&quot;&gt;&amp;lt;2000, [24, 32, 18]&amp;gt; &amp;lt;2001, [14, 22]&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;리듀스 단계에서 연도별 최고 기온을 구한다. &lt;span style=&quot;color: #456771;&quot;&gt;►&lt;b&gt;&amp;nbsp;최종 결과&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #456771;&quot;&gt;&amp;lt;2000, 32&amp;gt; &amp;lt;2001, 22&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;맵리듀스&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;job은 클라이언트가 수행하는 작업의 기본 단위이며 입력 데이터, 맵리듀스 프로그램, 설정 정보로 구성된다. job은 map 태스크와 reduce 태스크로 나누어 실행되고, &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;각 태스크는 YARN을 통해 스케줄링된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하둡은 입력 데이터를 split이라는 고정 크기의 조각으로 분리한다. split의 크기가 작을수록 부하분산 효과가 좋지만 크기가 너무 작으면 관리를 위한 오버헤드 때문에 실행시간이 증가하게 된다. 보통 HDFS 블록의 기본 크기인 128 MB가 적당하다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하둡은 split 마다 하나의 map 태스크를 생성하고 record 단위로 처리한다. &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;특정 노드의 태스크가 실패하면 다른 노드에 재할당하여 다시 실행한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하둡은 입력 데이터가 있는 노드에서 map 태스크를 실행할 때 가장 빠르다. 이를 데이터 지역성 최적화라고 한다. 이 방식은 네트워크 자원 사용을 최소화할 수 있다. 데이터의 복제본이 저장된 모든 노드에서 map 태스크를 실행할 수 없는 경우, 동일 랙이 다른 노드에서 map 태스크를 실행할 수도 있다. 이것도 불가능하다면 네트워크 전송을 통해 외부 랙에서 map 태스크를 실행해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map 태스크의 결과는 HDFS가 아닌 로컬 디스크에 저장된다. map 단계의 결과는 reduce 단계에서 최종 결과를 생성하기 위한 중간 결과이므로 job이 완료된 후에는 버려지기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reduce 태스크는 모든 map 태스크의 결과를 입력으로 받는다. reduce 태스크의 결과는 로컬 노드의 HDFS에 저장되고, 외부 랙에 복제본을 저장한다. reducer가 여러 개이면 reducer만큼 파티션을 생성하고 mapper의 결과를 각 파티션에 분배한다. 주로 key를 해싱하여 분배한다. 모든 처리를 완전히 병렬로 처리하는 경우 reducer가 없을 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하둡 클러스터에서 job이 사용하는 네트워크 대역폭은 한계가 있기 때문에 mapper의 결과를 reducer로 전송하기 위한 네트워크 사용을 최소화 하기 위해 combiner 함수를 사용할 수 있다. reduce 함수를 &lt;span&gt;combiner 함수로 &lt;/span&gt;재사용할 수 있다. combiner 함수는 적용하는 데에 제약이 있다. 예를 들어 max, min 과 같은 처리는 combiner 함수를 적용해도 최종 결과가 바뀌지 않지만 mean 의 경우엔 최종 결과가 달라지기 때문에 combiner 함수를 적용하기 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자바의 맵리듀스&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;맵 단계 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://hadoop.apache.org/docs/r2.7.4/api/org/apache/hadoop/mapreduce/Mapper.html&quot;&gt;Mapper&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;클래스의 추상 메소드 map()을 정의하여 구현한다.&lt;/li&gt;
&lt;li&gt;리듀스 단계 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://hadoop.apache.org/docs/r2.7.0/api/org/apache/hadoop/mapreduce/Reducer.html&quot;&gt;Reducer&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;클래스의 추상 메소드 reduce()를 정의하여 구현한다.&lt;/li&gt;
&lt;li&gt;Job :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://hadoop.apache.org/docs/stable/api/org/apache/hadoop/mapreduce/Job.html&quot;&gt;Job&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;클래스로 맵리듀스를 수행할 Job을 정의한다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하둡 클러스터에서 Job을 실행하기 위해서는 jar 파일을 생성하여 배포해야 한다.&lt;/li&gt;
&lt;li&gt;지정한 출력 파일 경로가 미리 존재한다면 에러가 발생하고 Job이 실행되지 않는다. (데이터 유실 방지)&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;h2 data-ke-size=&quot;size26&quot;&gt;하둡 스트리밍&lt;/h2&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;</description>
      <category>Big Data/Hadoop</category>
      <category>빅데이터</category>
      <category>하둡</category>
      <author>peachh</author>
      <guid isPermaLink="true">https://peachh.tistory.com/273</guid>
      <comments>https://peachh.tistory.com/273#entry273comment</comments>
      <pubDate>Thu, 25 Aug 2022 01:38:46 +0900</pubDate>
    </item>
    <item>
      <title>[하둡 완벽 가이드] Chapter 01. 하둡과의 만남</title>
      <link>https://peachh.tistory.com/272</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 저장소와 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하드 디스크의 용량은 크게 증가했지만 데이터 IO 속도는 그렇지 못했다.&lt;br /&gt;하지만 같은 양의 데이터를 100개로 나눠서 저장하고 공유하여 병렬로 작업한다면 IO 속도를 줄일 수 있다.&lt;br /&gt;이때 고려해야 할 문제들이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 하드웨어 장애&lt;br /&gt;하드웨어를 많이 사용할수록 장애 발생 확률도 높아진다.&lt;br /&gt;데이터 손실을 방지하기 위해 복제본을 만들어 여러 곳에 보관할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 분산된 데이터 병합&lt;br /&gt;데이터 분석을 위해 100개로 나눠서 저장한 데이터를 병합해야 한다.&lt;br /&gt;맵리듀스는 데이터 IO를 key-value 쌍의 계산으로 변환한 추상화된 프로그래밍 모델을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;하둡의 처리 패턴&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하둡 에코시스템은 분산 컴퓨팅과 대규모 데이터 처리를 위한 기반 시설이다.&lt;br /&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;span&gt;맵리듀스는 한 번의 쿼리로 전체 데이터셋을 처리할 수 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;일괄 질의 처리기이다.&lt;/li&gt;
&lt;li&gt;반복 처리 - Spark는 메모리에 저장된 임시 데이터셋을 탐색하여 작업을 수행할 수 있으므로 매번 디스크 IO를 수행하지 않아도 된다.&lt;/li&gt;
&lt;li&gt;스트림 처리 - 스트리밍 시스템(Storm, Spark Streaming, Samza 등)은 실시간으로 실행되고 경계가 없는 스트림 데이터를 분산 계산하여 그 결과를 하둡 저장소나 외부 시스템에 전송한다.&lt;/li&gt;
&lt;li&gt;대화형 SQL - 장기 실행 전용 데몬 (Impala) 또는 컨테이너를 재사용하는 분산 쿼리 엔진(Tez based Hive)을 사용한다.&lt;/li&gt;
&lt;li&gt;검색 - 검색 플랫폼인 Solr는 하둡 클러스터에서 실행되어 HDFS에 문서를 인덱싱하여 저장하고 검색 쿼리를 제공한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;RDBMS vs 맵리듀스&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 144px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 23.4496%; text-align: center; height: 18px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 37.9845%; text-align: center; height: 18px;&quot;&gt;RDBMS&lt;/td&gt;
&lt;td style=&quot;width: 38.5658%; text-align: center; height: 18px;&quot;&gt;맵리듀스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 23.4496%; text-align: center; height: 18px;&quot;&gt;데이터 크기&lt;/td&gt;
&lt;td style=&quot;width: 37.9845%; text-align: center; height: 18px;&quot;&gt;GB&lt;/td&gt;
&lt;td style=&quot;width: 38.5658%; text-align: center; height: 18px;&quot;&gt;PB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.4496%; text-align: center;&quot;&gt;데이터 유형&lt;/td&gt;
&lt;td style=&quot;width: 37.9845%; text-align: center;&quot;&gt;정형&lt;/td&gt;
&lt;td style=&quot;width: 38.5658%; text-align: center;&quot;&gt;정형, 반정형, 비정형&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 23.4496%; text-align: center; height: 18px;&quot;&gt;접근 방식&lt;/td&gt;
&lt;td style=&quot;width: 37.9845%; text-align: center; height: 18px;&quot;&gt;대화형, 일괄 처리&lt;/td&gt;
&lt;td style=&quot;width: 38.5658%; text-align: center; height: 18px;&quot;&gt;일괄 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 23.4496%; text-align: center; height: 18px;&quot;&gt;IO&lt;/td&gt;
&lt;td style=&quot;width: 37.9845%; text-align: center; height: 18px;&quot;&gt;여러 번 읽고 쓰기&lt;/td&gt;
&lt;td style=&quot;width: 38.5658%; text-align: center; height: 18px;&quot;&gt;한 번 쓰고 여러 번 읽기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 23.4496%; text-align: center; height: 18px;&quot;&gt;트랜잭션&lt;/td&gt;
&lt;td style=&quot;width: 37.9845%; text-align: center; height: 18px;&quot;&gt;ACID&lt;/td&gt;
&lt;td style=&quot;width: 38.5658%; text-align: center; height: 18px;&quot;&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 23.4496%; text-align: center; height: 18px;&quot;&gt;구조&lt;/td&gt;
&lt;td style=&quot;width: 37.9845%; text-align: center; height: 18px;&quot;&gt;쓰기 기준 스키마&lt;/td&gt;
&lt;td style=&quot;width: 38.5658%; text-align: center; height: 18px;&quot;&gt;읽기 기준 스키마&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 23.4496%; text-align: center; height: 18px;&quot;&gt;무결성&lt;/td&gt;
&lt;td style=&quot;width: 37.9845%; text-align: center; height: 18px;&quot;&gt;높음&lt;/td&gt;
&lt;td style=&quot;width: 38.5658%; text-align: center; height: 18px;&quot;&gt;낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 23.4496%; text-align: center; height: 18px;&quot;&gt;확장성&lt;/td&gt;
&lt;td style=&quot;width: 37.9845%; text-align: center; height: 18px;&quot;&gt;비선형&lt;/td&gt;
&lt;td style=&quot;width: 38.5658%; text-align: center; height: 18px;&quot;&gt;선형&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Big Data/Hadoop</category>
      <category>빅데이터</category>
      <category>하둡</category>
      <author>peachh</author>
      <guid isPermaLink="true">https://peachh.tistory.com/272</guid>
      <comments>https://peachh.tistory.com/272#entry272comment</comments>
      <pubDate>Wed, 24 Aug 2022 00:43:51 +0900</pubDate>
    </item>
  </channel>
</rss>