- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我一直在尝试 Cascading,但我看不出在编写作业时比经典的 map reduce 方法有任何优势。
Map Reduce 工作给了我更多的自由,而 Cascading 似乎设置了很多障碍。
可能会使简单的事情变得简单,但复杂的事情..我发现它们非常难
有什么我想念的吗?与经典方法相比,级联是否有明显的优势?
在什么情况下我应该选择级联而不是经典方法?有人使用它并且开心吗?
最佳答案
记住我是 Cascading 的作者......
如果 Pig 或 Hive 对您的问题有意义,我的建议是使用它们,尤其是 Pig。
但是,如果您从事数据业务,而不仅仅是浏览数据以获取见解,您会发现对于大多数问题而言,级联方法比原始 MapReduce 方法更有意义。
原始 MapReduce 的第一个障碍是在 MapReduce 中思考。琐碎的问题在 MapReduce 中很简单,但如果您可以使用更容易映射到您的问题域的模型(过滤这个、解析那个、排序那些、加入其余部分等),那么开发复杂的应用程序就会容易得多。
接下来您将意识到 Hadoop 中的一个正常工作单元由多个 MapReduce 作业组成。将作业链接在一起是一个可以解决的问题,但它不应该泄漏到您的应用程序域级代码中,它应该是隐藏和透明的。
此外,如果您必须不断地在映射器和缩减器之间移动函数,您会发现重构和创建可重用代码会更加困难。或者从映射器到之前的 reducer 以获得优化。这导致了脆性问题。
级联相信尽可能快地失败。规划器试图在 Hadoop 集群开始工作之前解决并满足所有这些字段名称之间的依赖关系。这意味着 90% 以上的问题将在您的作业在执行过程中等待发现问题的等待时间之前被发现。
您可以通过创建域对象(如 Person 或 Document)在原始 MapReduce 代码中缓解这种情况,但许多应用程序并不需要下游的所有字段。考虑一下您是否需要所有男性的平均年龄。当您只需要二进制性别和数字年龄时,您不想支付在网络中传递整个 Person 的 IO 惩罚。
借助 fail fast 语义和接收器和源的惰性绑定(bind),在 Cascading 上构建框架变得非常容易,这些框架本身创建 Cascading 流(成为许多 Hadoop MapReduce 作业)。我目前参与的一个项目每次运行都会有 100 个 MapReduce 作业,其中许多是根据正在处理的数据的反馈在运行中途创建的。搜索 Cascalog查看用于简单创建复杂流程的基于 Clojure 的框架示例。或者 Bixo用于比 Nutch 更容易定制的 Web 挖掘工具包和框架。
最后,Hadoop 永远不会单独使用,这意味着您的数据总是从某个外部来源提取并在处理后推送到另一个来源。关于 Hadoop 的肮脏 secret 是它是一个非常有效的 ETL 框架(所以听到 ETL 供应商谈论使用他们的工具将数据插入/拉出 Hadoop 是愚蠢的)。级联允许您编写独立于集成端点的操作、应用程序和单元测试,从而在一定程度上减轻了这种痛苦。级联在生产中用于加载 Membase、Memcached、Aster Data、Elastic Search、HBase、Hypertable、Cassandra 等系统(不幸的是,并非所有适配器都由其作者发布。)
如果愿意,请将您在使用该界面时遇到的问题列表发送给我。我一直在寻找更好的方法来改进 API 和文档,用户社区随时提供帮助。
关于hadoop - 有没有人发现 Cascading for Hadoop Map Reduce 有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3681494/
我不知道如何从 reducerRegister.js 中的 reducerForm.js reducer 访问 bool 值 isLoading 标志。我使用了 combineReducers() 并
我正在尝试找到一种理想的方法来更新我的状态树上的几个顶级字段,同时仍然维护拆分 reducer 。 这是我想出的一个简单的解决方案。 var state = { fileOrder: [0],
如果我们想按相同的键(第一个 reducer 的输出)分组,是否可以将 reducer 的输出直接发送到另一个 reducer 有时在链接时我发现我正在使用一个映射器来读取输入并将其复制到输出。因此想
我有一个如下所示的 reducer : const chart = combineReducers({ data, fetchProgress, fetchError,
当Map Reduce代码中有多个reduce时,它们之间没有任何形式的通信。但是,当执行诸如聚合之类的操作时,所有化简器共同产生单个最终输出。当它们之间没有通信时,聚合如何发生?是通过写入上下文吗?
我在 hive 中有一个表,我想从中获取所有数据。问题是: select * from tbl; 给我的结果与以下情况截然不同: select count(*) from tbl; 这是为什么?第二个
假设我有一个带有两个 reducer 的应用程序 - 使用 combineReducers() 组合的 tables 和 footer。 当我点击某个按钮时,将分派(dispatch)两个操作 - 一
我正在学习更深入的 redux,并且在处理高阶 reducer 时遇到一些麻烦。 我试图使用一个简单的分页示例来了解它是如何工作的。 NB:下面的代码只是 Nodejs 上下文中 redux 的一个快
我调用 RSS 提要并使用解析器对其进行解析。我收到一个数组。我现在想在最后创建一个对象,看起来像这样: { "2019-06-13": { "rates": { "usd":
我有一份学生列表,我的应用程序始终显示当时的一个学生,即 activePupil。到目前为止我有两个 reducer 。其中一个包含并默认返回所有子项的列表(以数组的形式): [ { id:
我有一个叫做 animals 的特征缩减器(切片缩减器)。我想将这些 reducer 拆分为哺乳动物、鸟类、鱼类等。这部分很简单,因为我可以简单地使用 ActionReducerMap。 现在假设哺乳
空数组上的简单reduce会抛出: 线程“main”java.lang.UnsupportedOperationException 中的异常:无法减少空的可迭代对象。 链接时同样的异常: val a
我有一些 25k 文档(原始 json 中为 4 GB)的数据,我想对其执行一些 javascript 操作,以使我的最终数据使用者 (R) 更容易访问这些数据,并且我想通过为每个更改添加一个新集合来
我只是想验证我对这些参数及其关系的理解,如果我错了请通知我。 mapreduce.reduce.shuffle.input.buffer.percent 告诉分配给 reducer 的整个洗牌阶段的内
我想将 redux 状态的值从 reducer 传递到另一个 reducer。在我的例子中,我想将 groups 的值从 groupReducer.js 中的状态传递到 scheduleReducer
所以,我有一个应用程序,它有多个 reducer ,因此有多个关联的 Action 创建者。 有一段时间,我的一个 reducer 更新了状态(由于编辑),因此,我必须确保其他 reducer 看到此
我有一个 reducer ,可以在调度操作时重新调整适当的状态。现在我定期调用 API,因此结果会一次又一次地触发操作。所以我想要的是,如果 reducer 状态已经有数据,那么另一个 reducer
当我尝试执行来自 here 的 DISTINCT reduce 时,出现错误。我已经在啤酒 sample 桶上重现了这个错误,所以这应该很容易重现。我没有在 mapreduce_errors.txt
在以下语法的简单优先级解析(分解)中,我们存在 shift-reduce 和 reduce-reduce 冲突。 X 是开始符号,X'-->$X$ 是添加规则。另外+和下符号是终结符。 X'-->$X
我需要编写一个连续调用两个reducer的Mapreduce程序。即,第一个 reducer 的输出将是第二个 reducer 的输入。我如何实现这一目标? 到目前为止我发现的内容表明我需要在我的驱动
我是一名优秀的程序员,十分优秀!