如何在Python上逐行从sys.stdin获取前N行

时间:2016-10-21 04:05:29

标签: python hadoop mapreduce

我在为MapReduce编写减速器时遇到了一个问题。 我想获得前10行非常大的文件,我用于循环和中断。但是,break命令在hadoop上发出错误,所以我正在寻找另一种方法:

for line in fileinput.input():
    if(counter>limit):
        break

    line = line.strip()
    print (line)
    counter +=1

错误日志:

Error: java.io.IOException: subprocess exited successfully
R/W/S=6936/19/0 in:NA [rec/s] out:NA [rec/s]
minRecWrittenToEnableSkip_=9223372036854775807 HOST=null
USER=s2132211
HADOOP_USER=null
last tool output: |29670    YOU HAVE AATO|
Broken pipe
    at org.apache.hadoop.streaming.PipeReducer.reduce(PipeReducer.java:129)
    at org.apache.hadoop.mapred.ReduceTask.runOldReducer(ReduceTask.java:444)
    at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:392)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
    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:1698)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)

1 个答案:

答案 0 :(得分:0)

首先,您的示例格式不正确,或者您有逻辑错误。 print(line)counter += 1应该是INSIDE for循环。

更容易写下来的方法是:

for counter, line in enumerate(fileinput.input()):
    if(counter>limit):
        break

    line = line.strip()
    print (line)

现在,如果这不能解决问题,那么问题很少。

1)你能看到程序的任何输出(它实际上是从那个for循环中打印出来的东西吗?)

2)程序是否立即崩溃,或者在一段时间后崩溃?