Что лучше: отправлять много маленьких сообщений или меньше больших?
У меня есть приложение, чья детализация обмена сообщениями может быть написана двумя способами - отправка множества маленьких сообщений по сравнению с (возможно, намного) меньшими по размеру. Концептуально то, что движется, это набор "живых" идентификаторов вершин, которые могут фильтроваться на каждом супершаге на основе обработанного списка (значения вершины), которым управляют вершины. Те, кто выживает до конца, являются счастливыми победителями. compute()
рассчитывает набор новых идентификаторов входящих для меня, которые идеально подходят для исходящего сообщения, но я мог бы легко отправить каждый идентификатор по одному. Я предполагаю, что отправка меньшего количества сообщений важнее, но тогда каждый набор может содержать тысячи идентификаторов. Спасибо.
PS Дополнительный вопрос: Несколько примеров пользовательских типов сообщений, которые я нашел, являются относительно простыми объектами с несколькими примитивными переменными экземпляра, а не коллекциями. Это сумасшедший, чтобы отправить коллекцию идентификаторов в виде сообщения?
3 ответа
Я использовал списки и даже карты для отправки или просто для хранения данных вершин, так что это не проблема. Я думаю, что это не должно иметь значения для giraph, который вы хотите выбрать, и я предпочел бы пойти со многими простыми маленькими сообщениями, так как вы будете использовать Giraph соответственно. Вместо этого вам нужно будет перейти в функцию вычисления через список сообщений и для каждого сообщения через список идентификаторов.
С точки зрения производительности это не должно иметь никакого значения. Я обнаружил, что большая разница в том, чтобы попытаться как можно больше вычислить в цикле, так как переключение между циклами и синхронизация сообщений... занимает много времени. До тех пор, пока это не изменится, оно должно быть более или менее одинаковым и, вероятно, намного легче читать и поддерживать, когда вы сохраняете размер сообщений небольшим.
Кроме того, вы можете отправлять много маленьких сообщений, но пусть Giraph преобразует это в длинное (почти) автоматически. Вы можете использовать Combiners.
Документация по этому вопросу ужасна на сайте Giraph, но, возможно, вы могли бы извлечь пример из книги Практическая графическая аналитика с Apache Giraph.
Это зависит в основном от типа сообщений, которые вы отправляете.
Чтобы ответить на ваш вопрос, вам нужно понять MessageStore
интерфейс и его реализации.
Одним словом, под капотом были сделаны следующие шаги:
- Работник получает необработанный ввод сообщений и идентификаторы назначения.
- Работник сортирует сообщения и помещает их в карту карты. Ключ первой карты - это идентификатор раздела, ключ карты раздела - это идентификатор вершины. (Это похоже на почтовое отделение. Работа похожа на центральный узел, и сначала она сортирует буквы по разным почтовым индексам, а затем по каждому почтовому индексу, отсортированному по адресу).
- Когда это вершина вычисления вершины,
Iterable
сообщений этой вершины передаются в вершинуcompute
метод, и вот где вы получаете сообщения и использовать его.
Поэтому все меньше и больше сообщений лучше из-за меньшей сортировки, если общее количество байтов одинаково для обоих случаев.