在python代码中使用hadoop fs -put命令将文件从本地文件系统传输到hdfs的问题

时间:2015-10-08 06:02:14

标签: python hadoop hdfs

我在python中使用此代码,它从文件中读取记录,对它们进行一些处理,然后将结果写入新文件。然后我将文件从本地文件系统传输到hdfs:

read = open('file_read.txt', 'r')

for line in read:
    fields = line.split('|')
    columns.append(fields)

category = [-1,1,2,3,4,5,6]
out = open('file_write.txt', 'w')

for line in columns:
    out.write('{0}|{1}|{2}|{3}'.format(line[0], line[1], line[5], line[6].rstrip().replace('-','')))
    for val in category:
        if int(line[4]) == val:
            out.write('|{0}'.format(line[2]))
        else:
            out.write('|')
    for val in category:
        if int(line[4]) == val:
            out.write('|{0}'.format(line[3]))
        else:
            out.write('|')
    out.write('\n')
str = "HADOOP_USER_NAME=hdfs hadoop fs -put file_write.txt /folder1/folder2/"
result = system(str)

问题是在传输过程中,最后几条记录中的一些记录丢失了。移动到hdfs的文件比我本地文件系统上的文件少了10个记录。我也尝试了-moveFromLocal,但同样的结果发生了。虽然如果我从终端执行上述命令中的任何一个,那么完成文件会被移动但是当我从python脚本中执行它时,问题就出现了。

为什么会出现这个问题,我该怎么做才能解决它?

更新:只有在执行hadoop fs - put命令上方的部分时才会出现丢失记录的问题。如果我不执行它并只移动简单文件,那么就不会丢失数据。我试图看看是否有任何特殊字符被插入,哪些可能导致丢失最后几条记录但找不到(我试图通过浏览文件来查找它们)。

1 个答案:

答案 0 :(得分:0)

我无法重现这个问题。

$ < /dev/urandom tr -dc "\n [:alnum:]" | head -c10000000 > test.txt
$ cat python_hdfs.py 
from os import system

str = "HADOOP_USER_NAME=hdfs hadoop fs -put test.txt /tmp/"
print system(str)
$ cat test.txt | wc -l
155682
$ python python_hdfs.py 
0
$ hadoop fs -cat /tmp/test.txt | wc -l
155682

也许配置相关?

  • 系统的退出状态是0吗?你在Linux或Windows上吗?
  • 文件有多大?它只发生在这个特定的文件或其他文件中吗?