- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在 hadoop 方面没有实际经验 -- 我只学了一些理论。我面临的任务是使用集群处理一个巨大的 CSV 文件(比内存大得多),我想出了以下过程。
假设 csv 文件包含 3 亿行,我将 1-1 亿行称为第 1 部分,将 101-2 亿行称为第 2 部分,将 201-3 亿行称为第 3 部分。 (这只是一个例子,因为在实践中数据必须被分割成更多的部分以便在内存中处理)
我想按以下方式将数据分发到节点上。
节点号数据获取
节点 1 只有第 1 部分
节点 2 只有第 2 部分
节点 3 只有第 3 部分
节点 4 第 1 部分和第 2 部分
节点 5 第 2 部分和第 3 部分
节点 6 第 1 部分和第 3 部分
您会看到一些节点只获取数据的一部分,而一些节点获取 2 部分数据。根据这一点,两个函数之一应用于每个节点。我了解到这可以通过 reducer 中的 if-else 语句来完成。即我的 reducer 应该是这样的
如果(节点 1,2,3)运行函数 f1(data_block)
如果(节点 4,5,6)运行函数 f2(data_blockA,data_blockB)
问题是我学过的大部分hadoop例子都不允许每个节点选择要读取哪一部分数据。数据以一种相当黑盒的方式分发到节点。有什么办法可以解决这个问题吗?附言我正在考虑依赖 Hadoop 流,因为我的主要语言是 Python,而不是 Java,所以这可能是另一个限制。
最佳答案
HDFS架构中有 block 的概念。 HDFS 使用的典型 block 大小为 64 MB。当我们将一个大文件放入 HDFS 时,它被分成 64 MB 的 block (基于 block 的默认配置),假设你有一个 1GB 的文件并且你想将该文件放入 HDFS,那么将有 1GB/64MB = 16拆分/ block ,这些 block 将分布在数据节点上。
数据拆分基于文件偏移发生。文件拆分的目标是数据的并行处理和故障转移。
根据您的集群配置,这些 block / block 将驻留在不同的 DataNode 上。每个 block 都会分配一个 block ID,NameNode 会为每个文件保留 block 的信息。
假设你有一个 128MB 的文件,你想把这个文件写到 HDFS 上。
客户端机器首先将文件拆分成 block 说 block A, block B然后客户端机器与名称节点交互并询问写入的位置 block (Block A Block B).NameNode给出可用的datanode列表给client写入数据。
然后客户端从这些列表中选择第一个数据节点并将第一个 block 写入数据节点,一旦写入过程和复制完成,数据节点将 block 复制到另一个数据节点第一个数据节点给出关于它收到的 block 的确认。然后客户端写入这数据节点的另一个 block 。 NameNode 保留有关文件及其关联 block 的信息。
当客户端发出读取数据的请求时,它会再次向 NameNode 发出请求以获取特定文件的数据位置,然后 NameNode 将有关数据的 block 信息提供给客户端。
因此您无需担心 HDFS 上的数据替换问题。
您问题的答案:
没有其他方法可以控制 hadoop 上的数据替换策略,但是如果您根据 HDFS block 大小划分文件(假设 block 大小为 64MB,您的数据大小为 63MB),那么一个文件将占用一个 block ,并且它将继续一个特定的数据节点,但数据节点将再次被 NameNode 选择。稍后您可以检查文件所在的数据节点。
但是将小文件放在 hadoop 上并不是处理 hadoop 的有效方法,因为 hadoop 旨在处理非常大的数据集,而小文件可能是 NameNode 的开销。请参阅此链接以获取 small file problem on Hadoop
以下链接有助于了解更多有关 hadoop 的信息。
http://docs.spring.io/spring-hadoop/docs/2.0.4.RELEASE/reference/html/store.html
关于python - Mapreduce:数据到节点的复杂分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30397433/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!