Hadoop 任意截断 256,512,1024 个字符的字符串

问题描述 投票:0回答:1

这是我的第一篇文章,对于任何混淆表示歉意。我正在尝试通过 MapReduce 运行 DNA 序列分析。以下是我的 mapper.sh 脚本的重要部分:

while read line
do
    echo "[$(date)] **$HOSTNAME** Running megacc_cr with input: $line" >> ${TMP_LOG_FILE}
    
    # Execute megacc_cr and capture the output and exit status
    result=$(./megacc_cr $line --map-reduce-bootstrap)
    status=$?

    # Trim whitespace from the result
    result=$(echo "$result" | xargs)
    # Further cleaning up the spaces,tabs, etc. from the result
    result=$(echo "$result" | tr -d '[:space:]') 
    # Log the trimmed result and status

    

    # Output the trimmed result for Hadoop to process
    if [ -n "$result" ]; then
        echo "$result 1"
    else
        echo "[$(date)] **$HOSTNAME** Empty result detected." >> ${TMP_LOG_FILE}
    fi

(我已经在shellcheck.net中检查了整个mapper.sh脚本)

主要错误点在这里:result=$(./megacc_cr $line --map-reduce-bootstrap) $line只是megacc分析的一些参数,在这种情况下$line等于“-a infer_NJ_核苷酸.mao -d SpiderA.fas”(一些与问题无关的参数)。

整个脚本执行用户指定的次数,每次运行都会执行/举例说明单个引导程序分析。当我在本地运行它时,我得到正确的输出:

命令:

结果=$(./megacc_cr_test -a infer_NJ_核苷酸.mao -d SpiderA.fas --map-reduce-bootstrap: echo "$结果 1" >> 输出.txt

输出:

(((A_californicus_GMY190,SDSUMY1467_Aliatypus_gulosus),((((Calommata_signata_MY4703,(Atypus_karschi_MY4706,(Sphodros_rufipes_MY032,Sphodros_abboti_MY026))),(((SDSUMY4589_Hexurella,Hexurella_sp_MY1104),((((((calisoga_sp_MY4085,Bymainiella_sp_MY884),Namirea_sp_MY846),euagrus_sp_MY4295),Microhexura_sp_MY4016),Thelechoris_sp_MY050),(Hypochilus_kastoni_G2519,hypochilus_sp_H595))),CJG3438_Mecicobothrium_thorelli)),(SDSUMY4026_Megahexura_fulva,megahexura_sp_MY4378)),(Hexura_picea_MY090,SDSUMY1125_Hexura_rothi))),(SDSUMY0120_Antrodiaetus_apachecus,SDSUMY4700_Antrodiaetus_roretzi),((A_hadros_MY459,SDSUMY0633_Antrodieatus_gertschi),(atypoides_sp_AR17,atypoides_sp_MY1253))); 1

((((A_californicus_GMY190,SDSUMY1467_Aliatypus_gulosus),((((Calommata_signata_MY4703,(Atypus_karschi_MY4706,(Sphodros_rufipes_MY032,Sphodros_abboti_MY026))),(((SDSUMY4589_Hexurella,Hexurella_sp_MY1104),((((((calisoga_sp_MY4085,Bymainiella_sp_MY884),euagrus_sp_MY4295),Namirea_sp_MY846),Microhexura_sp_MY4016),Thelechoris_sp_MY050),(Hypochilus_kastoni_G2519,hypochilus_sp_H595))),CJG3438_Mecicobothrium_thorelli)),(SDSUMY4026_Megahexura_fulva,megahexura_sp_MY4378)),(Hexura_picea_MY090,SDSUMY1125_Hexura_rothi))),(SDSUMY0120_Antrodiaetus_apachecus,SDSUMY4700_Antrodiaetus_roretzi)),(A_hadros_MY459,SDSUMY0633_Antrodieatus_gertschi),(atypoides_sp_AR17,atypoides_sp_MY1253)); 1

(((A_californicus_GMY190,SDSUMY1467_Aliatypus_gulosus),((((Calommata_signata_MY4703,(Atypus_karschi_MY4706,(Sphodros_rufipes_MY032,Sphodros_abboti_MY026))),(((SDSUMY4589_Hexurella,Hexurella_sp_MY1104),((((((calisoga_sp_MY4085,Bymainiella_sp_MY884),Namirea_sp_MY846),euagrus_sp_MY4295),Microhexura_sp_MY4016),Thelechoris_sp_MY050),(Hypochilus_kastoni_G2519,hypochilus_sp_H595))),CJG3438_Mecicobothrium_thorelli)),(SDSUMY4026_Megahexura_fulva,megahexura_sp_MY4378)),(Hexura_picea_MY090,SDSUMY1125_Hexura_rothi))),(SDSUMY0120_Antrodiaetus_apachecus,SDSUMY4700_Antrodiaetus_roretzi),((A_hadros_MY459,SDSUMY0633_Antrodieatus_gertschi),(atypoides_sp_AR17,atypoides_sp_MY1253))); 1

每个以 1 结尾的字符串都是一行。这些行将由reducer.sh 作为键/值对进行处理。然而,当我通过 hadoop 运行此分析时,mapper.sh 会生成如下结果:

(((A_californicus_GMY190,SDSUMY1467_Aliatypus_gulosus),((((Calommata_signata_MY4703,(Atypus_karschi_MY4706,(Sphodros_rufipes_MY032,Sphodros_abboti_MY026))),(((SDSUMY4589_Hexurella,Hexurella_sp_MY1104),((((((calisoga_sp_MY4085,Bymainiella_sp_MY884),euagrus_sp_MY4295),Namirea_sp_MY846),Microhexura_sp_MY4016),Thelechoris_sp_MY050),(Hypochilus_kastoni_G2519,hypochilus_sp_H595))),CJG3438_Mecicobothrium_thorelli)),(SDSUMY4026_Megahexura_fulva,megahexura_sp_MY4378)),(Hexura_picea_MY090,SDSUMY1125_Hexura_rothi))),( 1

SDSUMY0120_Antrodiaetus_apachecus,SDSUMY4700_Antrodiaetus_roretzi),((A_hadros_MY459,SDSUMY0633_Antrodieatus_gertschi),(atypoides_sp_AR17,atypoides_sp_MY1253))); 1

(((A_californicus_GMY190,SDSUMY1467_Aliatypus_gulosus),((((Calommata_signata_MY4703,(Atypus_karschi_MY4706,(Sphodros_rufipes_MY032,Sphodros_abboti_MY026))),(((SDSUMY4589_Hexurella,Hexurella_sp_MY1104),((((((calisoga_sp_MY4085,Bymainiella_sp_MY884),euagrus_sp_MY4295),Namirea_sp_MY846),Microhexura_sp_MY4016),Thelechoris_sp_MY050),(Hypochilus_kastoni_G2519,hypochilus_sp_H595))),CJG3438_Mecicobothrium_thorelli)),(SDSUMY4026_Megahexura_fulva,megahexura_sp_MY4378)),(Hexura_picea_MY090,SDSUMY1125_Hexura_rothi))),(SDSUMY0120_Antrodiaetus_apachecus,SDSUMY4700_Antrodiaetus_roretzi),((A_hadros_MY459,SDSUMY0633_Antrodieatus_gertschi),(atypoides_sp_AR17,atypoides_sp_MY1253))); 1

如您所见,在 Hadoop 分析中,第一行被截断为 512 个字符,第二行只是第一行的其余部分,算作自己的键。第三行处理正确。假设,如果我在 hadoop 中进行 50 个引导程序复制,其中大约 5-8 个将像这样被截断,而其他的可以超过 512 个字符并产生正确的引导程序输出。

我的问题是,当我只是通过 Hadoop 运行此分析而它在本地 Linux 计算机上生成正确的输出时,为什么会发生这种情况。有 5 个从节点,并且该错误在所有节点上不加区别、随机发生。

我还调整了mapper.sh脚本,将结果发送到执行该脚本的相应本地计算机上的文件,然后将本地计算机上的这些文件聚合到HDFS中以让reducer进行分析,并且出现相同的错误,所以hadoop如何传输newick字符串似乎不是问题。

当我使用非常大的 DNA 数据集运行此分析时,Hadoop 会不加区别地将数据截断为 1024 个字符而不是 512 个字符,但对于非常小的数据集,它似乎并不麻烦。例如,它产生了正确的输出:

((orangutan,sumatran),((homo_sapiens,(chimpanzee,bonobo)),gorilla),gibbon); 1

如果需要更多信息,请告诉我,非常感谢您的回复!

linux bash mapreduce
1个回答
0
投票

评论太多了......

假设这是 BASH 脚本,如果不是,请注明。 始终引用 shell 变量,否则会出现意外情况!

shellcheck myscript
 
Line 1:
while read line do echo "[$(date)] $HOSTNAME Running megacc_cr with input: $line" >> ${TMP_LOG_FILE}
^-- SC1073 (error): Couldn't parse this while loop. Fix to allow more checks.
                ^-- SC1010 (warning): Use semicolon or linefeed before 'do' (or quote to make it literal).
 
Line 20:
fi
  ^-- SC1058 (error): Expected 'do'.
  ^-- SC1072 (error): Expected 'do'. Fix any mentioned problems and try again.

我认为以下内容可以删除

# Trim whitespace from the result
result=$(echo "$result" | xargs)
# Further cleaning up the spaces,tabs, etc. from the result
result=$(echo "$result" | tr -d '[:space:]') 
# Log the trimmed result and status'

并通过修改初始结果分配来替换以包括删除。

result=$(./megacc_cr $line --map-reduce-bootstrap | tr -d '[:space:]')

一如既往,测试看看

这行是什么,看起来语法不正确,并且与脚本中的命令行不一致? ,编辑/删除或澄清其相关性。

“”” 结果=$(./megacc_cr_test -a infer_NJ_核苷酸.mao -d SpiderA.fas --map-reduce-bootstrap: echo "$result 1" >> 输出.txt ”””

您提到了hadoop,但没有显示任何与其使用直接相关的内容(我错过了什么吗?)

© www.soinside.com 2019 - 2024. All rights reserved.