Oracle Enterprise R – используем язык R в базе данных Oracle

imageЯ уже начинал рассказывать про Oracle R Enterprise, являющийся частью опции Oracle Advanced Analytics, который позволяет использовать открытую среду программирования R для корпоративных данных в СУБД Oracle. Oracle R Enterprise специально разработан, чтобы справляться с огромными массивами данных – для этого он использует масштабируемость и параллелизм СУБД Oracle, а также встроенные функции СУБД для оптимизации работы скриптов, написанных на R.

История языка R

Не хочу здесь пересказывать wikipedia, поэтому просто оставлю ссылку. Позволю себе лишь процитировать несколько фраз:

R — язык программирования для статистической обработки данных и работы с графикой, а также свободная программная среда вычислений с открытым исходным кодом в рамках проекта GNU.

Язык R в последнее время стал активно конкурировать с коммерческими статистическими пакетами такими как SAS, SPSS, Stata. В институтах его также активно преподают, что позволяет думать, что через следующее поколение математиков будет хорошо владеть этим языком.

Среди пользователей языка R такие компании как: Google, Pfizer, Merck, Bank of America, the InterContinental Hotels Group и Shell.

Ключевая особенность языка R – это его открытость, что дает возможность инженерам самостоятельно написать собственные алгоритмы. Т.е. это, по сути, framework для разработки. Еще один момент – это то, что существует огромное количество (более 1600) готовых, бесплатных пакетов для R.

Что добавляет Oracle к возможностям языка R

R – отличный язык, но у него есть ряд ограничений:

  • использует только 1 процессор
  • перед анализом считывает все данные в оперативную память клиентского компьютера

Эти ограничения не дают использовать его для анализа крупных баз данных. Oracle решает эти проблемы с помощью Oracle Enterprise R. Архитектура этого решения следующая:

image

  • Мы используем обычную среду R (например RStudio).
  • Добавляем специальный пакет Oracle R Enterprise, который прозрачно пробрасывает обработку на уровень базы данных
  • На стороне Oracle также есть несколько библиотек, который умеют запускать R внутри базы данных, также стартовать обработку на стороне сервера СУБД в отдельном движке R
  • Можно использовать возможности Oracle для доступа к внешним системам (например, другие СУБД, внешние файл или Hadoop).

Инсталляция

Для использования Oracle Enterprise Edition нам нужны:

1) СУБД Oracle Enterprise Edition 11.2:

  • 11.2.0.3
  • 11.2.0.1 или 11.2.0.2 с патчем для Bug 11678127

2) R-2.13.2 на стороне клиента и СУБД Oracle (будет использовать Oracle для запуска внешних запросов)

3) Пакеты DBI: http://cran.r-project.org/web/packages/DBI/index.html

и PNG: http://cran.r-project.org/web/packages/png/index.html

R> install.packages("DBI")
R> install.packages("png")

4) Устанавливаем переменные R_HOME (только для Windows) и R_PROFILE_USER (путь к файлу .Rprofile)
Например:
R_HOME=C:\R\R-2.13.2
R_PROFILE_USER=C:\R\Rprofile

5) Перестартовываем Oracle

6) Заполняем файл .Rprofile

options(prompt=’ORE> ‘)
options(width=132)
.First <- function()
{
   # Load Oracle R libraries.
        library(ORE)

    # Database credentials:
        user     = “ruser“
        password = “oracle“
        sid      = “orcl"
        host     = “localhost"
        cat("Connecting to ORE\n")
        cat("    User:", user, "\n")
        cat("    SID: ", sid, "\n")
        cat("    Host:", host, "\n")
        ore.connect(user, sid, host, password)
        ore.sync()
        ore.attach()
        cat("Connected.\n")
}

7) Скачать 3 пакета Oracle Enterprise R (client, supporting и server)  с сайта Oracle. Для инсталляции самих пакетов я использовал инструкцию. Не заморачивался сильно, поэтому ставил все на Windows x64, которая, кстати, не перечислена в списке поддерживаемых, но при это доступна на закачку. Странно.

8) Распаковываем ore-server-windows-x86-64-1.1.zip и инсталлируем с помощью файла install.bat. Я для этого добавил 3 переменные
set PATH=%PATH%;C:\R\R-2.13.2\bin\x64
set ORACLE_HOME=D:\app\aryndin_admin\product\11.2.0\dbhome_1
set ORACLE_SID=orcl
install.bat

9) Распаковываем ore-client-windows-1.1.zip и ore-supporting-windows-1.1, заходим в R и инсталлируем пакеты

install.packages(c("ROracle", "png"), repos = "file:///F:/distrib/ore/ore-supporting-windows-1.1",                 type = "win.binary")
install.packages("ORE", repos = "file:///F:/distrib/ore/ore-client-windows-1.1", type = "win.binary")

10) Создаем пользователей для работы с R, а также необходимые синонимы. Пример доступен в demo_user.sh или demo_user.bat. Например, вот так создаем пользователя rUser:

create user rUser identified by oracle;
grant connect,resource to rUser;
grant rqrole to rUser;
grant rqadmin to rUser;
grant execute on rqsys.rqGroupEvalImpl to rUser;

или можно запустить скрипт

@F:\distrib\ore\ore-server-windows-x86-64-1.1\rquser.sql

Простая обработка данных в Enterprise R

Данные, на которых можно посмотреть работу R найти несложно – в интернете есть множество публичных набор данных. Я взял для тестирования информацию об поздних вылетах самолетов различных авиакомпаний. Эти данные можно взять вот здесь.

http://stat-computing.org/dataexpo/2009/the-data.html

Я брал 2008 год. Для простоты я выложу его здесь в виде файла для DataPump. Для импорта создаем каталог

@orcl > connect / as sysdba
Connected.
SYS@orcl > create directory ontime_dir as ‘c:\34\’;
impdp system/oracle DIRECTORY=ontime_dir DUMPFILE=EXPDAT01.DMP

В результате получим 2 таблицы: ONLIME и ONLIME_S. Первая – это точная копия файл 2008.csv объемом 650 Мб. Вторая ONLIME_S – уменьшенная в 20 раз выборка следующим способом:

create table ontime_s as select * from ontime sample (5);

Мы сделаем простой запрос, который извлечет столбцы год, направление и информацию о задержке рейсов в Сан-Франциско, а затем эту информацию нанесем на график. Код в R буде выглядеть вот так

imagedf <- ONTIME_S[,c("YEAR","DEST","ARRDELAY")]
head(df)
df <- df[df$DEST=="SFO",]
df <- df[,c(1,3)]
head(df)
plot(df)

 

 

Немного более сложный пример с построение модели линейной регрессии, которая будет прогнозировать задержку прибытия в зависимости от расстояния и задержки отправления. Модель линейной регрессии мы строим на основе маленькой 5% таблицы:

dat <- ONTIME_S
mod.ore <- ore.lm(ARRDELAY ~ DISTANCE + DEPDELAY, data=dat)
mod.ore
summary(mod.ore)

А вот применять модель мы будем на большой табличке:

newdat <- ONTIME   
newdat <- subset(newdat,!(is.na(DISTANCE) | is.na(DEPDELAY) | is.na(ARRDELAY)))
head(newdat)
dim(newdat)

prd.ore <- predict(mod.ore, newdata=newdat)
length(prd.ore)

res.ore <- cbind(newdat, PRED = prd.ore)
head(res.ore)

Скорость работы очень высокая, поскольку все выполняется внутри СУБД. Что делает Oracle можно посмотреть в Enterprise Manager

image

Мы немного поковыряемся в том, что делает Oracle в рамках выполнения R-скриптов в следующих статьях.

А что же в обычно R

А в обычном R все крайне грустно. Моя табличка на диске в CSV-файле занимала 650 Мб. В общем-то памяти у меня 8 Гб – так что должно было влезть. Тем не менее я срубил процесс R, когда было съедено более 9 Гб. Таким образом обычный язык R не смог отработать приведенный выше пример. Это как раз то, о чем говорит Oracle – обычный Desktop R не может работать без специальных приемов на больших данных.

Я уменьшил объем данных – в результате на моем компьютере Oracle Enterprise R отработал в 4 раза быстрее, чем обычный R.

Заключение

Мы посмотрели, что такое Oracle Enterprise R – это надстройка над языком, которая позволяет использовать мощь СУБД Oracle для анализа на языке R больших объемов данных. Кроме того, Oracle Enterprise R делает возможным не выносить данные из базы данных для анализа, что очень важно для больших промышленных СУБД.

В следующих статьях я постараюсь погрузиться немного глубже, чтобы понять, насколько Oracle Enterprise R дает выигрыш на более сложных вещах.

2 Comments

    • Мне кажется, что его и на английском еще нет.
      Oracle Advanced Analytics состоит из двух частей: Oracle Data Mining и Oracle Enterprise R. Про первый курсы должны быть, про второй вряд ли.
      Надеюсь в ближайшее время появится.

Leave a Reply

Your email address will not be published. Required fields are marked *