假设一个sqoop作业正在将增量导入写入hdfs目录。 另一个(非sqoop)作业定期将数据从此目录移动到其他地方进行处理。 我希望这个工作不要移动目前正由sqoop修改的文件。有没有办法让准备好的文件一旦被移动就重命名为某种模式?
如果没有移动文件,sqoop是否每次都会将新内容附加到现有的part-m-000x文件中?
答案 0 :(得分:0)
了解Ambari / HDFS上传过程的工作原理。当您将文件上传到hdfs时,在上传文件" xxxx.txt" Ambari将其上传为" xxxx.txt._COPYING"。上传完成后,只需将文件重命名为正确的名称。
如果您的其他sqoop进程搜索" .txt"
,它在重命名之前无法看到它,因此已经完成并准备移动。过去完成此操作并且完美无缺。
答案 1 :(得分:0)
Sqoop在底层使用MapReduce,默认情况下M / R作业将结果存储在_temporary
子目录中:
(...)当OutputCommitter是FileOutputCommitter时,维护一个特殊的
${mapreduce.output.fileoutputformat.outputdir}/_temporary/_${taskid}
子目录,可以通过${mapreduce.task.output.dir}
访问FileSystem上的每个任务尝试,其中存储任务尝试的输出。成功完成任务尝试后,${mapreduce.output.fileoutputformat.outputdir}/_temporary/_${taskid}
(仅限)中的文件将提升为${mapreduce.output.fileoutputformat.outputdir}
。当然,框架会丢弃不成功的任务尝试的子目录。此过程对应用程序完全透明。
我刚刚执行了Sqoop导入以验证此信息,而Sqoop确实以这种方式工作。