Hadoop 및 Spark

여러이야기/IT 2023. 10. 12. 10:10

Hadoop과 Spark는 빅데이터 처리를 위한 오픈 소스 소프트웨어 프레임워크로, 
대용량 데이터를 저장하고 처리하기 위한 기술을 제공한다.

Hadoop:

Hadoop은 아파치 재단에서 개발한 분산 데이터 처리 프레임워크이며, 
주요 구성 요소로는 Hadoop Distributed File System (HDFS)와 MapReduce가 있다.
HDFS: 대용량 데이터를 여러 노드에 분산하여 저장하는 파일 시스템이다. 
데이터를 여러 블록으로 나눠 분산 저장하고, 
데이터의 복제를 통해 내결함성을 제공한다.
MapReduce: 데이터를 처리하는 분산 컴퓨팅 모델로, 대규모 데이터셋을 여러 노드에서 처리하고 결과를 집계한다. 주로 일괄 처리 작업에 사용된다.
Hadoop은 대규모 배치 작업에 적합하며, 안정성과 내결함성이 중요한 환경에서 사용된다. 다만, 실시간 데이터 처리와 반응성면에서는 제한이 있다.


Apache Spark:

Apache Spark은 빅데이터 처리를 위한 빠르고 다목적 분산 처리 프레임워크이며, 
빅데이터 처리 작업을 빠르게 수행할 수 있으며, 다양한 데이터 처리 작업을 지원한다.
Spark는 메모리 기반 데이터 처리를 사용하여 디스크 기반의 Hadoop MapReduce보다 훨씬 빠른 처리 속도를 제공한다. 
또한, 다양한 데이터 소스와 통합이 쉽고 다양한 데이터 처리 라이브러리를 포함한다.
Spark는 배치 처리, 스트리밍 데이터 처리, 머신러닝 및 그래프 처리 등 다양한 작업을 처리할 수 있다.
스트리밍 처리를 지원하므로 실시간 데이터 처리도 가능하다.
Spark은 다양한 언어에서 사용 가능하며, 대부분의 언어로 개발된 라이브러리를 사용할 수 있다.

요약하면, 
Hadoop은 
대용량 배치 처리와 데이터 저장을 위한 프레임워크로, 
안정성과 내결함성을 강조한다. 
반면에 Spark는 
빠르고 다목적 데이터 처리를 지원하며, 
실시간 및 배치 처리를 모두 다루는데 적합하다. 

두 기술은 서로 보완적으로 사용되기도 하며, 사용 사례와 요구 사항에 따라 선택된다.

Posted by TwoTen
l

XML과 JSON은 모두 데이터를 표현하고 교환하기 위한 형식이며,
각각의 특징과 장단점운 아래 와 같다.

**XML (Extensible Markup Language):**
- **장점:**
  1. **계층 구조**: XML은 계층 구조를 가짐으로써 복잡한 데이터 구조를 표현하는 데 용이하다.
  2. **설명력**: XML 태그는 데이터에 대한 설명을 포함할 수 있으며, 이로 인해 데이터 의미를 이해하기 쉬워진다.
  3. **DTD 및 XML 스키마**: DTD 및 XML 스키마를 사용하여 데이터의 유효성을 검사하고 데이터 일관성을 보장할 수 있다.
  4. **다양한 문자 인코딩**: XML은 다양한 문자 인코딩 방식을 지원하므로 국제화 및 지역화에 유용하다.

- **단점:**
  1. **불필요한 중복**: XML 문서는 종종 반복적인 태그와 불필요한 길이를 가질 수 있어 데이터 크기가 상대적으로 크다.
  2. **구문 복잡성**: XML 문서는 파싱 및 생성이 JSON에 비해 복잡하고 느릴 수 있다.
  
**JSON (JavaScript Object Notation):**
- **장점:**
  1. **간결함**: JSON은 간단한 데이터 구조로 데이터를 표현한다. 이로써 데이터 크기가 작아지고 처리가 빠르다.
  2. **가독성**: JSON은 데이터를 사람이 읽기 쉬운 형식으로 표현하며, 프로그래머들에게 친숙하다.
  3. **빠른 파싱**: JSON 문서는 파싱이 빠르며 대부분의 프로그래밍 언어에서 지원한다.
  4. **JavaScript 통합**: JSON은 JavaScript와 연동이 용이하며, 웹 애플리케이션에서 일반적으로 사용된다.

- **단점:**
  1. **계층 구조 제한**: JSON은 XML보다 덜 계층적이며 복잡한 데이터 구조를 나타내기 어려울 수 있다.
  2. **설명력 부족**: JSON은 태그에 대한 설명을 제공하지 않으며, 데이터 의미를 파악하기 어려울 수 있다.

간단한 데이터 교환 및 웹 서비스 통신에는 JSON이 효율적이며, 
복잡한 계층 구조 및 설명력이 필요한 경우에는 XML을 고려할 수 있다. 
JSON과 XML을 혼합하여 사용하거나, 데이터 변환 도구를 사용하여 두 형식 간에 데이터를 변환하기도 한다.

Posted by TwoTen
l

XML이란?

여러이야기/IT 2023. 10. 12. 09:22

XML(Extensible Markup Language)은 
데이터를 저장하고 전송하기 위한 마크업 언어의 한 형식이며, 
사람과 기계가 모두 이해하기 쉽고, 
다양한 종류의 데이터를 구조화하고, 
교환하기 위한 강력한 도구로 사용된다. 
주요 특징과 사용 사례로는,

1. **마크업 언어**:
   XML은 다른 데이터를 표현하는 데 사용되는 마크업 언어이다. 
     태그를 사용하여 데이터 요소를 정의하고 감싸며, 
     각 요소는 시작 태그(`<태그이름>`)와 종료 태그(`</태그이름>`)로 둘러싸여 있다.

2. **계층 구조**:
   XML 데이터는 계층 구조를 가진다다.
   각 요소는 다른 요소 내부에 중첩될 수 있으며, 
   이로 인해 데이터의 계층 구조를 잘 표현할 수 있다.

3. **유연성**:
   XML은 사용자가 자신만의 태그와 데이터 구조를 정의할 수 있는 확장 가능한 언어이다. 
   이는 다양한 도메인과 응용 분야에 맞게 데이터를 정의할 수 있는 장점을 갖고 있다.

4. **플랫폼 독립성**:
   XML은 플랫폼 독립적이며, 
   서로 다른 시스템 및 프로그래밍 언어 간에 데이터 교환을 쉽게 할 수 있도록 해준다.

5. **문서 기반 데이터 저장**:
   XML은 주로 구조화된 데이터를 저장하고 전송하기 위해 사용된다. 
   예를 들어, 구성 파일, 웹 서비스 응답, 설정 데이터, 인터넷에서 데이터 교환 등에 활발하게 사용된다.

6. **웹 서비스와 데이터 교환**:
   XML은 웹 서비스의 표준 데이터 형식 중 하나로 사용되며, 
   데이터를 클라이언트 및 서버 간에 교환할 때 주로 XML을 사용한다.

7. **DTD 및 스키마**:
   XML 문서의 구조를 정의하기 위해 Document Type Definition(DTD) 또는 XML 스키마를 사용할 수 있다. 
   이러한 정의는 XML 문서의 유효성을 검사하고 데이터의 일관성을 보장하는 데 도움이 된다.

8. **Well-Formed vs. Valid XML**:
   Well-Formed XML 문서는 XML의 기본 규칙을 준수하는 문서를 말하며, 
   Valid XML 문서는 DTD 또는 XML 스키마와 같은 정의를 따르는 문서를 말한다.

Posted by TwoTen
l

f = open(“test.txt”, ‘w’)
for j in range(0, 11): # 0 부터 시작해서 11개니까 0~10이다
   for i in range(0, 6): # 0 부터 시작해서 6개니까 0~5이다
    pixelx[j][i] = cX * i + j
      data1 = str(pixelx[j][i]) + '\t' 
      file1.write(data1)
   data1 = '\n'
   file1.write(data1)
file1.close()
file11 = open("./output/STDx.txt", 'r')
read = file11.read()
print(read)
======
결과
0       1       2       3       4       5
1       2       3       4       5       6
2       3       4       5       6       7
3       4       5       6       7       8
4       5       6       7       8       9
5       6       7       8       9       10
6       7       8       9       10      11
7       8       9       10      11      12
8       9       10      11      12      13
9       10      11      12      13      14
10      11      12      13      14      15

 

 

Posted by TwoTen
l

import numpy as np

import json

#다음과 같이 2차배열에 각각의 값을 저장한 후에

pixelx = [[0 for col in range(6)] for row in range(11)]

cX = 1

for j in range(0, 11): # 0 부터 시작해서 11개니까 0~10이다

     for i in range(0, 6): # 0 부터 시작해서 6개니까 0~5이다

          pixelx[j][i] = cX * i + j

with open('./array2.json', "w") as file:

     json.dump(pixelx, file)

file.close()

with open('./array2.json', "r") as file:

     data = json.load(file)

file.close()

print(pixelx)

print(data)

print("data[0][0] = ", data[0][0])

print("data[0][1] = ", data[0][1])

print("data[3][3] = ", data[3][3])

==================================

실행결과

[[0, 1, 2, 3, 4, 5], [1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9], [5, 6, 7, 8, 9, 10], [6, 7, 8, 9, 10, 11], [7, 8, 9, 10, 11, 12], [8, 9, 10, 11, 12, 13], [9, 10, 11, 12, 13, 14], [10, 11, 12, 13, 14, 15]]

[[0, 1, 2, 3, 4, 5], [1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9], [5, 6, 7, 8, 9, 10], [6, 7, 8, 9, 10, 11], [7, 8, 9, 10, 11, 12], [8, 9, 10, 11, 12, 13], [9, 10, 11, 12, 13, 14], [10, 11, 12, 13, 14, 15]]

data[0][0] = 0

data[0][1] = 1

data[3][3] = 6

=================================================

array2.json파일 저장내용

[[0, 1, 2, 3, 4, 5], [1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9], [5, 6, 7, 8, 9, 10], [6, 7, 8, 9, 10, 11], [7, 8, 9, 10, 11, 12], [8, 9, 10, 11, 12, 13], [9, 10, 11, 12, 13, 14], [10, 11, 12, 13, 14, 15]]

Posted by TwoTen
l

파이썬에서 객체를 바이트 변환하고 다시객체로 복원하는 것을 직렬화(Serialization), 이렇게 파이썬 객체를 일련의 바이트들로 변환하는 것을 직렬화(Serialization)라 하고, 다시 바이트들을 객체로 변환하는 것을 역직렬화(Deserialization)이라 한다.

파이썬에서 이와 같은 직렬화, 반직렬화는 pickle, cPickle을 사용할 수 있다.

Posted by TwoTen
l

gray=cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU )[1] 

이진화 처리는 간단하지만, 쉽지 않은 문제를 가지고 있다. 
이진화란 영상을 흑/백으로 분류하여 처리하는 것을 말합니다. 
이때 기준이 되는 임계값을 어떻게 결정할 것인지가 중요한 문제가 됩니다. 
임계값보다 크면 백, 작으면 흑이 됩니다. 
기본 임계처리는 사용자가 고정된 임계값을 결정하고 그 결과를 보여주는 단순한 형태입니다.

이때 사용하는 함수가 cv2.threshold() 입니다.

cv2.threshold(src, thresh, maxval, type) → retval, dst
Parameters:
src – input image로 single-channel 이미지.(grayscale 이미지)
thresh – 임계값
maxval – 임계값을 넘었을 때 적용할 value
type – thresholding type
thresholding type은 아래와 같습니다.
cv2.THRESH_BINARY
cv2.THRESH_BINARY_INV
cv2.THRESH_TRUNC
cv2.THRESH_TOZERO
cv2.THRESH_TOZERO_INV
아래 예제는 각 type별 thresholding 결과입니다.

 

Sample Code

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('gradient.jpg',0)

ret, thresh1 = cv2.threshold(img,127,255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img,127,255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img,127,255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img,127,255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img,127,255, cv2.THRESH_TOZERO_INV)

titles =['Original','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [img,thresh1,thresh2,thresh3,thresh4,thresh5]

for i in xrange(6):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])

plt.show()

여러 이미지를 하나의 화면에 보여줄때 plt.subplot() 함수를 사용합니다. 사용법은 위 소스나 Matplotlib Document를 참고하시기 바랍니다.

https://opencv-python.readthedocs.io/en/latest/doc/09.imageThresholding/imageThresholding.html

 

Posted by TwoTen
l

색상 공간 변환(Convert Color)은 본래의 색상 공간에서 다른 색상 공간으로 변환할 때 사용한다.
색상 공간 변환 함수는 데이터 타입을 같게 유지하고 채널을 변환한다.
입력된 이미지는 8 비트, 16 비트, 32 비트의 정밀도를 갖는 배열을 사용할 수 있다.
출력된 이미지는 입력된 이미지의 이미지 크기와 정밀도가 동일한 배열이 된다.
채널의 수가 감소하게 되어 이미지 내부의 데이터는 설정한 색상 공간과 일치하는 값으로 변환되며, 데이터 값이 변경되거나 채널 순서가 변경될 수 있다.

색상 공간 변환(Convert Color)은 본래의 색상 공간에서 다른 색상 공간으로 변환할 때 사용합니다.
색상 공간 변환 함수는 데이터 타입을 같게 유지하고 채널을 변환합니다.
입력된 이미지는 8 비트, 16 비트, 32 비트의 정밀도를 갖는 배열을 사용할 수 있습니다.
출력된 이미지는 입력된 이미지의 이미지 크기와 정밀도가 동일한 배열이 됩니다.
채널의 수가 감소하게 되어 이미지 내부의 데이터는 설정한 색상 공간과 일치하는 값으로 변환되며, 데이터 값이 변경되거나 채널 순서가 변경될 수 있습니다.

메인코드
import cv2

src = cv2.imread("Image/crow.jpg", cv2.IMREAD_COLOR)
dst = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

cv2.imshow("src", src)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()

세부코드
dst = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)


색상 공간 변환 함수(cv2.cvtcolor)로 이미지의 색상 공간을 변경할 수 있습니다.
dst = cv2.cvtcolor(src, code, dstCn)는 입력 이미지(src), 색상 변환 코드(code), 출력 채널(dstCn)으로 출력 이미지(dst)을 생성합니다.
색상 변환 코드는 원본 이미지 색상 공간2결과 이미지 색상 공간을 의미합니다.
원본 이미지 색상 공간은 원본 이미지와 일치해야합니다.
출력 채널은 출력 이미지에 필요한 채널의 수를 설정합니다.
Tip : BGR은 RGB 색상 채널을 의미합니다. (Byte 역순)
Tip : 출력 채널은 기본값을 사용하여 자동으로 채널의 수를 결정하게 합니다.


추가 정보Permalink
채널 범위Permalink
형식 범위
CV_8U 0 ~ 255
CV_16U 0 ~ 65535
CV_32F 0 ~ 1


색상 공간 코드Permalink
속성 의미 비고
BGR Blue, Green, Red 채널 -
BGRA Blue, Green, Red, Alpha 채널 -
RGB Red, Green, Blue 채널 -
RGBA Red, Green, Blue, Alpha 채널 -
GRAY 단일 채널 그레이스케일
BGR565 Blue, Green, Red 채널 16 비트 이미지
XYZ X, Y, Z 채널 CIE 1931 색 공간
YCrCb Y, Cr, Cb 채널 YCC (크로마)
HSV Hue, Saturation, Value 채널 색상, 채도, 명도
Lab L, a, b 채널 반사율, 색도1, 색도2
Luv L, u, v 채널 CIE Luv
HLS Hue, Lightness, Saturation 채널 색상, 밝기, 채도
YUV Y, U, V 채널 밝기, 색상1, 색상2
BG, GB, RG 디모자이킹 단일 색상 공간으로 변경
_EA 디모자이킹 가장자리 인식
_VNG 디모자이킹 그라데이션 사용


원본 이미지 색상 공간2결과 이미지 색상 공간에 색상 공간 코드를 조합하여 사용할 수 있습니다.

예) BGR2GRAY는 Blue, Green, Red 채널 이미지를 단일 채널, 그레이스케일 이미지로 변경합니다.

 

https://076923.github.io/posts/Python-opencv-10/#%EC%84%B8%EB%B6%80-%EC%BD%94%EB%93%9C

Posted by TwoTen
l

오래 전, 

Bluetooth module를 구입해서 아두리노에 연결해서 작동해본 적은 있는데,

하다보니 원격 조정을 위해서는 WiFi가 필요할 것 같아서 공부할 겸 싼 것으로 구입했다.

아두리노와 관련이 있는 WiFi모듈같다는 생각에 게다가 아주 싼 편이였다. $2~3정도?

ESP8266 를 구입했는데, 아래와 같이 두개의 부품이 배달되었다.

인터넷에 찾아보니, 핀으로 연결하기 위해 두개를 서로 겹쳐서 납땜하는 것이란다.

그래서 두개를 겹쳐서 납땜했다.

 

ESP8266-12E pin layout

여기 저기 찾아 보니, Firmware을 upload해야 한다고 한다.
이렇게 된 제품의 이름이 ESP-12E라는 것도 이때 알았다.
업로드를 할려면 FTDI USB To TTL 있으면 더 편리하다고 해서 이것도 구입했다.

Firmware을 upload하는 방법은,
http://blog.daum.net/rockjjy99/2584

https://blog.naver.com/PostView.nhn?blogId=eduino&logNo=221152914869

에 잘 나와 있다.
Firmware을 업로드한 후 "Blink" Test를 위해서 아두이노 우노에 연결을 할 때는 아래 내용을 참조했다.

https://blog.naver.com/PostView.nhn?blogId=eduino&logNo=221152914869

여기서는 ESP8266에는 3.3V의 전원이 반드시 연결되어야 하고, 아두리노 우노의 Rx,Tx는 5V로 동작하므로 따로 3.3V를 만들어서 출력 전압을 3.3V로 만들어주어서 했다. 정확한 이해없이 어찌어찌 연결해서 test를 했는데 반응이 없다. 무엇이 잘못 된 것인지도 잘 모르겠고, 다시 firmware upload부터 다시 시작을 했다. 이렇게 여러번을 하고도 잘 되지 않아서 다시 ESP8266 NodeMCU랑 ESP32를 같이 구입했다.

ESP-8266 NodeMCU pin layout


여기 저기 관련 내용들을 찾아서 읽어보니, 이 모듈들은 Firmware를 upload한 전원을 연결하면 모두 WiFi에 자동으로 뜬다는 것이였다. 그래서 배달이 되자 마다 upload없이 그냥 전원을 연결해보았다.
연결하니 그냥 모두 WiFi에 각각의 모듈들이 모두 뜬다.
그러면 Firmware가 모두 upload 되었다는 뜻인데...
그래도 모르니 한번 다시 upload해보자 하고 맘 먹고 해보았다.
아래 웹사이트를 따라 해보았다.
http://blog.naver.com/cicron/220882372924
한번의 실수는 있었지만, 큰 문제없이 잘 되었고, 전원을 연결하니 WiFi에 다시 나타나는 것을 확인했다.
그다음은 Arduino IDE(Integrated Development Environment)를 이용해서 만든 프로그램은 sketch라고 한다.
ESP8266 NodeMCU를 아두이노 IDE에서 사용하기 위한 환경 설정하는 것은 여러군데 많이 나와 있다.
그 중에서 아래를 이용했다.
https://makernambo.com/49

다른점은 환경설정에서
http://makeshare.org/bbs/board.php?bo_table=arduinocom&wr_id=417

을 따라서
문장 끝에 콤마를 이용해서 다음과 세가지를 모두 넣었다.
https://dl.espressif.com/dl/package_esp32_index.json,

http://arduino.esp8266.com/stable/package_esp8266com_index.json,

http://downloads.arduino.cc/packages/package_arduino.cc_linux_index.json

그리고 IDE 예제에 있는 "Blink" 를 실행했다.

#define LED_BUILTIN 16  // GPIO 16 은 내장되어 있는 중간 쯤에 있는 LED이다.
void setup() {  // initialize digital pin 13 as an output.
  pinMode(LED_BUIDIN, OUTPUT);
} // the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUIDIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);              // wait for a second
  digitalWrite(LED_BUIDIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a second
}

error없이 잘 되었다.

다음은 WiFI를 이용하는 것을 해보자.

 

 

 

Posted by TwoTen
l

YL-38
센서
연결 방법

 

필요부품
Pin 정보

Program Code

/*

All the resources for this project: https://randomnerdtutorials.com/

*/

int rainPin = A0;

int greenLED = 6;

int redLED = 7;

// you can adjust the threshold value

int thresholdValue = 800;

void setup(){

pinMode(rainPin, INPUT);

pinMode(greenLED, OUTPUT);

pinMode(redLED, OUTPUT);

digitalWrite(greenLED, LOW);

digitalWrite(redLED, LOW);

Serial.begin(9600);

}

void loop()

{

// read the input on analog pin 0:

int sensorValue = analogRead(rainPin);

Serial.print(sensorValue);

if(sensorValue < thresholdValue){

Serial.println(" - Doesn't need watering");

digitalWrite(redLED, LOW);

digitalWrite(greenLED, HIGH);

}

else{

Serial.println(" - Time to water your plant");

digitalWrite(redLED, HIGH);

digitalWrite(greenLED, LOW);

}

delay(500);

}

Posted by TwoTen
l