반응형

설치환경 : 리눅스 centos7버전 때

 

기본 환경설정(git)

추후 superset git repository clone을 위해 필요

sudo yum install git

docker 설치 centos7

참고문서 : https://linuxize.com/post/how-to-install-and-use-docker-on-centos-7/

1. Start by updating your system packages and install the required dependencies:

sudo yum update
sudo yum install yum-utils device-mapper-persistent-data lvm2


2. Next, run the following command which will add the Docker stable repository to your system:

sudo yum-config-manager --add-repohttps://download.docker.com/linux/centos/docker-ce.repo


3. Now that the Docker repository is enabled, install the latest version of Docker CE (Community Edition) using yum by typing:

sudo yum install docker-ce


4. Once the Docker package is installed, start the Docker daemon and enable it to automatically start at boot time:

sudo systemctl start docker sudo systemctl enable docker

5. To verify that the Docker service is running type:

sudo systemctl status docker

 

Executing the Docker Command Without Sudo #

By default managing, Docker requires administrator privileges. If you want to run Docker commands as a non-root user without prepending sudo you need to add your user to the docker group which is created during the installation of the Docker CE package. You can do that by typing:

 

sudo usermod -aG docker ${USER}

$USER is an environment variable that holds your username.

 

Docker Compose 설명 및 설치


1. docker-compose download

sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose


2. APPLY EXECUTABLE PERMISSION TO THE BINARY
sudo chmod +x /usr/local/bin/docker-compose

 

3. alias setting

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

docker, docker-compose 설치 이후 compose실행시 에러가 난다면 해당 세션창을 나갔다가 다시 접속해야한다.

superset source code clone & install

1. clone superset source codegit clone https://github.com/apache/incubator-superset/

 

2. dockerfile 수정

# First, we just wanna install requirements, which will allow us to utilize the cache

# in order to only build if and only if requirements change

COPY ./requirements.txt /app/ RUN cd /app \         && pip install --no-cache -r requirements.txt

해당 부분에 pip로 사용할 라이브러리들 추가

COPY ./requirements.txt /app/

RUN cd /app \        

      pip install --upgrade pip \        

      && pip install --no-cache -r requirements.txt \        

      && pip install mysqlclient \        

      && pip install impyla \        

      && pip install redis==3.2.1 \        

      && pip install gevent==1.2.2 \        

      && rm -rf /root/.cache/pip

 

 

3. docker-compose.yml 파일 수정

version: "3.7" => version: "3.4"
  superset:
    ports:
      - 8088:8088  => -8089:8088     (8088포트로 띄울 경우 정상적으로 동작안함)

4. docker-compose up

docker-compose up 명령어로 dockerfile의 이미지를 읽어가며 설치

docker-compose up

기존 리서치 superset에서 발생했던 이슈

1. 다운로드한 CSV가 엑셀로 열 경우 한글이 깨지는 문제 수정

2. sql tab이 한글명일 경우 정상적으로 csv다운로드 안되는 이슈 처리

vi /home1/irteam/incubator-superset/superset/views/core.py

 

docker기반 superset 설치시 발생했던 이슈 정리

1.설치는 되었는데 default id/pw가 생성이 안되어 있을 경우 =>  docker-init을 통하여 계정 설정


docker-init

## Initializing Database To initialize the database with a user and example charts, dashboards and datasets run:

```bash

docker-compose run -e SUPERSET_LOAD_EXAMPLES=yes --rm superset ./docker-init.sh

 

2. docker-compose.yml 내부의 버전과 docker-compose 버전이 맞지 않는 경우

[incubator-superset]$ docker-compose up



ERROR: In file './docker-compose.yml' service 'version' doesn't have any configuration options. All top level keys in your docker-compose.yml must map to a dictionary of configuration options.

해결책 docker-compose version 3.7 -> 2버전대로 낮추거나 docker-compose 버전을 높여주어야 한다.
참고 : https://github.com/docker/compose/issues/3331

 

3. 알파환경에서는 문제가 없었는데 리얼환경에서 클러스터 OS Partition 차이로 인한 이슈

-> docker-compose up 명령어 실행시 발생

ERROR: Service 'superset' failed to build: OCI runtime create failed: /var/lib/docker/overlay2/17f563586397ce35fab5733d85b37fc68073a42eb4a5044025e68fd89e87b573/merged is not an absolute path or is a symlink

해결책

# 실행되고 있는 docker stop
$ sudo systemctl stop docker

# 잘죽었는지 확인
$ sudo systemctl status docker

# 원하는 디렉터리 이동을 위한 디렉터리 생성
$ sudo mkdir /mnt/extra

# 기존 문제 발생했던 디렉터리의 내용들을 새로 만든 디렉터리로 이동
$ sudo mv /var/lib/docker /mnt/extra

# 링크생성
$ sudo ln -s /mnt/extra/docker /var/lib/docker

# docker 시작
$ sudo systemctl start docker

# docker 잘올라왔는지 상태 확인
$ sudo systemctl status docker

# 재설치 (iteam) $ docker-compose up

 

반응형
반응형

토이프로젝트를 하던 중 쿠키에 특정 값을 만들어 굽는 작업이 필요했다.

따라서 HttpServletResponse에 addCookie를 하여 쿠키를 구워줬지만 브라우저 개발자도구에서 눈을 씻고 찾아봐도 보이지가 않았다...

 

문제는 Cookie의 path를 설정해주지 않아서였다...

 

쿠키의 path를 설정해주지 않으면 현재 경로에서만 only valid하도록 처리되기 때문에

리다이렉트 되면서 유효하지 않기에 사라져 버리는 것이다.

 

[ 문제코드 ]

쿠키에 setPath를 지정해주지 않음...

 

[ 문제 해결 ] 

setPath를 루트로 지정

 

ref : https://stackoverflow.com/questions/35828087/setting-cookie-not-working-in-spring-web-mvc-4

반응형
반응형

Spring boot에서 JPA를 이용해 Update query 개발시 다음과 같은 에러가 나는 경우가 발생

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [update bng.moobe.entity.User u set u.nickname = :__$synthetic$__1 where u.email = :__$synthetic$__2]; nested exception is java.lang.IllegalStateException: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [update bng.moobe.entity.User u set u.nickname = :__$synthetic$__1 where u.email = :__$synthetic$__2]
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:370) ~[spring-orm-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255) ~[spring-orm-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527) ~[spring-orm-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) ~[spring-tx-5.1.9.RELEASE.jar:5.1.9.RELEASE]

 

JPA @Query를 사용해 update시에는 @Modifying annotation을 추가해주어야 한다.

하지만 이것으로 끝이 아니다...다시 실행해보면 이번엔 다음과 같은 에러 메세지가 발생한다.

org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query

이 문제를 해결하기 위해서는 @Transactional 애노테이션도 함께 추가해주어야 한다.

@Transactional 애노테이션 추가

 

ref : https://stackoverflow.com/questions/10220262/updating-boolean-value-in-spring-data-jpa-using-query-with-hibernate

반응형
반응형

스프링이나 자바프로젝트에서 jdbc tempate으로 hive명령어 날릴 때 쿼리문에 ';'(세미콜론)을 붙혀 statement를 execute하지 않도록 하자. 세미콜론이 쿼리에 들어 있으면 다음과 같은 에러를 뱉을 것이다.

Caused by: org.apache.hive.service.cli.HiveSQLException: Error while compiling statement: FAILED: ParseException line 1:519 cannot recogni input near ';' '<EOF>' '<EOF>' in expression specification

        at org.apache.hive.service.cli.operation.Operation.toSQLException(Operation.java:326)

        at org.apache.hive.service.cli.operation.SQLOperation.prepare(SQLOperation.java:102)

        at org.apache.hive.service.cli.operation.SQLOperation.runInternal(SQLOperation.java:171)

        at org.apache.hive.service.cli.operation.Operation.run(Operation.java:268)

        at org.apache.hive.service.cli.session.HiveSessionImpl.executeStatementInternal(HiveSe

이유는 스택오버플로우의 답변으로 대신한다.


Using ; in a query for most databases doesn't work as it is usually not part of the statement syntax itself, but a terminator for command line or script input to separate statements. The command line or script processor sees a semi-colon as the signal that the statement is complete and can be sent to the server.
Also in JDBC a single statement prepare (or execute) should only be one actual statement so multiple statements are not allowed and so there is also no need to have a semi-colon, and as for some (most?) databases the semi-colon isn't part of the statement syntax, it is simply a syntax error to have one included.
If you want to execute multiple statements, you need to use separate executes. Technically, MySQL does have an option to support multiple executions which can be enabled by a connection property. This behavior is not compliant with the JDBC specification/API and makes your code less portable. See allowMultiQueries on Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J

--------

Having semicolons in JDBC statements is very error prone in general. Some JDBC drivers do not support this (e.g. IBM's JDBC driver for DB2 10.x throws an exception if you close your SQL statement with ";").

 

참고 : https://stackoverflow.com/questions/18515471/can-i-execute-multiple-queries-separated-by-semicolon-with-mysql-connector-j

반응형
반응형

hadoop streaming, spark batch작업을 하다보면 보통 쉘스크립트로 해당 배치를 동작시키는 경우가 많다.

 

이 때 원하는 데이터가 없어 배치 작업이 정상적으로 동작하지 않는 경우가 있다.

 

보통은 해당 파일이 없으면 안돌아야하는게 맞지만 하루 하루 누적으로 쌓이는 데이터(어제, 그제 데이터와 별차이없는)가 없는 것 때문에 

 

중요한 배치작업이 돌지 않아 문제가 발생할 수 있다.

 

그렇기 때문에 쉘스크립트로 원하는 데이터가 있는 디렉터리의 최신 파일을 가져오는 스크립트를 작성해보았다.

 

 

get_recent_file 메서드에 최신 데이터를 가져오고 싶은 direct의 path를 전달해주면 된다.
해당 method에 direcotry parameter를 넘겨주고 최신 파일 경로를 받아 recent_file_path에 저장한다.

 

옵션에 대한 설명이다. 

hdfs dfs -ls -R ${DIR} : gives all dirs recursively
grep "^d" : gives only directories
sort -k6,7 : sorts them by modification time
tail -3 : gives listing for last 3 modified directory
tr -s ' ' : some formatting
cut -d' ' -f8 : gives only directory path
sort -r : result reverse sotring

 

쉘스크립트를 잘쓰면 프로그래밍삶이 좀 더 윤택해질 것 같다.

 

틈틈히 보고 유용한 스크립트를 작성해서 나만의 유틸 스크립트들을 만들어 나가면 좋을 것 같다.

반응형
반응형

쉘스크립트 작업을 하다가 정말 별거 없는 스크립트인데 실행시켜보면 command not found가 뜬다.

그것도 변수명인데 해당 변수명의 command를 찾지 못하겠다니???

 

RECENTFILE : command not found

#!/bin/sh

RECENTFILE =`hadoop fs -ls -R /user/irteam/dmp/demo/data/ | grep "^d" | sort -k6,7 | tail -1 | tr -s ' ' | cut -d' ' -f8`

echo "${RECENTFILE}"

잉??? RECENTFILE은 변순인데...왜 커맨드로 인식해???

 

문제는 RECENTFILE뒤에 공백....(공백을 제거해준다.)

RECENTFILE=`hadoop fs -ls -R /user/irteam/dmp/demo/data/ | grep "^d" | sort -k6,7 | tail -1 | tr -s ' ' | cut -d' ' -f8`

 

만약 처음 처럼 공백을 넣게 되면 bash는 RECENTFILE이라는 명령을 뒤에 있는 문자열을 매개변수로 실행하려 한다.

ex) RECENTFILE = 'foo' (RECENTFILE 옆에 한번 띄고 = 옆에 한 번 띄게 되면 RECENTFILE이라는 커맨드를 '=', 'foo' 두 개 인자와 함께 실행하려 할 것이다.)

 

따라서 변수선언시에는 뒤에 공백을 주어 bash에서 command로 인식하지 않도록 하자.

반응형
반응형

@Controller에서 요청을 받아 특정 url로 redirect시켜주는 컨트롤러가 있는데

정상적으로 요청이 전달이 되지 않는 것 같아 로그를 확인해 보니 다음과 같은 에러메세지가 떨어지고 있었다.

java.lang.IllegalArgumentException: Model has no value for key 'e_e_ttt'
at org.springframework.web.servlet.view.RedirectView.replaceUriTemplateVariables(RedirectView.java:387)
at org.springframework.web.servlet.view.RedirectView.createTargetUrl(RedirectView.java:346)
at org.springframework.web.servlet.view.RedirectView.renderMergedOutputModel(RedirectView.java:307)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1370)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1116)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:94

 

문제는 리다이렉트 하려는 url에 e_e_ttt라는 문자열을 '{', '}'가 감싸고 있었던 것이다. 

ex) www.hello.com?name=blog&param={e_e_ttt} 

 

왜 문제가 되느냐???

URL내에서 몇 몇 문자는 특별한 의미로 예약되어 있거나, 어떤 문자는 US-ASCII의 출력 가능한 문자 집합에 포함되어 있지 않고 어떤 문자는 몇몇 인터넷 게이트웨이와 프로토콜에서 혼동되는 것으로 알려져 있어, 사용하면 안되는 것들이 있다.

 

URL에서 사용하면 안되는 문자들

% : 인코딩된 문자에 사용할 이스케이프 토큰으로 선점

/  : 경로 컴포넌트에서 선점

. : 경로 컴포넌트에서 선점

.. : 경로 컴포넌트에서 선점

# : 프래그먼트의 구획 문자로 선점

? : 질의 문자열의 구획 문자로 선점

; : 파라미터의 구획 문자로 선점

: : 스킴, 사용자 이름/비밀번호, 호스트/포트의 구획 문자로 선점

$, + : 선점

@ & = : 특정 스킴에서 특별한 의미가 있기 때문에 선점

{}|\~[]` : 게이트웨이와 같은 여러 전송 에이전트에서 불안전하게 다루기 때문에 제한됨

<> " : 안전하지 않음. 반드시 인코딩되어야함

 

근데 이번에 문제가 된 경우에는 {} 문자열이 있었기 때문이다.

 

항상 안전하지 않은 문자들에 대해서는 인코딩을 하도록 하자!!!!

 

반응형
반응형

서버간 통신시 acl체크가 필요한 경우가 많이 있다.

항상 telnet 응답값을 보고 이게 정상적으로 된게 맞는지 헷갈리는 경우가 있어 추후 기억을 위해 포스팅

 

출발서버 -> 목적지 서버 확인

telnet ip port

출발서버에서 telnet 목적지서버IP 확인하고싶은 port로 명령을 내린다.

ex) 10.65.777.23 서버에서 10.62.332.555 80port 요청의 acl 을 확인

10.65.777.23 서버에서 telnet 10.62.332.555 80 로 요청

 

반응 message에 따라 유형이 다르다.

1. Trying 10.62.332.555... 

위와 같은 반응일 경우 방화벽 오픈이 안된 것이다.

 

2. Trying 10.62.332.555...
telnet: connect to address 10.161.241.152: Connection refused
telnet: Unable to connect to remote host: Connection refused

바로 연결거부가 발생하면 방화벽 오픈은 되었으나 해당 서버에 해당 포트로 프로세스가 안 떠있는 것이다.

 

Trying 172.0.0.1...
Connected to 172.0.0.1
Escape character is '^]'.

방화벽 오픈이 정상적으로 되었고 프로세스가 올라가 있는 것이다.

=> 정상적으로 통신을 할 수 있는 상태이다.

반응형
반응형

JPA Entity에서 복합키(composite key)를 사용할 떄 복합키에 해당하는 컬럼 모두에 @Id

을 달아주어야 한다.

 

그 뿐만 아니라 class에도 @IdClass(클래스명.class)를 달아주어야 한다.

이렇게만 선언해주고 실행을 하게 되면 다음과 같은 에러를 만나게 된다.

Caused by: org.hibernate.MappingException: Composite-id class must implement Serializable:

해당 클래스에 Serializable을 implements해줍니다.

Serializable을 해주어야하는 이유는 stackoverflow의 설명으로 대신하겠습니다. (저도 JPA를 막 학습하고 사용하고 있는 입장은 아니라서..특정 이슈 때마다 검색으로 적용해 나가고 있긴 한 데 한 번 제대로 된 학습이 필요할 것 같긴합니다.)

The session object needs to be serializable hence all objects referenced by it must be serializable as well. The id is used as a key to index loaded objects in the session. In case of CompositeId s the class itself is used as the id.

ref : https://stackoverflow.com/questions/9271835/why-composite-id-class-must-implement-serializable

반응형

+ Recent posts