Spark在EMR客户端模式和集群模式下流式传输
java自定义接收器问题.
以下是问题.
当我们在EMR集群(yarn)上运行sparkCrayom的JavaCustomReceiver时,它会随机绑定一个执行器上的监听器.因此,我们所要做的就是将所有传入的流量转移到它随机选择的ip.
当执行者失败时,事情变得更糟.重新启动后,它会尝试在另一个执行器上绑定侦听器,然后再次随机选择.我们必须再次将传入流量转移到新选择的节点.
我的问题是:
1.我们不能将听众绑定到我们选择的特定执行者身上吗? (修复ip以使侦听器绑定)
如果不…
2.无论如何,我们可以通过编程方式知道它重新启动了监听器的执行器吗? (因为它选择随机节点来启动那个接收器)
最重要的是.
3.我们不能在运行驱动程序的节点上绑定侦听器吗? (在客户端模式下运行时)
FYI
我们已经尝试过优先接收的Receiver超类,但我们没有运气相同.
对此的任何帮助都非常感谢.
最佳答案 我使用Flume在同样的问题上苦苦挣扎.即使我传递了FlumeUtils.createStream我的首选位置主机名,它也尝试了每个节点运行并且除了确切的节点之外都为所有节点都失败了.如果我将0.0.0.0作为主机传递,那么它的行为与您描述的相同.它选择一个随机节点来启动接收器.
问题:
资源管理器无法决定运行接收器的首选工作节点.
解:
>确保覆盖preferredLocation
>确保使用确切的节点参考作为首选位置,如Spark+Flume Integration =>所示. “注意
主机名应与资源使用的主机名相同
集群中的管理器(Mesos,YARN或Spark Standalone),这样
资源分配可以匹配名称并启动接收器
合适的机器.“
对于我的案例FQDN,主机名不起作用. IP是解决方案.
>确保您传递的IP属于Spark Worker节点(datanode).如果传递非datanode机器的IP地址,它也会失败.
我还计划在驱动程序作为客户端运行的节点上运行但是spark将接收器推送到工作节点.如果您的客户端节点是工作节点,那么这不会成为问题.如果它不像我的情况那样客户端是一个女王(名称)节点 – 那么你应该选择一个很酷的工作节点来运行接收器:)
我希望它有所帮助.