我希望使用Hadoop解决大数据问题(sorta)。简而言之,我们有一项工作或任务涉及读取超过十亿条记录的大文件,逐行解析文件,进行一些清理并将清理后的数据写入另一个文件。我们希望有数百个这样的工作不断被创建,提交,运行。每个作业都处理自己的文件,因此我们不必担心并发问题。
我从很高的层面理解,我如何使用Hadoop来实现这一目标。但是我没有意识到的是,它的工作是将这个巨大的文件拆分成分裂,然后存储在数据节点中。我的理解下面是否正确?
JOB:
Client (has the big input file) ->
Splits the file into chunks (how do I know split size??) ->
Asks Name Node where to store data (how will the name node know how\where to allocate?)->
Name Node responds with Data Node Information ->
Client copies (using Hadoop FS) the split data to appropriate DataNodes ->
Client submits Job (gives all the relavant info, map/reduce)->
JobTracker schedules\runs it ->
DataNodes run map\reduce tasks ->
输出文件在DataNodes中创建 合并所有输出文件以供客户使用(谁这样做?)
任何帮助\评论将不胜感激
由于 凯
答案 0 :(得分:0)
在数据存储和mapreduce的整个过程中创建了两种类型的块。 1)当您向客户端提交文件并要求他存储文件时,它会将文件分成块(Hadoop v2中的默认大小为128 MB,Hadoop v1中为64 MB)。然后,客户端要求namenode提供必须存储数据的数据节点。 namenode根据数据节点的可用性和从客户端到数据节点的网络距离提供这些详细信息。 2)当您提交要在该文件上运行的作业时,该文件将分为逻辑输入分组。创建的输入拆分数等于映射器数。此分割大小不固定。它有所不同或取决于逻辑。
从hadoop v2开始,没有jobtracker或任务跟踪器的概念。当客户提交作业时,yarn控制作业的执行。
http://www.dummies.com/how-to/content/input-splits-in-hadoops-mapreduce.html
这可以帮助您了解输入分配是什么。
答案 1 :(得分:0)
当输入是文件时,hadoop通常使用 FileInputFormat 类或其子类之一。该类具有 isSplitable 方法,用于定义文件是否可拆分。并非所有文件格式都允许拆分工作(例如,GZip文件不可拆分,甚至文件也有多个块,所有这些块都需要为同一个映射器处理)。
如果文件是可拆分的Hadoop调用getSplit方法,则所有 InputFormat 实现必须实现以获取逻辑拆分列表。