2011-08-25 21 views
27

का उपयोग करके क्लॉउटिंग (fkmeans) मैं क्लोजर के माध्यम से अपने डेटा को क्लस्टर करने के लिए एक छोटी स्क्रिप्ट लिखने की कोशिश कर रहा हूं (हालांकि महाउट कक्षाओं को कॉल करना)। मैं इस प्रारूप में अपना इनपुट डेटा हैक्लोजर (fkmeans) क्लोजर

format: (tag) (image) (frequency) 
tag_sit image_a 0 
tag_sit image_b 1 
tag_lorem image_a 1 
tag_lorem image_b 0 
tag_dolor image_a 0 
tag_dolor image_b 1 
tag_ipsum image_a 1 
tag_ipsum image_b 1 
tag_amit image_a 1 
tag_amit image_b 0 
... (more) 

तब मैं इस स्क्रिप्ट का उपयोग एक SequenceFile में उन्हें लिखना (clojure)

#!./bin/clj 
(ns sensei.sequence.core) 

(require 'clojure.string) 
(require 'clojure.java.io) 

(import org.apache.hadoop.conf.Configuration) 
(import org.apache.hadoop.fs.FileSystem) 
(import org.apache.hadoop.fs.Path) 
(import org.apache.hadoop.io.SequenceFile) 
(import org.apache.hadoop.io.Text) 

(import org.apache.mahout.math.VectorWritable) 
(import org.apache.mahout.math.SequentialAccessSparseVector) 

(with-open [reader (clojure.java.io/reader *in*)] 
    (let [hadoop_configuration ((fn [] 
           (let [conf (new Configuration)] 
            (. conf set "fs.default.name" "hdfs://localhost:9000/") 
            conf))) 
     hadoop_fs (FileSystem/get hadoop_configuration)] 
    (reduce 
     (fn [writer [index value]] 
     (. writer append index value) 
     writer) 
     (SequenceFile/createWriter 
     hadoop_fs 
     hadoop_configuration 
     (new Path "test/sensei") 
     Text 
     VectorWritable) 
     (map 
     (fn [[tag row_vector]] 
      (let [input_index (new Text tag) 
       input_vector (new VectorWritable)] 
      (. input_vector set row_vector) 
      [input_index input_vector])) 
     (map 
      (fn [[tag photo_list]] 
      (let [photo_map (apply hash-map photo_list) 
        input_vector (new SequentialAccessSparseVector (count (vals photo_map)))] 
       (loop [frequency_list (vals photo_map)] 
       (if (zero? (count frequency_list)) 
        [tag input_vector] 
        (when-not (zero? (count frequency_list)) 
        (. input_vector set 
         (mod (count frequency_list) (count (vals photo_map))) 
         (Integer/parseInt (first frequency_list))) 
        (recur (rest frequency_list))))))) 
      (reduce 
      (fn [result next_line] 
       (let [[tag photo frequency] (clojure.string/split next_line #" ")] 
       (update-in result [tag] 
        #(if (nil? %) 
        [photo frequency] 
        (conj % photo frequency))))) 
      {} 
      (line-seq reader))))))) 

मूल रूप से यह में इनपुट बदल जाता है (जो एक php script से एक आउटपुट है) अनुक्रम फ़ाइल, इस प्रारूप

कुंजी (पाठ) में: $ tag_uri मूल्य (VectorWritable): एक सदिश (प्रमुखता = दस्तावेजों की संख्या) संख्यात्मक इंडेक्स और संबंधित आवृत्ति के साथ <0:1 1:0 2:0 3:1 4:0 ...>

तब मैं इस स्क्रिप्ट के साथ वास्तविक क्लस्टर करने के लिए आगे बढ़ना

#!./bin/clj 

(ns sensei.clustering.fkmeans) 

(import org.apache.hadoop.conf.Configuration) 
(import org.apache.hadoop.fs.Path) 

(import org.apache.mahout.clustering.fuzzykmeans.FuzzyKMeansDriver) 
(import org.apache.mahout.common.distance.EuclideanDistanceMeasure) 
(import org.apache.mahout.clustering.kmeans.RandomSeedGenerator) 

(let [hadoop_configuration ((fn [] 
           (let [conf (new Configuration)] 
            (. conf set "fs.default.name" "hdfs://127.0.0.1:9000/") 
            conf))) 
     input_path (new Path "test/sensei") 
     output_path (new Path "test/clusters") 
     clusters_in_path (new Path "test/clusters/cluster-0")] 
    (FuzzyKMeansDriver/run 
    hadoop_configuration 
    input_path 
    (RandomSeedGenerator/buildRandom 
     hadoop_configuration 
     input_path 
     clusters_in_path 
     (int 2) 
     (new EuclideanDistanceMeasure)) 
    output_path 
    (new EuclideanDistanceMeasure) 
    (double 0.5) 
    (int 10) 
    (float 5.0) 
    true 
    false 
    (double 0.0) 
    false)) '' runSequential 

हालांकि मैं इस

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 
11/08/25 15:20:16 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 
11/08/25 15:20:16 INFO compress.CodecPool: Got brand-new compressor 
11/08/25 15:20:16 INFO compress.CodecPool: Got brand-new decompressor 
11/08/25 15:20:17 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same. 
11/08/25 15:20:17 INFO input.FileInputFormat: Total input paths to process : 1 
11/08/25 15:20:17 INFO mapred.JobClient: Running job: job_local_0001 
11/08/25 15:20:17 INFO mapred.MapTask: io.sort.mb = 100 
11/08/25 15:20:17 INFO mapred.MapTask: data buffer = 79691776/99614720 
11/08/25 15:20:17 INFO mapred.MapTask: record buffer = 262144/327680 
11/08/25 15:20:17 WARN mapred.LocalJobRunner: job_local_0001 
java.lang.IllegalStateException: No clusters found. Check your -c path. 
     at org.apache.mahout.clustering.fuzzykmeans.FuzzyKMeansMapper.setup(FuzzyKMeansMapper.java:62) 
     at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:142) 
     at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:763) 
     at org.apache.hadoop.mapred.MapTask.run(MapTask.java:369) 
     at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:210) 
11/08/25 15:20:18 INFO mapred.JobClient: map 0% reduce 0% 
11/08/25 15:20:18 INFO mapred.JobClient: Job complete: job_local_0001 
11/08/25 15:20:18 INFO mapred.JobClient: Counters: 0 
Exception in thread "main" java.lang.RuntimeException: java.lang.InterruptedException: Fuzzy K-Means Iteration failed processing test/clusters/cluster-0/part-randomSeed 
     at clojure.lang.Util.runtimeException(Util.java:153) 
     at clojure.lang.Compiler.eval(Compiler.java:6417) 
     at clojure.lang.Compiler.load(Compiler.java:6843) 
     at clojure.lang.Compiler.loadFile(Compiler.java:6804) 
     at clojure.main$load_script.invoke(main.clj:282) 
     at clojure.main$script_opt.invoke(main.clj:342) 
     at clojure.main$main.doInvoke(main.clj:426) 
     at clojure.lang.RestFn.invoke(RestFn.java:436) 
     at clojure.lang.Var.invoke(Var.java:409) 
     at clojure.lang.AFn.applyToHelper(AFn.java:167) 
     at clojure.lang.Var.applyTo(Var.java:518) 
     at clojure.main.main(main.java:37) 
Caused by: java.lang.InterruptedException: Fuzzy K-Means Iteration failed processing test/clusters/cluster-0/part-randomSeed 
     at org.apache.mahout.clustering.fuzzykmeans.FuzzyKMeansDriver.runIteration(FuzzyKMeansDriver.java:252) 
     at org.apache.mahout.clustering.fuzzykmeans.FuzzyKMeansDriver.buildClustersMR(FuzzyKMeansDriver.java:421) 
     at org.apache.mahout.clustering.fuzzykmeans.FuzzyKMeansDriver.buildClusters(FuzzyKMeansDriver.java:345) 
     at org.apache.mahout.clustering.fuzzykmeans.FuzzyKMeansDriver.run(FuzzyKMeansDriver.java:295) 
     at sensei.clustering.fkmeans$eval17.invoke(fkmeans.clj:35) 
     at clojure.lang.Compiler.eval(Compiler.java:6406) 
     ... 10 more 

तरह उत्पादन हो रही है runSequential सच

पर सेट होने पर (इस blog post का हवाला देते हुए)
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 
11/09/07 14:32:32 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 
11/09/07 14:32:32 INFO compress.CodecPool: Got brand-new compressor 
11/09/07 14:32:32 INFO compress.CodecPool: Got brand-new decompressor 
Exception in thread "main" java.lang.IllegalStateException: Clusters is empty! 
     at org.apache.mahout.clustering.fuzzykmeans.FuzzyKMeansDriver.buildClustersSeq(FuzzyKMeansDriver.java:361) 
     at org.apache.mahout.clustering.fuzzykmeans.FuzzyKMeansDriver.buildClusters(FuzzyKMeansDriver.java:343) 
     at org.apache.mahout.clustering.fuzzykmeans.FuzzyKMeansDriver.run(FuzzyKMeansDriver.java:295) 
     at sensei.clustering.fkmeans$eval17.invoke(fkmeans.clj:35) 
     at clojure.lang.Compiler.eval(Compiler.java:6465) 
     at clojure.lang.Compiler.load(Compiler.java:6902) 
     at clojure.lang.Compiler.loadFile(Compiler.java:6863) 
     at clojure.main$load_script.invoke(main.clj:282) 
     at clojure.main$script_opt.invoke(main.clj:342) 
     at clojure.main$main.doInvoke(main.clj:426) 
     at clojure.lang.RestFn.invoke(RestFn.java:436) 
     at clojure.lang.Var.invoke(Var.java:409) 
     at clojure.lang.AFn.applyToHelper(AFn.java:167) 
     at clojure.lang.Var.applyTo(Var.java:518) 
     at clojure.main.main(main.java:37) 

मैंने इस फॉर्म में fkmeans स्क्रिप्ट को भी लिखा है

#!./bin/clj 

(ns sensei.clustering.fkmeans) 

(import org.apache.hadoop.conf.Configuration) 
(import org.apache.hadoop.fs.Path) 

(import org.apache.mahout.clustering.fuzzykmeans.FuzzyKMeansDriver) 
(import org.apache.mahout.common.distance.EuclideanDistanceMeasure) 
(import org.apache.mahout.clustering.kmeans.RandomSeedGenerator) 

(let [hadoop_configuration ((fn [] 
           (let [conf (new Configuration)] 
            (. conf set "fs.default.name" "hdfs://localhost:9000/") 
            conf))) 
     driver (new FuzzyKMeansDriver)] 
    (. driver setConf hadoop_configuration) 
    (. driver 
    run 
    (into-array String ["--input" "test/sensei" 
         "--output" "test/clusters" 
         "--clusters" "test/clusters/clusters-0" 
         "--clustering" 
         "--overwrite" 
         "--emitMostLikely" "false" 
         "--numClusters" "3" 
         "--maxIter" "10" 
         "--m" "5"]))) 

लेकिन अभी भी पहले प्रारंभिक संस्करण के रूप में ही त्रुटि हो रही है:/

कमांड लाइन उपकरण चलाता है ठीक

$ bin/mahout fkmeans --input test/sensei --output test/clusters --clusters test/clusters/clusters-0 --clustering --overwrite --emitMostLikely false --numClusters 10 --maxIter 10 --m 5 

यह अंक वापस नहीं होगा लेकिन जब मैं clusterdumper भले ही कोशिश - -क्स्टस्टिंग विकल्प पिछले कमांड में मौजूद है और - पॉइंट्स को यहां परिभाषित किया गया है

$ ./bin/mahout clusterdump --seqFileDir test/clusters/clusters-1 --pointsDir test/clusters/clusteredPoints --output sensei.txt 

Ma होउट संस्करण इस्तेमाल किया: 0.6-स्नैपशॉट, clojure 1.3.0-स्नैपशॉट

कृपया मुझे बताएं कि मैं कुछ भी बाहर याद आती है जाने

+1

क्या आप जांच सकते हैं, प्रारंभिक क्लस्टर वास्तव में उत्पन्न होते हैं? –

+1

इस पर अद्यतन क्या है? – AlphaMale

+1

हां, क्या यह कभी हल हो गया था? यदि ऐसा है तो आप एक उत्तर पोस्ट कर सकते हैं। –

उत्तर

2

मेरा अनुमान है फजी सी साधन के महावत कार्यान्वयन की जरूरत है कि प्रारंभिक समूहों को है साथ शुरू करें, जिसे आपने शायद आपूर्ति नहीं की थी?

यह भी थोड़ा सा लगता है जैसे आप सिंगल-नोड चला रहे हैं? ध्यान दें कि सिंगल-नोड सिस्टम के लिए आपको सभी महाउट/हाडोप ओवरहेड से बचना चाहिए और केवल नियमित क्लस्टरिंग एल्गोरिदम का उपयोग करना चाहिए। हडोप/महौत काफी लागत पर आता है जो केवल तब ही भुगतान करता है जब आप एक सिस्टम पर डेटा को संसाधित नहीं कर सकते हैं। यह "नक्शा कम नहीं" है जब तक कि आप बड़े सिस्टम की संख्या पर ऐसा न करें।