Ответ
Да, я сталкивался с задачами интеграции Go-сервисов с Hadoop, в основном для доступа к данным, хранящимся в HDFS (Hadoop Distributed File System).
Go отлично подходит для написания вспомогательных утилит и сервисов-прослоек благодаря своей производительности и простоте работы с сетью. Взаимодействие Go-приложений с Hadoop обычно происходит несколькими способами:
1. Через WebHDFS REST API
Это самый простой способ, не требующий установки Hadoop-клиентов. HDFS предоставляет HTTP API для выполнения всех основных файловых операций (чтение, запись, листинг директорий и т.д.).
Я использовал стандартный пакет net/http
для отправки запросов к NameNode. Процесс чтения файла обычно двухэтапный: сначала запрос к NameNode для получения местоположения блоков данных, а затем — прямой запрос к DataNode для чтения самого файла.
// Упрощенный пример чтения файла через WebHDFS
// В реальности нужно обрабатывать редирект с NameNode на DataNode
func readFileFromHDFS(webHdfsUrl, path string) ([]byte, error) {
// Формируем URL для операции OPEN
url := fmt.Sprintf("%s/webhdfs/v1%s?op=OPEN", webHdfsUrl, path)
// Первый запрос к NameNode
resp, err := http.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
// WebHDFS вернет редирект на DataNode, где хранятся данные.
// Клиент http.Client по умолчанию сам следует редиректам.
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("failed to open file, status: %s", resp.Status)
}
return io.ReadAll(resp.Body)
}
2. С помощью нативных Go-клиентов
Для более сложных или производительных сценариев я использовал нативные библиотеки, например, colinmarc/hdfs
. Они реализуют RPC-протокол Hadoop и работают напрямую с NameNode, что эффективнее, чем HTTP API. Эти библиотеки предоставляют более удобный и типобезопасный интерфейс, похожий на стандартный пакет os
.
Типичные задачи, которые я решал:
- Сервис для загрузки данных: Go-сервис, который принимал данные по HTTP и атомарно записывал их в HDFS.
- API-шлюз: Предоставление REST API для доступа к определенным данным в HDFS для других микросервисов, которые не должны знать о деталях работы с Hadoop.
- Утилиты для миграции и обработки: Написание CLI-инструментов на Go для параллельной обработки небольших файлов в HDFS или их миграции.