我撰寫了一個 mapreduce 程式來決議矩陣運算“X-MN”,其中 M、N、X 是具有整數值的矩陣。為了做到這一點,我需要一個串列串列。例如:
M=[[1,2,3],[4,5,6],[7,8,9]] 表示一個 3x3 的矩陣。
在一些 tshoot 期間,我發現了以下內容:
test=[1,2]
test2=[4,5]
test.append(test2) #this works
a=test[0]
b=test[1]
c=test[2] #this also works
print(c)
output => [4,5]
所以,直到這一點,一切似乎都很好。
但是,從我下面的實際 mapper.py 程式代碼。
#!/usr/bin/env python3
import sys
row_m, col_m = map(int, sys.argv[1:])
row_n = col_m
col_n = row_m
all_matrices=list()
for line in sys.stdin:
all_matrices.append(line)
M_values=list()
N_values=list()
X_values = list()
for line in all_matrices:
elements=line.rstrip().split(", ")
index = elements[0]
row_index = elements[1]
row_values = elements[2:]
if index == "1":
M_values.append(row_values)
elif index == "2":
N_values.append(row_values)
elif index == "3":
X_values.append(row_values)
print(N_values) #this works
print(N_values[0]) #this exact command does not work and causes below errors
# and I need it in order to my logic works
#without "N_values[0]" command, above code works just fine.
基本上,到目前為止,我只從標準輸入上的輸入映射器資料中讀取資料,將其存盤在 3 個不同的串列中,當我嘗試恢復矩陣行(元素串列)時,它失敗了。
這是我的 run.sh 檔案,它執行我的映射器 python 程式。
#!/bin/bash
arg1=2
arg2=2
hadoop jar ~/hadoop-streaming-3.1.4.jar \
-D mapred.reduce.tasks=0 \
-file ./mapper.py \
-mapper "./mapper.py $arg1 $arg2" \
-input /matrices \
-output /output
矩陣檔案夾包含每個矩陣的 3 個 txt 檔案。這是我的輸入映射器資料,我確信我可以在沒有問題命令的情況下收集它,我能夠在“N_values”上看到資料
以下是錯誤:
22/09/15 18:14:13 INFO mapreduce.Job: Running job: job_1663260914490_0011
22/09/15 18:14:21 INFO mapreduce.Job: Job job_1663260914490_0011 running in uber mode : false
22/09/15 18:14:21 INFO mapreduce.Job: map 0% reduce 0%
22/09/15 18:14:32 INFO mapreduce.Job: Task Id : attempt_1663260914490_0011_m_000001_0, Status : FAILED
Error: java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 1
at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:325)
at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:538)
at org.apache.hadoop.streaming.PipeMapper.close(PipeMapper.java:130)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:61)
at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:34)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:461)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:344)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:177)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1926)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:171)
.
.
.
22/09/15 18:15:14 ERROR streaming.StreamJob: Job not successful!
Streaming Command Failed!
此外,我在 hadoop 服務器上執行我的程式以確保它不是語法問題并且它確實有效。測驗如下:矩陣 N_values 為 [[7,9],[4,2]]
[xxxx]$ cat matrix.txt | python mapper.py 2 2
[['7', '9'], ['4', '2']]
[4, 5]
['7', '9']
然后我不認為這是我的python代碼的問題。也許這是 run.sh 檔案上的命令的問題,因為我是使用 hadoop 的新手,或者我正在使用的 .jar 版本。
我希望有人可以幫助我解決這個問題。將不勝感激。
uj5u.com熱心網友回復:
好吧,我發現這里的主要問題不是代碼語法。這更像是一個代碼風格問題。據我了解,使用 map-reduce 方法的 hadoop 期望以分布式方式處理輸入資訊、mapper 輸出和 reducer 輸入資訊,因為它可能有多個 mapper 和 reducer。因此,如果日志具有誤導性,并且當我更正我的代碼以始終在需要處理時提供必要的資訊時,它實際上可以按預期作業。這是我在使用 python 撰寫一些 shell 腳本并有所作為時不習慣做的事情。希望這可以幫助其他人避免浪費時間思考為什么 hadoop 在本地運行時不喜歡我的代碼 LoL
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/521592.html
