페이스북 사용자 이탈 가속..게시물 30% 줄어



http://v.media.daum.net/v/20170224151816192


지난해 FB 사용자들의 게시물은 2015년과 비교해 29.49% 줄어든 것으로 나타났으며, 뉴스피드에 게재된 게시물을 대상으로 한 댓글과 '좋아요', 공유 등의 참여는 7개월 연속 감소하다 2015년 9월~2016년 3월 일시 늘었다가 다시 줄었다.



게시물 1개당 좋아요, 댓글, 공유 등 모든 지표가 감소했는데, 작년 들어 전년 대비 좋아요는 7.87%, 댓글은 37.47%, 공유는 27.8%로 각각 줄어든 것으로 나타났다.




The 2017 Facebook User-Generated Content Benchmark Report

http://info.mavrck.co/facebook-user-generated-content-benchmark-report-q1-2017

Posted by '김용환'
,



kafka 0.10.1.1을 설치했다. 

kafka는 격변으로 변하고 있다.. 내부는 크게 변하는 것 같지는 않지만 API쪽은 계속 변하는 것 같다. 







kafka 0.10.1.1를 3대의 클러스터로 설치하는 내용이다. 



http://kafka.apache.org/downloads.html에서 확인한다. 


https://www.apache.org/dyn/closer.cgi?path=/kafka/0.10.1.1/kafka_2.11-0.10.1.1.tgz 에서 0.10.1.1을 다운받는다. 



다운로드하고 압축을 푼다.


$ wget http://apache.mirror.cdnetworks.com/kafka/0.10.1.1/kafka_2.11-0.10.1.1.tgz


$ tar zxvf kafka_2.11-0.10.1.1.tgz


$ sudo cp -r kafka_2.11-0.10.1.1 /usr/local/


$ sudo ln -s /usr/local/kafka_2.11-0.10.1.1 /usr/local/kafka




kafka에는 zookeeper를 내장되어 있다. 설정을 변경한다.


$ cd /usr/local/kafka/config


$ sudo vi zookeeper.properties

initLimit=5

syncLimit=2


server.1=alpha-googleplus-test1.google.cc:15000:16000

server.2=alpha-googleplus-test2.google.cc:15000:16000

server.3=alpha-googleplus-test3.google.cc:15000:16000





dataDir=/tmp/zookeeper이 기본값이기 때문에 

zookeeper에 잘못된 값을 지정한 것이 있으면 아래 내용으로 zookeeper id를 변경할 수 있다. 


$ sudo mkdir -p /tmp/zookeeper

$ sudo bash -c 'echo 1 > /tmp/zookeeper/myid'

$ cat /tmp/zookeeper/myid

1


2번째 장비에는  /tmp/zookeeper/myid에 2를 저장한다. 


3번째 장비에는  /tmp/zookeeper/myid에 3을 저장한다. 



이제 kafka의 주키퍼를 실행하기 위해 스크립트를 추가한다.



$ cd /usr/local/kafka/

$ sudo vi zk-start.sh


#!/bin/bash

nohup bin/zookeeper-server-start.sh -daemon config/zookeeper.properties 


$ sudo chmod 755 zk-start.sh

$ sudo ./zk-start.sh



차례로 3대의 서버에서 kafka의 zookeeper를 실행하면 정상적으로 동작한다. 



zookeeper를 종료하는 스크립트는 다음과 같다. 


$ cat zk-stop.sh

#!/bin/bash


KAFKA_HOME=/usr/local/kafka

$KAFKA_HOME/bin/zookeeper-server-stop.sh


$ sudo zk-stop.sh




이번에 kakfa 클러스터 설정을 지정한다. 


$ cd /usr/local/kafka/

$ sudo vi server.properties



zookeeper id에 맞게 broker.id=0를 수정한다.

id가 3번째이면 broker.id=3으로 수정한다. 


그리고 zookeeper.connect를 변경한다.


zookeeper.connect=localhost:2181

—>

zookeeper.connect=alpha-googleplus-test1.google.cc:2181,alpha-googleplus-test2.google.cc:2181,alpha-googleplus-test3.google.cc:2181




kafka 스크립트를 추가한다.


$ cat kafka-start.sh

#!/bin/bash


KAFKA_HOME=/usr/local/kafka


$KAFKA_HOME/bin/kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties




kafkaServer.out에에 정상적인지 실행되었는지 확인한다.


[2017-02-28 21:20:03,701] INFO Kafka version : 0.10.1.1 (org.apache.kafka.common.utils.AppInfoParser)

[2017-02-28 21:20:03,701] INFO Kafka commitId : f10ef2720b03b247 (org.apache.kafka.common.utils.AppInfoParser)

[2017-02-28 21:20:03,702] INFO [Kafka Server 3], started (kafka.server.KafkaServer)




kafka 데몬을 종료하는 스크립트를 추가한다.


$ cat kafka-stop.sh

#!/bin/bash


KAFKA_HOME=/usr/local/kafka


$KAFKA_HOME/bin/kafka-server-stop.sh



kafkaServer.out에 다음 로그가있다. 


[2017-02-28 21:21:34,672] INFO [Kafka Server 3], shut down completed (kafka.server.KafkaServer)

[2017-02-28 21:21:34,672] INFO EventThread shut down for session: 0x25a83bf8af20000 (org.apache.zookeeper.ClientCnxn)





kafka 토픽을 생성한다.


$ /usr/local/kafka/bin/kafka-topics.sh --create --zookeeper alpha-googleplus-test1.google.cc --replication-factor 3 --partitions 1 --topic test

Created topic "test".


kafka 토픽이 제대로 생성되었는지 출력한다.


$ /usr/local/kafka/bin/kafka-topics.sh --list --zookeeper alpha-googleplus-test1.google.cc

test



토픽을 변경한다. 


/usr/local/kafka/bin/kafka-topics.sh --alter --zookeeper alpha-googleplus-test1.google.cc --topic test --partitions 2

WARNING: If partitions are increased for a topic that has a key, the partition logic or ordering of the messages will be affected

Adding partitions succeeded!



토픽의 대한 내용을 자세히 확인하기


$ /usr/local/kafka/bin/kafka-topics.sh --describe --zookeeper alpha-googleplus-test1.google.cc --topic test

Topic:test PartitionCount:2 ReplicationFactor:3 Configs:

Topic: test Partition: 0 Leader: 1 Replicas: 1,3,2 Isr: 1,3,2

Topic: test Partition: 1 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1




메시지 사용하는 방법이다.


producer와 consumer용 터미널가 있어야 한다. 


producer용 터미널에서 실행한다. 


$ /usr/local/kafka/bin/kafka-console-producer.sh --broker-list alpha-googleplus-test1.google.cc:9092 --topic test




consumer용 터미널에서 실행한다. 


$ /usr/local/kafka/bin/kafka-console-consumer.sh --zookeeper alpha-googleplus-test1.google.cc --topic test --from-beginning

Using the ConsoleConsumer with old consumer is deprecated and will be removed in a future major release. Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper].

...




producer 터미널에서 111을 입력하면 consumer 터미널에서 실행된다. 


consumer의 커맨드가 zookeeper 대신 bootstrap-server를 쓰라고 되어 있다. 아래와 같이 바꾸면 더 이상 warning 메시지는 발생하지 않는다. 


$ /usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server alpha-googleplus-test1.google.cc:9092 --topic test --from-beginning


아까 입력했던 111이 출력된다. 


producer에서 222를 입력하면 consumer에서 222가 출력된다. 



참고로 디폴트 설정으로 토픽을 삭제할 수 없다. delete.topic.enable=false로 되어 있다. 



$ /usr/local/kafka/bin/kafka-topics.sh --delete --zookeeper alpha-googleplus-test1.google.cc --topic test

Topic test is marked for deletion.

Note: This will have no impact if delete.topic.enable is not set to true.


$ /usr/local/kafka/bin/kafka-topics.sh --list --zookeeper alpha-googleplus-test1.google.cc

test - marked for deletion





설정 파일을 수정하고 다시 실행해야 한다.


# Switch to enable topic deletion or not, default value is false

delete.topic.enable=true




따라서 kafka 설정에 delete.topic.enable=true으로 변경하고 재시작한다. 


$ /usr/local/kafka/bin/kafka-topics.sh --list --zookeeper alpha-googleplus-test1.google.cc



test는 삭제되어 있다. 




다시 한번 요약하면 다음과 같다.


$ /usr/local/kafka/bin/kafka-topics.sh --list --zookeeper alpha-googleplus-test1.google.cc

test


$ /usr/local/kafka/bin/kafka-topics.sh --delete --zookeeper alpha-googleplus-test1.google.cc --topic test


$ /usr/local/kafka/bin/kafka-topics.sh --list --zookeeper alpha-googleplus-test1.google.cc






만약 topic 생성 없이 kafka topic에 바로 publish하면 기본 상태로 topic이 생성되고 데이터가 추가된다. 파티션 개수 1, replication factor는 1이다. 


$ /usr/local/kafka/bin/kafka-topics.sh --describe --zookeeper alpha-googleplus-test1.google.cc --topic profile_image_to_talk

Topic:profile_image_to_talk PartitionCount:1 ReplicationFactor:1 Configs:

Topic: profile_image_to_talk Partition: 0 Leader: 1 Replicas: 1 Isr: 1




카프카 토픽에 설정을 추가하기 위해 다음 커맨드를 사용한다.


/usr/local/kafka/bin/kafka-topics.sh --alter --zookeeper localhost:2181/chroot --topic profile_image_to_talk --config <key>=<value>



토픽에서 구성을 제거하기 위해 다음 커맨드를 사용한다.


$ /usr/local/kafka/bin/kafka-topics.sh --alter --zookeeper localhost:2181/chroot --topic profile_image_to_talk --deleteconfig <key>=<value>



Posted by '김용환'
,


config/server.properties 파일에 broker.id를 수정 후 재시작했다가 다시 broker.id를 수정한 경우에 발생하는 경우이다. 



[2017-02-28 17:42:29,272] FATAL Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)

kafka.common.InconsistentBrokerIdException: Configured broker.id 2 doesn't match stored broker.id 0 in meta.properties. If you moved your data, make sure your configured broker.id matches. If you intend to create a new broker, you should remove all data in your data directories (log.dirs).

        at kafka.server.KafkaServer.getBrokerId(KafkaServer.scala:687)

        at kafka.server.KafkaServer.startup(KafkaServer.scala:213)

        at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:39)

        at kafka.Kafka$.main(Kafka.scala:67)

        at kafka.Kafka.main(Kafka.scala)

[2017-02-28 17:42:29,275] INFO shutting down (kafka.server.KafkaServer)

[2017-02-28 17:42:29,278] INFO Shutting down. (kafka.log.LogManager)

[2017-02-28 17:42:29,287] INFO Shutdown complete. (kafka.log.LogManager)

[2017-02-28 17:42:29,288] INFO Terminate ZkClient event thread. (org.I0Itec.zkclient.ZkEventThread)

[2017-02-28 17:42:29,293] INFO Session: 0x25a83bf8af20003 closed (org.apache.zookeeper.ZooKeeper)

[2017-02-28 17:42:29,296] INFO EventThread shut down for session: 0x25a83bf8af20003 (org.apache.zookeeper.ClientCnxn)

[2017-02-28 17:42:29,296] INFO shut down completed (kafka.server.KafkaServer)

[2017-02-28 17:42:29,297] FATAL Fatal error during KafkaServerStartable startup. Prepare to shutdown (kafka.server.KafkaServerStartable)

kafka.common.InconsistentBrokerIdException: Configured broker.id 2 doesn't match stored broker.id 0 in meta.properties. If you moved your data, make sure your configured broker.id matches. If you intend to create a new broker, you should remove all data in your data directories (log.dirs).

        at kafka.server.KafkaServer.getBrokerId(KafkaServer.scala:687)

        at kafka.server.KafkaServer.startup(KafkaServer.scala:213)

        at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:39)

        at kafka.Kafka$.main(Kafka.scala:67)

        at kafka.Kafka.main(Kafka.scala)





config/server.properties 파일에 log.dirs 디폴트 위치가 /tmp/kafka-logs이다. 


# A comma seperated list of directories under which to store log files

log.dirs=/tmp/kafka-logs



살펴보니. broker-id이다. 


$ cat /tmp/kafka-logs/meta.properties

#

#Tue Feb 28 17:30:11 KST 2017

version=0

broker.id=0



다음을 실행하고 다시 kafka를 실행하면 더 이상 위의 에러는 발생하지 않는다. 


$ rm /tmp/kafka-logs/meta.properties


Posted by '김용환'
,

1. 리눅스에서 ssd인지 hdd인지 확인하는 설정



/sys/block/sda/queue/rotational의 값이 0이면 SSD이고

/sys/block/sda/queue/rotational의 값이 1이면 HDD이다. 


$ cat /sys/block/sda/queue/rotational

1


$ cat /sys/block/sdb/queue/rotational

0



2. 리눅스에서 scsi hdd 여부 확인하는 커맨드

hdparm -I /dev/sda

Posted by '김용환'
,

jnr

java core 2017. 2. 27. 12:01



jni, jna 다음으로 새로 나온 jnr이다. 

cassandra의 java driver에 쓰인다고 해서 보고 있다.


https://www.slideshare.net/skrb/jnr-java-native-runtime


JNR: Java Native Runtime from Yuichi Sakuraba




다른 참조 자료이다. 


http://www.oracle.com/technetwork/java/jvmls2013nutter-2013526.pdf


Posted by '김용환'
,


리눅스 커맨드를 찾는 info 커맨드도 있다.. 





Posted by '김용환'
,


json 데이터를 저장할 hive 테이블을 생성하는 예시이다. 

CREATE TABLE if not exists member

(

   name STRING,

   id INT, 

   props STRUCT <

       departname:STRING,

       alias:STRING

   >

) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'

STORED AS TEXTFILE





json 데이터를 hive에 저장할 때 개행 문자가 있으면 에러가 발생한다. 


$ cat "test.json"

{

  "name":"samuel",

  "id":1,

  "props": {

    "departname":"none",

    "alias":"kim"

  }

}


다음 에러로 발생한다. 

Failed with exception java.io.IOException:org.apache.hadoop.hive.serde2.SerDeException: Row is not a valid JSON Object - JSONException: A JSONObject text must end with '}' at 2 [character 3 line 1]


따라서 개행 문자 없이 사용해야 한다. 


$ cat "test.json"

{  "name":"samuel",  "id":1,  "props":{    "departname":"none",    "alias":"kim"  }}






이제 하둡에 json 파일을 업로드한다.


$ hadoop fs -put test.json /lib/test.json


hive 실행을 실행해서 데이터를 읽게 한다.



hive> LOAD DATA INPATH '/lib/test.json' OVERWRITE INTO TABLE member;



hive> select * from member;

OK

samuel 1 {"departname":"none","alias":"kim"}

Time taken: 0.614 seconds, Fetched: 1 row(s)


SELECT props.alias FROM member WHERE props.departname="none";

kim



Posted by '김용환'
,



hive에서 json 컬럼에 대해서 json 쿼리를 진행할 수 있다. 



hive> select * from googleplus_log where date_id='2037-08-23' and label='birthday' and get_json_object(props, '$.id')='11935385';




json_tuple도 사용할 수 있지만, lateral view도 써야 하고 parittion table이라면 strict 모드로 바꾸라 한다. 


hive> select log.date_id, b.* from googleplus_log log lateral view json_tuple(log.props, 'result', 'birth', 'id', 'action') b where date_id='2017-02-23' and label='birthday'; 


This happens cos the hive is set to strict mode. this allow the partition table to access the respective partition /folder in hdfs .



hive>  set hive.mapred.mode=unstrict; 


hive> select log.date_id, b.* from googleplus_log log lateral view json_tuple(log.props, 'result', 'birth', 'id', 'action') b where date_id='2017-02-23' and label='birthday'; 

##잘 동작한다.






Posted by '김용환'
,


read에 -r 옵션을 실행한 상태에서 라인 끝에 \ 문자를 추가하더라도 더 이상 라인을 계속 입력받지 않는다.



[~] read a

adfasdf asdfasdf afdsaf \

> 1 2 \

> 3 4

[~] echo $a

adfasdf asdfasdf afdsaf 1 2 3 4

[~] read -r b

asdfsad asdfasfd asdfsafd \

[~] echo $b

asdfsad asdfasfd asdfsafd \

Posted by '김용환'
,


Spark에서 Executor 또는 Driver의 메모리가 너무 적으면 OutOfMemoryError가 발생할 수 있다. 


WARN TaskSetManager: Lost task 68.0 in stage 9.0 (TID 510, story-hadoop-dn11.dakao.io): java.lang.OutOfMemoryError: GC overhead limit exceeded

	at java.io.ObjectStreamClass.newInstance(ObjectStreamClass.java:967)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1785)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
	at org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:76)
	at org.apache.spark.serializer.DeserializationStream.readKey(Serializer.scala:169)
	at org.apache.spark.serializer.DeserializationStream$$anon$2.getNext(Serializer.scala:201)
	at org.apache.spark.serializer.DeserializationStream$$anon$2.getNext(Serializer.scala:198)
	at org.apache.spark.util.NextIterator.hasNext(NextIterator.scala:73)
	at scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:396)
	at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:369)
	at org.apache.spark.util.CompletionIterator.hasNext(CompletionIterator.scala:32)
	at org.apache.spark.InterruptibleIterator.hasNext(InterruptibleIterator.scala:39)
	at scala.collection.Iterator$class.foreach(Iterator.scala:742)
	at org.apache.spark.InterruptibleIterator.foreach(InterruptibleIterator.scala:28)
	at org.apache.spark.rdd.SubtractedRDD.integrate$1(SubtractedRDD.scala:122)
	at org.apache.spark.rdd.SubtractedRDD.compute(SubtractedRDD.scala:127)
	at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:306)



Spark는 모두 메모리에 올리기 때문에. 이런 현상이 자주 발생될 수 있는데, 


해결하기 위해서는 Hdfs 파일의 크기(압축이라면 이에 맞게 *8 또는 *10해서 대략 예측 크기를 고려한다)


core 개수와 driver, executer 메모리도 이에 맞게 늘리면 더 이상 문제가 발생하지 않는다. 

'scala' 카테고리의 다른 글

[scala] List와 Array의 lift 메소드  (0) 2017.03.04
[펌] spark 2.0 소개(성능)  (0) 2017.03.02
[spark] spark summit 자료  (0) 2017.02.22
[scala] Array.transpose 예시  (0) 2017.02.17
[spark1.6] rdd를 dataframe으로 만드는 방법  (0) 2017.02.14
Posted by '김용환'
,