'mahout'에 해당되는 글 2건

  1. 2013.04.11 [Mahout] 하둡 M/R을 사용한 머하웃 추천 예제 (2)
  2. 2013.03.18 [Mahout] IDMigrator (2)

머하웃 인 액션 6챕터를 보면 하둡을 사용한 추천 예제 프로그램이 나온다.

이 내용이 개인적으로는 좀 혼란스럽게 느껴져서 오해를 했었는데..

오해의 내용은 M/R을 사용하여 머하웃 추천을 돌리려면 머하웃에서 제공되는 어떤 추상클래스를 상속하여

나만의 추천기를 개발해야 한다는 오해였다.


책 내용을보면 그전 챕터까지 설명하던 머하웃의 기본적은 input file format인 (사용자,아이템,선호도)가 아닌

[사용자:아이템1 아이템2 아이템3 ..] 과 같은 형태가 갑자기 나오며

이를 분석하기 위핸 Mapper와 Combiner, Reducer를 직접 개발하는 과정이 나온다.


아무리 생각해도 이렇지는 않을 것 같은데..

기본적으로 많은 알고리즘에 대해서 M/R용 API가 있을 것 같은데.. 싶어서

이래저래 찾아보고 테스트해보니.... 역시 예상대로 너무 간단한.. -.-


책에 있는 예제는 [사용자:아이템1 아이템2 아이템3 ..]  이런 형태의 머하웃의 일반적인 포맷이 아닌 포맷에 대한 처리를 하기위한 Mapper/Reducer 예제를 보여주기 위한 것이었다.


1. 입력파일의 포맷은 CSV 포맷이면 된다.

즉, [사용자ID,아이템ID,선호도] 가 되며, 공백은 없도록 합니다.


2. 위 입력파일을 hadoop hdfs에 올립니다. keyword.txt라고 한다면

hadoop fs -put mahout_input/keyword.txt

정도가 되겠네요.


3. 실행을 합니다.

hadoop jar mahout-core-0.7-job.jar

org.apache.mahout.cf.taste.hadoop.item.RecommenderJob - Dmapred.input.dir=mahout_input/keyword.txt - Dmapred.output.dir=mahout_output --similarityClassname SIMILARITY_TANIMOTO_COEFFICIENT


4. 그외에 많은 조건들이 있습니다. --BooleanData 와 같은 조건도 있으며, --similarityClassname도 알고리즘별로 여러가지가 존재합니다.


5. 결과가 hdfs mahout_ouput 디렉토리에 저장됩니다. 이걸 별도 처리를 해서 (아마 해야겠죠.. 모두 ID값으로 변환되어있는 상태라..) 다시 DB에 넣던 해서 활용합니다.


6. 결과는 아래와 같은 형태로 노출됩니다.

-8886802455247783609    [1680471607041718408:2.7733645]

 

-8886599904625969211    [-8026017956757776395:6.483146,1534328935540736934:5.3061223,51463945656709348

32:4.4494586,6899767517892059194:4.1260405,-6385859657935360421:4.062827,3335883382715616440:3.9160233,3329489296048811200:3.8189416,3046820523972064153:3.7922337,2637933732121785305:3.7804105,81246183072882590:3.3164082]


보시면 아시겠지만 아이디 [추천아이템:점수, ....] 형태입니다.


Posted by 용식

[Mahout] IDMigrator

Mahout 2013.03.18 15:24

하루빨리 슬럼프를 극복하기위해 뭔가 몰입할 것을 찾다가..

회사에도 도움이 되고, 나도 새로운것 좀 볼 수 있는.. Mahout을 한번..

해보기로..


일단, 그동안 모아놓은 검색관련 데이터들을 테스트로 돌려보기위해서

예제를 보며 맞춰나가던 중..


Mahout은 대용량 데이터를 처리하기위해 ID, ItemId등의 값을 모두 Long으로 처리하는데..

내가 모아놓은 데이터는.. String이라서.. 이게 .. 적용이 안됨 -.-


대부분의 사용자들이 모아둔 데이터가 Mapping을 사용해서 해놓지는 않았을테니..

뭔가 API가 있을거야.... 하고 찾아보다가 IDMigrator 인터페이스를 확인...


toLongID, toStringID 메서드 두개를 가지고 있는데..

이를 구현한 MemoryIDMigrator, MySQLJDBCIDMigrator 를 활용해보았다.



처음에는 자동으로 Mapping도 해주는줄 알았는데 그건 아니었고..storeMapping method를 사용해야한다.

MemoryIDMigrator는 heap 메모리상에, MySQLJDBCIDMigrator는 DB에 매핑테이블을 하나 만들고

그 테이블에 Mapping 데이터를 넣어서 관리해준다. String <-> Long은 md5Digest를 활용하여 변환..


JDBCMigrator 같은 경우 테이블명과 long column, string column명을 생성자에 줄 수도 있고..

안주면 기본적으로 taste_id_mapping (long_id, string_id) 형태의 테이블이 필요하다.

long_id는 pk 잡아주면 될것 같다. (insert ignore 문이 사용되고 있는것으로 봐서는..)


데이터 많아질것을 대비해서 index로 각 컬럼value로 생성하는 것이 좋겠다.


Posted by 용식