我在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
命令上方的部分时才会出现丢失记录的问题。如果我不执行它并只移动简单文件,那么就不会丢失数据。我试图看看是否有任何特殊字符被插入,哪些可能导致丢失最后几条记录但找不到(我试图通过浏览文件来查找它们)。
答案 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
也许配置相关?