2016-10-05 2 views
-1

Я пишу make-файл для запуска hadoop в Ubuntu. Когда команда inputs соответствует run:, она работает. Но если я переместил его ниже hdfs dfs -rm -f -r $(EXAMPLE_DIR), он провалился и отобразится сообщение об ошибке: make: inputs: Command not found. Я новичок в Ubuntu, поэтому не знаю, как исправить проблему после поиска результата, потому что эта ошибка имеет слишком много возможных причин. Файл makefile показан ниже. Я отмечаю ту часть, которая меня смущает.makefile move command сделать это не работает

EXAMPLE_DIR = /user/$(USER)/matmult-dense/ 
    INPUT_DIR = $(EXAMPLE_DIR)/input 
    OUTPUT_DIR = $(EXAMPLE_DIR)/output 
    OUTPUT_FILE = $(OUTPUT_DIR)/part-00000 
    HADOOP_VERSION = 2.6.0 
    # generally I use HADOOP_HOME, for not modifying the original makefile, I set up the HADOOP_PREFIX here 
    HADOOP_PREFIX = /usr/local/hadoop 

    TOOLLIBS_DIR=$(HADOOP_PREFIX)/share/hadoop/tools/lib/ 
    //Hi, start here 
    run: inputs 
     hdfs dfs -rm -f -r $(EXAMPLE_DIR) 
    //Hi, end here. If swap them, the error comes   
     hadoop jar $(TOOLLIBS_DIR)/hadoop-streaming-$(HADOOP_VERSION).jar \ 
      -files ./map1.py,./reduce1.py \ 
      -mapper ./map1.py \ 
      -reducer ./reduce1.py \ 
      -input $(INPUT_DIR) \ 
      -output $(OUTPUT_DIR) \ 
      -numReduceTasks 1 \ 
      -jobconf stream.num.map.output.key.fields=5 \ 
      -jobconf stream.map.output.field.separator='\t' \ 
      -jobconf mapreduce.partition.keypartitioner.options=-k1,3 
     hdfs dfs -rm $(INPUT_DIR)/file01 
     hdfs dfs -mv $(OUTPUT_FILE) $(INPUT_DIR)/file01 
     hdfs dfs -rm -f -r $(OUTPUT_DIR) 
     hadoop jar $(TOOLLIBS_DIR)/hadoop-streaming-$(HADOOP_VERSION).jar \ 
      -files ./map2.py,./reduce2.py \ 
      -mapper ./map2.py \ 
      -reducer ./reduce2.py \ 
      -input $(INPUT_DIR) \ 
      -output $(OUTPUT_DIR) \ 
      -numReduceTasks 1 \ 
      -jobconf stream.num.map.output.key.fields=2 \ 
      -jobconf stream.map.output.field.separator='\t' 
     hdfs dfs -cat $(OUTPUT_FILE) 

    directories: 
     hdfs dfs -test -e $(EXAMPLE_DIR) || hdfs dfs -mkdir $(EXAMPLE_DIR) 
     hdfs dfs -test -e $(INPUT_DIR) || hdfs dfs -mkdir $(INPUT_DIR) 
     hdfs dfs -test -e $(OUTPUT_DIR) || hdfs dfs -mkdir $(OUTPUT_DIR) 

    inputs: directories 
     hdfs dfs -test -e $(INPUT_DIR)/file01 \ 
     || hdfs dfs -put matrices $(INPUT_DIR)/file01 

    clean: 
     hdfs dfs -rm -f -r $(INPUT_DIR) 
     hdfs dfs -rm -f -r $(OUTPUT_DIR) 
     hdfs dfs -rm -r -f $(EXAMPLE_DIR) 
     hdfs dfs -rm -f matrices 

    .PHONY: run 
+0

У меня возникли проблемы с пониманием вашего вопроса. Не могли бы вы [изменить] ваш вопрос включить пример запуска make, который демонстрирует проблему, с которой вы сталкиваетесь? И убедитесь, что ваш вопрос включает версию make-файла, которая создает проблему. – Kenster

+0

@ Kenster Я бы хотел сказать, но это не связано с кодом, и у меня есть куча кода. – Anderson

ответ

0

Вы, кажется, плохо смущены тем, как работают make-файлы. Вы должны начать с симуляции, прежде чем пытаться выполнить сложные.

Если Makefile содержит правило так:

foo: bar 
    kleb 

затем foo является целевой (обычно имя файла, Make можно построить). bar - другая цель, а kleb - команда , которая должна быть выполнена оболочкой. Если вы обменяете bar и kleb, возможно, вы получите ошибку, потому что kleb, вероятно, не является целью, которую Make знает, как ее построить, а bar, вероятно, не является командой, которую оболочка знает, как ее выполнить.

+0

Но это не похоже на простую. Входы определяются в файле make, что означает, что он содержит кучу команд – Anderson

+0

@Anderson: Я подозреваю, что вы используете одно и то же имя для двух разных вещей и не можете развернуть переменную. Если вы дадите нам [минимальный полный пример] (http://stackoverflow.com/help/mcve), возможно, я могу быть более конкретным. – Beta