반응형


출처

https://stackoverflow.com/questions/44450889/why-does-spark-shell-fail-to-load-a-file-with-class-with-rdd-imported/44451056


왜 spark-shell은 RDD를 import한 class를 가진 파일을 불러오기를 실패할까요?

저는 Scala 2.11.8로 Spark 2.1.1을 사용합니다.

spark-shell에서 저는 RDD를 메소드로 가지는 클래스를 불러오기 위해 :load명령을 사용합니다.

그 클래스를 불러올 때 컴파일 오류가 나옵니다.

error: not found: type RDD

왜일까요? import 구문이 있습니다.

image

다음은 제가 작업한 코드입니다.

image1


답변

spark-shell에서 :load의 특징인듯 합니다. 해결책은 당신의 클래스 정의하는 부분으로 import org.apache.spark.rdd.RDD(.이나 _ 없이)를 이동하는 것입니다.

이는 RDD클래스에만 국한 된 것이 아니고 모든 클래스에 해당합니다. import문이 클래스 자체 내에 정의되어 있지 않으면 작동하지 않습니다.

말했듯이, 다음은 클래스 밖에 import하고 있기 때문에 작동하지 않을 것입니다.

import org.apache.spark.rdd.RDD
class Hello {
  def get(rdd: RDD[String]): RDD[String] = rdd
}

scala> :load hello.scala
Loading hello.scala...
import org.apache.spark.rdd.RDD
<console>:12: error: not found: type RDD
         def get(rdd: RDD[String]): RDD[String] = rdd
                                    ^
<console>:12: error: not found: type RDD
         def get(rdd: RDD[String]): RDD[String] = rdd

:load의 -v플래그를 사용하여 무슨 일이 발생하는 지 볼 수 있습니다.

scala> :load -v hello.scala
Loading hello.scala...

scala>

scala> import org.apache.spark.rdd.RDD
import org.apache.spark.rdd.RDD

scala> class Hello {
     |   def get(rdd: RDD[String]): RDD[String] = rdd
     | }
<console>:12: error: not found: type RDD
         def get(rdd: RDD[String]): RDD[String] = rdd
                                    ^
<console>:12: error: not found: type RDD
         def get(rdd: RDD[String]): RDD[String] = rdd
                      ^

이는 클래스 정의 안에서 import를 하는 것이 도움이 될 것이라고 생각하게 되었습니다. 그리고 (저는 크게 놀라며) 실제로 그랬습니다!

class Hello {
  import org.apache.spark.rdd.RDD
  def get(rdd: RDD[String]): RDD[String] = rdd
}

scala> :load -v hello.scala
Loading hello.scala...

scala> class Hello {
     |   import org.apache.spark.rdd.RDD
     |   def get(rdd: RDD[String]): RDD[String] = rdd
     | }
defined class Hello

또한 :paste명령을 사용하여 클래스를 spark-shell에 붙여 넣을 수 있습니다. 고유한 패키지에 클래스를 정의할 수 있는 raw 모드가 있습니다.

package mypackage

class Hello {
  import org.apache.spark.rdd.RDD
  def get(rdd: RDD[String]): RDD[String] = rdd
}

scala> :load -v hello.scala
Loading hello.scala...

scala> package mypackage
<console>:1: error: illegal start of definition
package mypackage
^

scala>

scala> class Hello {
     |   import org.apache.spark.rdd.RDD
     |   def get(rdd: RDD[String]): RDD[String] = rdd
     | }
defined class Hello

scala> :paste -raw
// Entering paste mode (ctrl-D to finish)

package mypackage

class Hello {
  import org.apache.spark.rdd.RDD
  def get(rdd: RDD[String]): RDD[String] = rdd
}

// Exiting paste mode, now interpreting.
// 붙여넣기 모드를 종료하고 인터프리터 모드입니다.


반응형
반응형


출처

https://stackoverflow.com/questions/2013091/coloured-git-diff-to-html


Git diff를 HTML에 색칠하여 표시하기

저는 파일에서 변경된 단어를 분명히 보기 위해 git diff --color-words를 사용하는 것을 즐깁니다.

Screenshot

하지만 git이나 색칠한 터미널 없이 다른 누군가와 diff를 공유하고 싶습니다. HTML로 색칠된 터미널 출력으로 변환할 수 있는 도구나 방법을 아시는 분이 있으신가요?

7개 답변 중 1개의 답변만 발췌

wget "http://www.pixelbeat.org/scripts/ansi2html.sh" -O /tmp/ansi2html.sh
chmod +x /tmp/ansi2html.sh
git diff --color-words --no-index orig.txt edited.txt | \
/tmp/ansi2html.sh > 2beshared.html

제가 필요했던 것은 ANSI를 HTML로 변환하는 것(converter)이었습니다. 그리고 저는 매우 어지간한 것을 http://www.pixelbeat.org/에서 발견하였습니다.

참고 : --color 또는 --color-words를 포함시키지 않으면 색상이 표시되지 않을 수 있습니다. 이는 아마도 파이핑(|)으로 인해 git diff가 색상을 제외시키기 때문일 수 있습니다.

참고 2 : 특히 Mac을 사용하는 경우 gnu sed 및 awk를 설치해야 할 수 있습니다. brew install gnu-sed gawk로 설치 하십시오. 경로에 수동으로 추가해야 할 수도 있습니다. 예 : ln -s /usr/local/Cellar/gnu-sed/4.2.2/bin/gsed /usr/local/bin/을 사용하십시오.

반응형
반응형

출처

https://medium.com/back-to-basics-project/how-to-install-pip-on-centos-6-8-b7453fef63e3


CentOS 6.8에서 pip 설치하는 방법

이는 "... 하는 방법" 이야기의 부분입니다.

안녕하세요. 저는 Python으로 프로그래밍을 시작하기 위해 Python을 몇일간 배웠고 먼저 pip를 설치하는 방법을 배워야 했습니다. 

저는 CentOS 6.8에서 .env를 사용하는 이유는 OS 버전이 이렇게 다루기 때문이지만 다른 Linux OS 버전도 같은 방식일 거라 생각합니다.

왜 pip인가?

Pip는 정확히! Python 패키지를 설치하는 프로그램입니다. 

pip를 설치하는 2가지 방법이 있습니다. 첫 번째는 Yum을 사용하는 것, 두 번째는 CURL과 python을 사용하는 것입니다.

방법 1. Yum을 사용

Pip는 EPEL의 부분이기 때문에 우리는 EPEL 저장소를 먼저 설치해야 합니다. 그리고 나서 python-pip를 설치합시다.

# EPEL 저장소를 먼저 설치합니다.
$ sudo yum install epel-release

# python-pip를 설치합니다.
$ sudo yum -y install python-pip


방법 2. CURL과 python을 사용

우리는 pip를 설치하는 방법을 사용할 수 있습니다. curl을 사용하여 먼저 다운로드 받고 python을 사용하여 pip를 설치합니다.

# 파일을 다운로드 합니다.
$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"

# pip를 설치하기 위해 get-pip.py 파이썬 실행 파일을 사용합니다.
$ python get-pip.py


pip 설치 테스트

$ pip — help
$ pip -v

shell 창에서 뭔가를 얻을 수 있어야 합니다.

행복한 코딩 되세요!





반응형
반응형

출처 : https://stackoverflow.com/questions/37201918/spark-job-keep-on-running

Spark 작업을 실행한 채 유지하기

저는 다음 명령을 사용하여 ambari-server에서 저의 Spark 작업을 제출 하였습니다.

./spark-submit --class  customer.core.classname --master yarn --numexecutors 2 --driver-memory 2g --executor-memory 2g --executor-cores 1 /home/hdfs/Test/classname-0.0.1-SNAPSHOT-SNAPSHOT.jar newdata host:6667

이 명령은 잘 작동하였습니다.

하지만, 명령 프롬프트를 닫거나 그 작업을 kill하려고 할 때 그 작업은 실행한 채 유지하여야 합니다.

어떠한 도움이든 감사합니다.


4개 답변 중 1개의 답변

몇 가지 방법으로 이를 이룰 수 있습니다.

1) nohup을 사용하여 백그라운드(background)로 드라이버(driver) 프로세스를 spark-submit으로 실행할 수 있습니다.

nohup  ./spark-submit --class  customer.core.classname \
  --master yarn --numexecutors 2 \
  --driver-memory 2g --executor-memory 2g --executor-cores 1 \
  /home/hdfs/Test/classname-0.0.1-SNAPSHOT-SNAPSHOT.jar \
  newdata host:6667 &

2) 드라이버 프로세스가 다른 노드에서 실행되도록 배포 모드에서 클러스터로 실행하십시오.

반응형
반응형

출처

https://www.metachris.com/2016/04/python-threadpool/

https://github.com/SDRLurker/TIL/blob/master/python/thread_pool.md


Python 쓰레드 풀

쓰레드 풀은 주어진 일을 할 준비가 된 미리 만들어진 한가한 쓰레드 그룹입니다. 이들은 마쳐야 할 긴 작업의 작은 쓰레드 개수보다 짧은 작업의 많은 쓰레드 개수가 있을 때 각 작업에 대한 쓰레드를 인스턴스화 하는 것이 더 선호됩니다.

인터넷에서 문서 1000개를 다운로드하고 싶지만 한 번에 50개를 다운로드 할 수 있는 리소스 만 갖고 있다고 가정합니다. 해결책은 스레드 풀을 사용하여 고정된 수의 스레드를 생성하여 큐에서 모든 URL을 한 번에 50개씩 다운로드합니다.

스레드 풀을 사용하기 위해 Python 3.x에는 ThreadPoolExecutor 클래스가 포함되어 있고 Python 2.x와 3.x에는 multiprocessing.dummy.ThreadPool 이 있습니다. multiprocessing.dummy멀티프로세싱(multiprocessing) API를 복제하지만 threading 모듈 주변의 래퍼(wrapper)일 뿐입니다.

multiprocessing.dummy.ThreadPool 의 단점은 Python 2.x에서 대기열의 모든 작업이 스레드에 의해 완료되기 전에 프로그램을 종료 할 수 없다는 것입니다. 예를 들어 KeyboardInterrupt가 있습니다.

Python 2.x 및 3.x에서 (PDFx에서 사용하기 위해) 인터럽트 가능한 스레드 대기열(큐,queue)을 얻기 위해 stackoverflow.com/a/7257510에서 영감을 얻어 이 코드를 작성했습니다. Python 2.x 및 3.x에서 작동하는 스레드 풀을 구현합니다.

import sys
IS_PY2 = sys.version_info < (3, 0)

if IS_PY2:
    from Queue import Queue
else:
    from queue import Queue

from threading import Thread


class Worker(Thread):
    """ 주어진 작업들에 대한 대기열(큐,queue)로부터 작업을 실행할 쓰레드 """
    def __init__(self, tasks):
        Thread.__init__(self)
        self.tasks = tasks
        self.daemon = True
        self.start()

    def run(self):
        while True:
            func, args, kargs = self.tasks.get()
            try:
                func(*args, **kargs)
            except Exception as e:
                # 이 쓰레드에서 발생된 exception
                print(e)
            finally:
                # exception이 발생하던 안 하던 이 작업의 종료를 마크합니다.
                self.tasks.task_done()


class ThreadPool:
    """ 대기열(큐,queue)로부터 작업을 소비하는 쓰레드 풀 """
    def __init__(self, num_threads):
        self.tasks = Queue(num_threads)
        for _ in range(num_threads):
            Worker(self.tasks)

    def add_task(self, func, *args, **kargs):
        """ 대기열(큐,queue)에 작업을 추가 """
        self.tasks.put((func, args, kargs))

    def map(self, func, args_list):
        """ 대기열(큐,queue)에 작업의 리스트를 추가 """
        for args in args_list:
            self.add_task(func, args)

    def wait_completion(self):
        """ 대기열(큐,queue)에 모든 작업의 완료를 기다림 """
        self.tasks.join()


if __name__ == "__main__":
    from random import randrange
    from time import sleep

    # 쓰레드에서 실행될 함수
    def wait_delay(d):
        print("sleeping for (%d)sec" % d)
        sleep(d)

    # 임의의 지연시간 생성
    delays = [randrange(3, 7) for i in range(50)]

    # 5개의 worker 쓰레드로 쓰레드 풀을 인스턴스화
    pool = ThreadPool(5)

    # 쓰레드 풀로 대량의 작업을 추가. 하나씩 작업을 추가하기 위해 `pool.add_task`
    # 사용 가능. 이 코드는 이 곳에서 막힐(block) 것이지만 
    # 현재 실행하고 있는 worker의 배치작업이 완료되면
    # exception으로 쓰레드 풀을 취소하는 것이 가능하도록 만들 수 있습니다.
    pool.map(wait_delay, delays)
    pool.wait_completion()

큐 크기는 스레드 수와 유사합니다 (self.tasks = Queue(num_threads) 참조). 따라서 pool.map(..)pool.add_task(..)로 작업을 추가하면 Queue의 새 슬롯이 사용가능할 때까지 막힐(block)것 입니다.

Ctrl + C를 눌러 KeyboardInterrupt를 실행하면 현재 Worker 배치가 완료되고 프로그램이 pool.map(..) 단계에서 exception로 종료됩니다.

반응형
반응형

출처 : https://stackoverflow.com/questions/23786674/python-mysqldb-how-to-get-columns-name-without-executing-select-in-a-big-tab

python: MySQLdb. 의 큰 테이블에서 select * 없이 컬럼명을 얻는 방법

저는 테이블에서 컬럼명을 얻고 싶습니다만 100만 개 이상의 데이터가 그 안에 있습니다. 그래서 다음 쿼리를 사용할 수 없습니다.

cursor.execute("SELECT * FROM table_name")
print cursor.description

sqlite3에서 저는 이 방법을 사용하였습니다.

crs.execute("PRAGMA table_info(%s)" %(tablename[0]))
for info in crs:
    print info

이는 python mysqldb에서는 작동하지 않습니다. 방법을 아는 분 계신가요?


5개 답변중 1개의 답변만 추려냄.

당신은 SHOW columns을 사용할 수 있습니다.

cursor.execute("SHOW columns FROM table_name")
print [column[0] for column in cursor.fetchall()]

참고 바람니다. 이는 본질적으로 desc를 사용하는 것과 같습니다.

cursor.execute("desc table_name")
print [column[0] for column in cursor.fetchall()]
반응형
반응형

출처


ctypes로 Python에서 C++ 클래스 호출하기

저는 파이썬에서 C++ 클래스를 호출하고 싶어서 최근에 스스로 방법을 찾았습니다. 저는 (Thrift를 사용하여 전에 했던 것처럼 - Python과 C++을 위한 Apache Thrift 사용하기를 보세요.) 분리된 프로세스를 호출하고 싶지 않았고 C++ 라이브러리를 직접 호출하고 싶었습니다.

저는 진행하기 전에 이를 파이썬으로 하기 위한 다양한 방법이 있다는 것을 말하고 싶습니다. 그리고 저는 작동한 것 중 하나를 선택하였습니다. 다른 기술도 사용 가능하며 어떤 기술이 '최상'인지에 대한 의견은 상당히 분분해 보입니다.

C++ 클래스로 시작하기 위해 평범하게 작성하였습니다.

#include <iostream>

// A simple class with a constuctor and some methods...

class Foo
{
    public:
        Foo(int);
        void bar();
        int foobar(int);
    private:
        int val;
};

Foo::Foo(int n)
{
    val = n;
}

void Foo::bar()
{
    std::cout << "Value is " << val << std::endl;
}

int Foo::foobar(int n)
{
    return val + n;
}

다음 ctypes 시스템은 C++을 사용할 수 없기 때문에 C++ 코드 주변에 C wrapper를 놓을 것입니다. 이를 하기 위해 파일 제일 밑에 다음 부분에 코드를 추가합니다.

// ctypes는 C와만 대화할 수 있기 때문에 C++ 클래스를 위한 C 함수를 정의합니다.

extern "C"
{
    Foo* Foo_new(int n) {return new Foo(n);}
    void Foo_bar(Foo* foo) {foo->bar();}
    int Foo_foobar(Foo* foo, int n) {return foo->foobar(n);}
}

호출하기 원하는 각 메소드를 클래스 기반이 아닌 이름으로 제공해야 함을 알아두세요.

우리는 우리 코드에서 lib.so 파일을 빌드해야 합니다.

다음을 쉘에서 입력하세요.

$ g++ -c -fPIC foo.cpp -o foo.o
$ g++ -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o 

또는 CMake를 사용할 수 있습니다.

다음은 foo.cpp를 빌드하기 위한 CMakeLists.txt 입니다.

cmake_minimum_required(VERSION 2.8.9)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}")
set(CMAKE_MACOSX_RPATH 1)

project (foo)
set (SOURCE foo.cpp)
add_library(foo MODULE ${SOURCE}) 

저는 Mac에서 빌드를 해서 MacOS를 위해 4번째 줄을 추가하였습니다. 리눅스에서도 잘 작동하겠지만 필요는 없습니다.

이제 C++로 컴파일 된 내용을 작성합니다. 우리는 클래스에 대한 Python wrapper를 빌드하려 합니다.

import ctypes

lib = ctypes.cdll.LoadLibrary('./libfoo.so')

class Foo(object):
    def __init__(self, val):
        lib.Foo_new.argtypes = [ctypes.c_int]
        lib.Foo_new.restype = ctypes.c_void_p

        lib.Foo_bar.argtypes = [ctypes.c_void_p]
        lib.Foo_bar.restype = ctypes.c_void_p

        lib.Foo_foobar.argtypes = [ctypes.c_void_p, ctypes.c_int]
        lib.Foo_foobar.restype = ctypes.c_int

        self.obj = lib.Foo_new(val)

    def bar(self):
        lib.Foo_bar(self.obj)

    def foobar(self, val):
        return lib.Foo_foobar(self.obj, val)

리턴 값의 타입과 argument 타입을 정의하는 요구사항을 적으세요. (하나도 리턴하지 않으면 예시로 void를 리턴합니다.) 이것이 없으면 segmentation fault(등)를 얻을 것입니다.
이제 모든 것을 다 하였고 모듈을 빌드해야 합니다. 파이썬에서 간단히 그것을 import할 수 있습니다.
예를 들어

from foo import Foo

# 우리는 5라는 값으로 Foo 객체를 생성할 것입니다...
f=Foo(5)

# f.bar()를 호출하는 것은 값을 포함한 메시지를 출력할 것입니다...
f.bar()

# 이제 f, Foo 객체에서 저장되어 있는 값에 값(7)을 더하기 위해 foobar를 사용합니다.
print (f.foobar(7))

# 또 한 번 같은 메소드를 호출합니다 - 이 번엔 일반적인 파이썬 정수를 
# 보여줄 것입니다...

x = f.foobar(2)
print (type(x))

이 간단한 데모를 위한 전체 소스 코드는 여기에 있습니다.

https://github.com/Auctoris/ctypes_demo

이 간단한 데모를 위한 전체 소스 코드는 여기에 있습니다.

https://github.com/Auctoris/ctypes_demo

반응형
반응형

출처

https://stackoverflow.com/questions/13297207/is-it-valid-to-compare-a-double-with-an-int-in-java

Java에서 double과 int를 비교하는 것이 유효합니까?

Utilities.getDistance(uni, enemyuni) <= uni.getAttackRange()

Utilities.getDistance는 double을 리턴하고 getAttackRange는 int를 리턴합니다. 위의 코드는 if 구문의 한 부분이고 이는 true가 되어야 합니다. 이 비교가 유효합니까?

감사합니다.

--

5개 답변중 1개의 답변만 추려냄.

예 유효합니다. 비교하기 전에 int를 double로 변환(promote)합니다.

JLS 섹션 5.6.2 (이진 숫자 변환) 의 링크에 있는 JLS 섹션 15.20.1 (숫자 비교 연산) 를 확인해 보세요.

뒷부분을 발췌하면

primitive의 넓은 타입의 변환은 다음 규칙에 의해 정의된 대로 두 피연산자에 변환이 적용됩니다.
* 만약 한 피연산자 type이 double이면 다른 하나는 double로 변환됩니다.
* ...

--

원본

https://github.com/SDRLurker/TIL/blob/master/scala/01/compare.md

반응형
반응형

출처

https://unix.stackexchange.com/questions/223543/get-the-date-of-last-months-last-day-in-a-shell-script


shell 스크립트에서 지난 달의 마지막 날짜 구하기

어떻게 처리할 날짜에 기반하여 지난 달의 날짜를 구할 수 있습니까?

예시:

* 처리할 날짜 = 15jan2015, 2015년 1월 15일

* 예상 날짜 = 31dec2014, 2014년 12월 31일

* 처리할 날짜 = 15feb2015, 2015년 2월 15일

* 예상 날짜 = 31Jan2015, 2015년 1월 31일

------

4개의 답변 중 1개의 답변만 추려냄.

GNU의 date로 

몇 가지 shell은 날짜 조작 지원이 내장되어 있습니다.

$ date +%d%b%Y
16Aug2015
$ date -d "$(date +%Y-%m-01) -1 day" +%d%b%Y
31Jul2015

ksh93로 

$ printf "%(%d%b%Y)T\n" "1st day, yesterday"
31Jul2015

zsh로 

$ zmodload zsh/datetime
$ strftime -s d %Y-%m-01-12 $EPOCHSECONDS
$ strftime -rs d %Y-%m-%d-%H $d
$ strftime %d%b%Y $((d-86400))
31Jul2015


반응형
반응형

출처 : https://stackoverflow.com/questions/13322485/how-to-get-the-primary-ip-address-of-the-local-machine-on-linux-and-os-x

리눅스와 OS X에서 현재 컴퓨터의 중요 외부 IP를 알아내는 방법

저는 127.0.0.1보다 현재 컴퓨터(localhost)의 중요(첫 번째) IP 주소를 리턴하는 command를 찾고 있습니다.

이 해결책은 적어도 리눅스(Debian과 Redhat)과 OS X 10.7+에서 작동해야 합니다.

저는 둘다 ifconfig로 가능하지만 이 플랫폼 사이에 출력이 일관성이 없다는 게 문제입니다.


30개의 답변 중 2개의 답변

ifconfig로 부터 grep을 사용하여 IP 주소를 걸러낼 수 있습니다.

ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'

아니면 sed

ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'

만약 특정 인터페이스인 wlan0, eth0, 등등에만 관심이 있다면 다음처럼 사용가능합니다.

ifconfig wlan0 | ...

예를 들어 myip라 불리는 당신이 명령어를 만들어 .bashrc에 명령어를 별명(alias)으로 사용할 수 있습니다.

alias myip="ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'"

더 간단한 방법은 hostname -I(hostname -ihostname의 옛날 버전에서 되므로 댓글을 보세요.) 입니다. 하지만 리눅스에서만 됩니다.


리눅스에서(OS X 아님) 다음 명령어로 가능합니다.

hostname --ip-address
반응형

+ Recent posts