Привет, Хабр!
Представим некое перепутье, где с одной стороны — мощные возможности PostgreSQL, а с другой — необъятные просторы Hadoop. Выбор кажется сложным, но зачем выбирать одно, если можно соединить их и получить лучшее из обоих?
Объединяя их можно создать мощную систему, способную обрабатывать и анализировать огромные объемы данных.
Установим Hadoop и его компоненты HDFS и Hive
Для работы Hadoop необходимо установить Java. Нужно юзать JDK версии 8 или выше, установим 21 версию:
sudo apt-get update
sudo apt-get install openjdk-21-jdk
Hadoop требует SSH для управления удаленными демонами Hadoop:
sudo apt-get install ssh
Скачиваем последнюю версию Hadoop с официального сайта Apache и распаковываем ее:
wget https://downloads.apache.org/hadoop/common/hadoop-3.4.0./hadoop-3.4.0.tar.gz
tar -xzf hadoop-3.4.0.tar.gz
sudo mv hadoop-3.4.0. /usr/local/hadoop
Добавляем следующие строки в файл ~/.bashrc
:
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_HOME=$HADOOP_HOME
Загружаем изменения:
source ~/.bashrc
Редактируем конфигурационные файлы в директории $HADOOP_HOME/etc/hadoop
:
core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/local/hadoop/data/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/local/hadoop/data/datanode</value>
</property>
</configuration>
mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>
Делаем форматирование HDFS и запускаем Hadoop:
hdfs namenode -format
start-dfs.sh
start-yarn.sh
Проверяем работу Hadoop, открыв веб-интерфейс NameNode по адресу http://localhost:9870
.
Далее установим Hive
Скачиваем и распаковываем Hive:
wget https://downloads.apache.org/hive/hive-4.0.0/apache-hive-4.0.0-bin.tar.gz
tar -xzf apache-hive-4.0.0-bin.tar.gz
sudo mv apache-hive-4.0.0-bin /usr/local/hive
Добавляем следующие строки в файл ~/.bashrc
:
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
Загружаем изменения:
source ~/.bashrc
Создаем директории для Hive в HDFS:
hdfs dfs -mkdir /tmp
hdfs dfs -mkdir -p /user/hive/warehouse
hdfs dfs -chmod g+w /tmp
hdfs dfs -chmod g+w /user/hive/warehouse
Редактируем файл hive-site.xml
в директории $HIVE_HOME/conf
:
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=metastore_db;create=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.apache.derby.jdbc.EmbeddedDriver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
</configuration>
Устанавливаем FDW для Hadoop в PostgreSQL
Установим PostgreSQL и необходимые инструменты:
sudo apt-get install postgresql postgresql-contrib
Скачивакем и устанавливаем HDFS FDW:
git clone https://github.com/your-github/hdfs_fdw
cd hdfs_fdw
make
sudo make install
Добавляем расширение в PostgreSQL:
CREATE EXTENSION hdfs_fdw;
Теперь система готова к использованию Hadoop и Hive с PostgreSQL через FDW.
Основные функции
Создаем серверный объект в PostgreSQL для подключения к Hadoop с помощью команды CREATE SERVER
. Этот объект инкапсулирует информацию о подключении, которую использует FDW для доступа к внешним данным.
CREATE SERVER hdfs_server
FOREIGN DATA WRAPPER hdfs_fdw
OPTIONS (host '127.0.0.1', port '10000');
hdfs_server
— имя сервера, которое будет использоваться в дальнейших операциях.FOREIGN DATA WRAPPER hdfs_fdw
— указывает на используемый FDW.OPTIONS
— параметры подключения, включаяhost
иport
Hive или Spark сервера.
После создания сервера необходимо создать маппинг пользователя, который указывает учетные данные для подключения к внешнему серверу:
CREATE USER MAPPING FOR current_user
SERVER hdfs_server
OPTIONS (username 'hadoop_user', password 'hadoop_password');
FOR current_user
— указывает на текущего пользователя PostgreSQL.OPTIONS
— учетные данные для аутентификации на сервере Hadoop.
Внешние таблицы создаются с помощью команды CREATE FOREIGN TABLE
, которая определяет структуру таблицы и параметры подключения:
CREATE FOREIGN TABLE hdfs_table (
id INT,
name TEXT
)
SERVER hdfs_server
OPTIONS (dbname 'default', table_name 'hdfs_table');
hdfs_table
— имя внешней таблицы в PostgreSQL.SERVER hdfs_server
— указывает, к какому серверу подключаться.OPTIONS
— параметры, включаяdbname
иtable_name
, указывающие на базу данных и таблицу в Hive или Spark.
После настройки сервера, маппинга пользователя и создания внешних таблиц, можно выполнять запросы к внешним данным, как если бы они были локальными таблицами:
SELECT * FROM hdfs_table WHERE id > 10;
Этот запрос извлекает данные из таблицы hdfs_table
, хранящейся в Hadoop, с применением фильтрации на стороне PostgreSQL.
Push-down — это метод оптимизации запросов, при котором часть выполнения запроса передается на удаленный сервер, чтобы сократить объем передаваемых данных и повысить производительность. В Hadoop push-down тоже можно реализовать через FDW.
Для включения push-down в PostgreSQL необходимо установить соответствующие параметры в конфигурации FDW. Например, для включения push-down агрегатов:
ALTER SERVER hdfs_server OPTIONS (SET enable_aggregate_pushdown 'true');
После этого push-down будет работать на все запросы.
MapReduce — это модель программирования для обработки и генерации больших наборов данных с параллельным распределением задач. При использовании с Hive, MapReduce позволяет лучше выполнять сложные вычисления.
Например. создадим таблицу в Hive:
CREATE TABLE weblogs (
client_ip STRING,
request_date STRING,
request STRING,
response_code STRING,
bytes INT
) ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' ';
Загрузим некоторые данные в таблицу:
LOAD DATA LOCAL INPATH '/path/to/weblogs.txt' INTO TABLE weblogs;
Выполним запрос с MapReduce:
SELECT client_ip, COUNT(*) AS request_count
FROM weblogs
WHERE request_date LIKE '2021%'
GROUP BY client_ip
ORDER BY request_count DESC;
Также Hive имеет SQL-подобный язык HiveQL для взаимодействия с данными, хранящимися в HDFS.
Интеграция PostgreSQL с Hadoop позволяет объединить мощные аналитические функции PostgreSQL с возможностями хранения и обработки данных в Hadoop.
Все актуальные методы и инструменты по работе с данными и аналитикой можно освоить на онлайн-курсах OTUS: в каталоге можно посмотреть список всех программ, а в календаре — записаться на открытые уроки.