[PySpark] dataframe을 python 자료형(dict)으로 변형하기 spark driver 에서 데이터를 바로 사용하는 경우, dataframe은 다루기가 어려운 것 같다. dataframe의 collect()와 asDict()를 이용하면 Python 자료형으로 변환할 수 있다. dataframe 생성 pyspark에서 elasticsearch index를 조회해 dataframe을 생성한다. >>> from pyspark.sql import SQLContext >>> sqlContext = SQLContext(sc) >>> df = sqlContext.read.format(“org.elasticsearch.spark.sql”).option(“es.nodes”,”192.168.179.141:9200″).option(“es.nodes.discovery”, “true”).load(“${INDEX}/${TYPE}”) >>> df.registerTempTable(“tab”) >>> df = sqlContext.sql(“SELECT distinct […]
[PySpark] Elasticsearch Index 에서 DataFrame 생성하기
[PySpark] Elasticsearch Index 에서 DataFrame 생성하기 elasticsearch-hadoop connector 를 이용해서 spark dataframe을 생성한다. Spark 설치 spark 다운로드 및 환경설정 필요한 요소만 설치하고자 하는 경우 소스코드를 내려받아서 maven을 이용해 빌드해도 되지만 pre-compiled 바이너리를 이용한다. wget http://mirror.navercorp.com/apache/spark/spark-2.3.2/spark-2.3.2-bin-hadoop2.7.tgz tar -xvzf spark-2.3.2-bin-hadoop2.7.tgz -C /app/spark/. mv /app/spark/spark-2.3.2-bin-hadoop2.7 /app/spark/2.3.2 find /app/spark/2.3.2 -mindepth 1 -maxdepth 1 -type d | xargs -I {} […]
[ElasticSearch] Scroll API
[ElasticSearch] Scroll API elasticsearch에서 기본적인 search API는 한 페이지를 리턴하고나면 search context가 소멸된다. search API에서 from, to 값을 이용해 pagination을 구현한 것은 별개의 쿼리가 매번 수행된 것으로 RDBMS로 치면 cursor가 소멸된 것과 같다. 대량의 데이터를 조회하기 위해서는 다른 방식을 사용해야하는데, Elasticsearch에서 RDBMS의 cursor와 같은 기능을 하는게 Scroll API 이다. 사용 방법 curl을 이용해 간단히 scroll […]
[WordPress] 모든 글에 특성 이미지 추가하기
모든 글에 특성 이미지 추가하기 $DOCUMENT_DIR/wp-content/themes/$THEME_NAME/functions.php 문서를 열어 다음과 같은 함수를 추가한다. function auto_featured_image() { global $post; if (!has_post_thumbnail($post->ID)) { $attached_image = get_children( “post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1” ); if ($attached_image) { foreach ($attached_image as $attachment_id => $attachment) { set_post_thumbnail($post->ID, $attachment_id); } } } } // 기존 등록된 글에 특성 이미지가 없는 경우, 특성 이미지를 설정할 수 있도록 임시 […]
[Hadoop] 가용성을 고려한 Hadoop 2.x Cluster 설치
가용성을 고려한 Hadoop Cluster 설치 Namenode와 Resourcemanager를 active node,standby node로 각각 두 벌씩 구성함으로써 고가용성을 고려한 Hadoop Cluster를 설치한다. 사전 준비 의존 패키지 설치 namenode와 resourcemanager가 장애 상황에서 standby -> active 상태로 전환될 때에 fuser 명령을 이용해서 장애노드의 프로세스들을 정리하므로 psmisc 패키지를 설치한다. yum -y install psmisc JDK https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 페이지에서 JDK 8 버전 바이너리 다운로드하고 […]
[Python] ipstack API – IP 위치 정보 조회
ipstack API – IP 위치 정보 조회 https://ipstack.com/ 에 접속하면 ip 주소로 위치 정보 검색을 해볼 수가 있는데 이걸 API로 제공한다. 월 1만회 조회는 무료로 사용할 수 있고 그 이상을 원하면 전문가, 기업용 플랜을 신청해야한다. API API 사용방법은 https://ipstack.com/documentation 페이지에 나와있는데 기본적인 사용법은 아래와 같다. URL http://api.ipstack.com/134.201.250.155?access_key=YOUR_ACCESS_KEY Response { “ip”: “134.201.250.155”, “hostname”: “134.201.250.155”, “type”: “ipv4”, […]
[Python] Kakao API – 주소 좌표 변환하기
Kakao API – 주소 좌표 변환하기 Daum 지도 검색에 사용되는 주소 정보로 위도 경도 좌표 값을 받아낼 수 있다. 상세 개발가이드는 아래 페이지에서 확인 가능. https://developers.kakao.com/docs/restapi/local 카카오 계정으로 로그인 해서 API를 발급받아야 한다. Python Sample Python requests를 이용한 REST API 응답으로, 요청한 주소에 대응되는 좌표 값을 받아올 수 있다. def getLatLng(addr): url = ‘https://dapi.kakao.com/v2/local/search/address.json?query=’+addr headers […]
[network] freenom에서 무료 도메인 이용하기
Freenom에서 무료 도메인 이용하기 Freenom 에서 .ga, .ml, .tk, .gq, .cf 로 끝나는 최상위 도메인을 무료로 이용할 수 있다. http://freenom.org/ 에 접속해서 먼저 회원가입을 하고, [Services] > [Register a New Domain] 으로 이동해서 도메인 명을 검색한다. 아래와 같이 사용 가능한 도메인 리스트를 보여주는데 [Get it now!] 버튼을 눌러서 장바구니에 담아놓는다. Get one of these domains. […]
[Kafka] External Listener 설정
Kafka External Listener 설정 브로커가 기동될 때 InetAddress.getLocalHost.getHostAddress 가 사용됨. 클라이언트가 외부 환경에 있어서 브로커 접속이 불가능 한 경우 advertise.host.name 값 설정으로 해결할 수 있다. advertised.host.name=$EXT_HOSTNAME listener.security.protocol.map=EXTERNAL:PLAINTEXT,INTERNAL:PLAINTEXT listeners=INTERNAL://10.4.0.105:9092,EXTERNAL://0.0.0.0:9093 advertised.listeners=INTERNAL://10.4.0.105:9092,EXTERNAL://$EXT_HOSTNAME:9093 inter.broker.listener.name=INTERNAL
[Kafka] Python Consumer sample
#!/app/python/bin/python from kafka import KafkaConsumer consumer = KafkaConsumer(‘test’,bootstrap_servers=[‘$HOSTNAME:9093’]) for message in consumer: print (“%s:%d:%d: key=%s value=%s” % (message.topic, message.partition, message.offset, message.key, message.value))