イクジニアブログ

育児 + エンジニア = イクジニア

Presto勉強会参加してきました

GWは8連休のにいやんです。こんばんわ。

 

8連休だわー!コーディングはかどるわー!って思ってたらあっという間に半分終わってましたよ。

1行もコーディングしてないよorz

 

 

さてさて、先日株式会社イプロス様で行われたPresto勉強会に参加してきました!

 

Prestoは最近使い始めたばっかりなので、SQLを書くコツとか色々知る事が出来たので気になったトピックを幾つか紹介したいと思います

 

 

・joinするときは絞ってからjoin

 joinしてから絞るとデータ全部1度prestoに持ってきてしまう。

 

・where句つけないとfullscan走るから親が死んでもつける。

 

・likeよりregexp_likeが早い

 

・with句便利

 

・大量のデータsortすると1つのworkerに集中するのでだめ絶対

 

・approx_distinctでおおまかに取りましょう

 

・window関数便利だわ〜

 

・cross joinやin(......)は遅い

 

・マルチバイトは3バイトになるので、注意よ

 

・とにかくメモリもりもりの勝利

 

などなど、他にも今後の展開予定の話などもありました。

 

今後の参考になる話が色々聞けたので、これを元に開発していきたいと思います!

 

発表された資料は以下から見ることが出来ます。

http://techblog.ipros.jp/post/117306808133/presto-at-ipros

techblog.ipros.jp

Presto 複数データソースへの接続方法

awk好きのにいやんです。こんばんわ。

 

awk使えば大抵の処理はいけますからね!簡単な処理はcutで。

 

前回ではPrestoのインストール方法を書きましたが、今回は複数のデータソースにつなぐ方法を紹介したいと思います。

 

PrestoではCatalogという単位でデータソースを追加出来ます。

 

追加出来るデータソースは

MySQL

PostgreSQL

・Hive

・Cassandra

などがあります。

 

Catalogを追加するには、etc/catalog下に

{カタログ名}.propertiesファイルを追加するだけでOK

 

例えばMySQLだったら

 

mysql.propertiesファイルを以下のように作成

vi etc/catalog/mysql.properties
# connector.name=mysql
# connection-url=jdbc:mysql://example.net:3306
# connection-user=root
# connection-password=secret

 

複数のmyqlに繋ぎたい際は

mysql1.properties,mysql2.propertiesの用にCatalog名を任意の名前に変えればOKです

 

PostgreSQLのCatalogファイルは以下のように

vi etc/catalog/postgresql.properties
# connector.name=postgresql
# connection-url=jdbc:postgresql://example.net:5432/database
# connection-user=root
# connection-password=secret

 

 

複数のCatalogが作成出来たらcliツールから

{Catalog名}.{DB名}.{テーブル名}でアクセス出来ます。

 

select * from mysql1.hogedb.moge;

 

 

MySQLPostgreSQLのjoinも出来ちゃいます

select * 
from
mysql1.hogedb.moge m
join
postgresql.pdb.moge p
on
(m.id = p.id);

 

 MySQLPostgreSQLだけでなく、Hiveや別のMySQLともjoin出来るので、ログデータとサマリーデータを分けて保管してる場合などの検索にとても便利かと。

 

また、create table文を使うとHiveに入ってるデータをMySQLに入れる事なんかも出来ますよ。

CREATE TABLE mysql1.hogedb.orders_by_date AS
SELECT orderdate, sum(totalprice) AS price
FROM hive.hdb.orders
GROUP BY orderdate

 

え?何故create table文を使うのかって?insert into 使えばいいじゃないかって?

残念ながらhiveのデータをmysqlに入れる際にinsert into文は今はまだサポートされていないっぽいです・・・

 

ここら辺は今後に期待ですね!

 

 

Presto インストール方法

Prestoの速さ、便利さに驚愕しているにいやんです。

こんばんわ。

 

Prestoとは簡単に言うと、HiveやCassandra,Mysqlなどにつなぐことが出来る高速なSQLクエリエンジンです。

 

Prestoについての概要などは以下の資料がわかりやすいと思います。

『Prestoとは何か,Prestoで何ができるか』 - トレジャーデータ(Treasure Data)公式ブログ

 

てなわけで、Prestoのインストール方法です。

 

基本的にはprestoの公式ページ参照にしていただければ、よいと思います。

https://prestodb.io/docs/current/installation/deployment.html

 

今回インストールしたprestoのバージョンは0.100です。

インストールしたサーバはCentOS(Linux)

Coodinator1台 Woker3台で作ってみました

 

0.100ではJava 8,python2.4以上が必要になるので、事前に入れておきましょう。

 

jdkは以下のコマンドでwget出来ます。

wget --no-check-certificate --no-cookies - --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45-linux-x64.tar.gz

wgetしたら適当なディレクトリに解凍してPATHを通しておきましょう

 

次にprestoの取得です。

# prestoをインストールする適当なディレクトリに移動
wget --no-check-certificate https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.100/presto-server-0.100.tar.gz

tar zxvf presto-server-0.100.tar.gz
cd presto-server-0.100

# etc ディレクトリ作成
mkdir etc

# presto data用ディレクトリ作成
# 場所はどこでも良いが,上記でインストールしたpresto-server内にするとバージョンUPが
# 大変になるので、そこには作るなと公式が言っている
mkdir -p /var/presto/data

 

各種設定ファイル作成

# node設定ファイル作成
# node.idはcoodinator,workerでそれぞれ違う任意の値に 値はなんでもよい

vi etc/node.properties
# node.environment=production
# node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
# node.data-dir=/var/presto/data

 

# jvm設定ファイル作成

vi etc/jvm.config
# -server
# -Xmx16G
# -XX:+UseConcMarkSweepGC
# -XX:+ExplicitGCInvokesConcurrent
# -XX:+AggressiveOpts
# -XX:+HeapDumpOnOutOfMemoryError
# -XX:OnOutOfMemoryError=kill -9 %p

 

# Coodinator用設定ファイル作成
# task.max-memoryの設定によって処理出来るデータ量が決まる

vi etc/config.properties
# coordinator=true
# node-scheduler.include-coordinator=false
# http-server.http.port=8080
# task.max-memory=1GB
# discovery-server.enabled=true
# discovery.uri=http://{coodinatorのサーバ名}:8080

 

# worker用設定ファイル作成
# task.max-memoryの設定によって処理出来るデータ量が決まる

vi etc/config.properties
# coordinator=false
# http-server.http.port=8080
# task.max-memory=1GB
# discovery.uri=http://{coodinatorのサーバ名}:8080

 

 

# log設定ファイル作成

vi etc/log.properties
# com.facebook.presto=INFO

 

今回はhiveにつなぐのでhive用の設定ファイル作成

mkdir etc/catalog
# hive設定ファイル作成

vi etc/catalog/hive.properties
# connector.name=hive-cdh5
# hive.metastore.uri=thrift://{hiveメタストアサーバ名}:9083
# hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml

 

ここまで出来たらcoodinator,workerの順に起動

# まずフォアグラウンドで実行してみる
bin/launcher run

# エラーなど起きなかったらバックグラウンド実行
bin/launcher start

 

次にcliツールのインストール

wget --no-check-certificate https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/0.100/presto-cli-0.100-executable.jar

mv presto-cli-0.100-executable.jar bin/presto

#実行権限付与
chmod +x bin/presto

 

cliツールから接続

bin/presto --server localhost:8080 --catalog hive

# 接続出来た!!

show tables;

# などで確認出来る。

 

次回はcliツールのさらなる使い方、複数のhiveやMysqlなどへのつなぎ方を書こうと思います。

 

mysqlとhiveのjoinなども出来ますよ!

 

参考にしたサイト

Prestoを試してみた - すだちっこのOrdinary Days

さくらVPSでのRuby on Railsインストール方法

子供の寝つけ方を日々研究しているにいやんです。こんにちわ。

ほんと赤ちゃんは寝てほしい時に寝てくれないですよね。

寝たと思っても、ベットに連れて行くとすぐ起きたりするし・・・

 

さて、さくらVPSにrbenv使ってrubyrails入れたのですが、色々と大変だったので、そのメモです。

 

railsのバージョンは4.2になります

 

rbenv,rubyインストール

# インストールに必要なディレクトリ作成

mkdir ~/local
mkdir ~/local/src
mkdir ~/local/bin

 

# gitが入ってる事確認
which git

 

# rbenvをclone

cd ~/local
git clone git://github.com/sstephenson/rbenv.git rbenv

mkdir ~/local/rbenv/plugins
cd ~/local/rbenv/plugins
git clone git://github.com/sstephenson/ruby-build.git ruby-build

 

# .bashrcに環境変数設定

vi ~/.bashrc
# export RBENV_ROOT=$HOME/local/rbenv
# export PATH=$RBENV_ROOT/bin:$HOME/local/bin:$PATH
# eval "$(rbenv init -)"

source ~/.bashrc

 

# rbenvでrubyインストール

cd ~/local

TMPDIR="${PWD}/tmp" rbenv install 2.1.4

rbenv rehash
rbenv global 2.1.4

 

# gem でbundlerインストール
gem install bundler

# sslエラーが出る場合
# 試用期間などでsslが使用出来ない場合は以下を実行
gem source --list
gem source --add http://rubygems.org/
gem source --remove https://rubygems.org/
gem source --list

 

 

rails インストール

gem install rails

 

#nokogiriあたりで以下のようなエラーが起きた

Building native extensions. This could take a while...
ERROR: Error installing rails:
ERROR: Failed to build gem native extension.

/home/yupics/local/rbenv/versions/2.1.4/bin/ruby extconf.rb
checking if the C compiler accepts ... yes
Building nokogiri using packaged libraries.
checking for gzdopen() in -lz... yes
checking for iconv... no
-----
libiconv is missing. Please locate mkmf.log to investigate how it is failing.
-----

 

# nokogiriをおまじないつけながら単体でインストールする

NOKOGIRI_USE_SYSTEM_LIBRARIES=1 gem install nokogiri --no-rdoc --no-ri

 

#さいどrailsインストール
gem install rails


# インスール出来たー!!
# ためしになにか作ってみる

rails new hogehoge

 

# sslのエラーとか出たらGemfileのhttps://rubygems.org/http://rubygems.org/へ変更

 

#だが、まだsqlite3のエラー出るので適当なディレクトリでsqliteコンパイル
wget http://www.sqlite.org/2015/sqlite-autoconf-3080803.tar.gz
tar xvf sqlite-autoconf-3080803.tar.gz
cd sqlite-autoconf-3080803
./configure --prefix=$HOME/local
make
make install

# そしてsqliteをgem
gem install sqlite3 -- --with-opt-dir=$HOME/local

#はいった!

 

こんなんで、railsのインストールはなんとか出来ました!!