#java #scala #apache-spark #shark-sql #spark-streaming
#java #scala #apache-spark #shark-sql #spark-streaming
Вопрос:
Я создаю обработку в реальном времени для обнаружения мошеннических транзакций по карте ATM. для эффективного обнаружения мошенничества логика требует иметь дату последней транзакции по карте, сумму суммы транзакции по дням (или за последние 24 часа).)
Одним из вариантов использования является то, что если транзакция по карте за пределами родной страны длится более 30 дней с момента последней транзакции в этой стране, тогда отправьте предупреждение о возможном мошенничестве
Поэтому я попытался взглянуть на Spark streaming как на решение. Для достижения этой цели (возможно, мне не хватает идеи о функциональном программировании) ниже приведен мой код psudo
stream=ssc.receiverStream() //input receiver
s1=stream.mapToPair() // creates key with card and transaction date as value
s2=stream.reduceByKey() // applies reduce operation for last transaction date
s2.checkpoint(new Duration(1000));
s2.persist();
Здесь я сталкиваюсь с двумя проблемами
1) как использовать эту последнюю дату транзакции для дальнейшего сравнения в будущем с той же карты
2) как сохранить данные, чтобы даже при перезапуске программы диска старые значения s2 восстанавливались обратно 3) updateStateByKey
можно использовать для поддержания исторического состояния?
Я думаю, что мне не хватает ключевого момента в потоковом / функциональном программировании spark, который заключается в том, как реализовать такую логику.
Комментарии:
1. Полностью потерян в вопросе здесь, у вас возникли проблемы с сохранением данных в файл
2. @aaronman это может быть не так просто в распределенной среде с динамически меняющимися рабочими 😉
3. @om-nom-nom я просто не понимаю, в чем проблема, что касается сохранения файлов в потоковом контексте, spark позволяет сохранять файл для каждого обрабатываемого вами Dstream без особых усилий
4. Да, Ааронман, я хочу сохранить / обновить состояние и использовать его при поступлении следующей партии..
5. @aaronman если я сохраню его как файл, то как его можно использовать для следующего пакета
Ответ №1:
Если вы используете Spark Streaming, вам не следует сохранять свое состояние в файле, особенно если вы планируете запускать свое приложение 24/7. Если это не входит в ваши намерения, вам, вероятно, подойдет только приложение Spark, поскольку вы сталкиваетесь только с вычислениями больших объемов данных, а не с вычислениями по пакетам, поступающим в режиме реального времени.
Да, updateStateByKey можно использовать для поддержания состояния в различных пакетах, но у него есть особая подпись, которую вы можете увидеть в документах: http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.streaming.dstream.PairDStreamFunctions
Также persist() это просто форма кэширования, на самом деле она не сохраняет ваши данные на диске (например, в файле).
Надеюсь, что прояснил некоторые из ваших сомнений.
Комментарии:
1. Есть ли какой-либо способ удалить / сбросить состояние ключа, когда потоковая передача выполняется 24/7 .. мое приложение с течением времени отключается.. как с этим справиться?