makefile move命令使它不起作用

时间:2016-10-05 23:00:25

标签: makefile

我写了一个makefile来在Ubuntu中运行hadoop。当inputs命令跟随run:时,它可以正常工作。但是,如果我将其移至hdfs dfs -rm -f -r $(EXAMPLE_DIR)的下方,则会失败并显示错误消息: make: inputs: Command not found.我是Ubuntu的新手,所以我不知道如何在搜索结果后解决问题,因为这个错误有太多可能的原因。 makefile如下所示。我标记了让我困惑的部分。

   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 

1 个答案:

答案 0 :(得分:0)

您似乎对makefile的工作方式感到困惑。在尝试复杂的之前,你必须从simoke开始。

如果makefile包含规则,请执行以下操作:

foo: bar
    kleb

然后foo目标(通常是Make可以构建的文件的名称)。 bar是另一个目标,kleb命令,由shell执行。如果你交换barkleb,你可能会收到错误,因为kleb可能不是Make知道如何构建的目标,而bar可能不是命令shell知道如何执行。