オラクる。

oracle専門ブログにしてみようかな~っと

2015年12月

今回はhadoopのhiveとhdfs、そしてsparkを連携させてみます。

[hdspark@node01 ~]$ hive



Logging initialized using configuration in jar:file:/opt/hive/lib/hive-common-1.2.1.jar!/hive-log4j.properties

hive> use mydb;
OK
Time taken: 0.075 seconds
hive> SELECT COUNT(*) FROM uryo;



30240
Time taken: 5.134 seconds, Fetched: 1 row(s)


hiveの項で作成したuryoテーブルを利用します。

hive> INSERT OVERWRITE DIRECTORY '/output/'
    > SELECT text,time,SUM(uryo) FROM uryo GROUP BY text,time ORDER BY text,time;



Time taken: 5.683 seconds


SELCT集計結果をhdfs上のファイルに出力します。

[hdspark@node01 ~]$ hadoop fs -ls -R /output/
-rwxr-xr-x   1 hdspark supergroup     302257 2015-12-22 00:43 /output/000000_0

[hdspark@node01 ~]$ hadoop fs -cat /output/000000_0 | more
一里塚橋00:0070
一里塚橋00:1070
一里塚橋00:2070
一里塚橋00:3070




出力された結果をhadoop上から確認しました。

[hdspark@node01 ~]$ hadoop fs -mv /output/000000_0 /output/hive_output
[hdspark@node01 ~]$ hadoop fs -ls -R /output
-rwxr-xr-x   1 hdspark supergroup     302257 2015-12-22 00:43 /output/hive_output

今度はspark上から確認してみます。

[hdspark@node01 ~]$ /opt/spark/bin/spark-shell
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Using Spark's repl log4j profile: org/apache/spark/log4j-defaults-repl.properties
To adjust logging level use sc.setLogLevel("INFO")
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.5.1
      /_/

Using Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_65)
Type in expressions to have them evaluated.
Type :help for more information.




sparkコンソールに入ります。

scala> val hive_output = sc.textFile("hdfs://127.0.0.1:9000/output/hive_output")
hive_output: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[3] at textFile at <console>:21

scala> hive_output.count()
res1: Long = 15120


hdfs上のファイルを参照し行数をカウント

scala> hive_output.filter(line => line.contains("渋谷")).foreach(println)
渋谷橋00:0030
渋谷橋00:1030
渋谷橋00:2030
渋谷橋00:3029
渋谷橋00:4030
渋谷橋00:5028




scala> hive_output.filter(line => line.contains("渋谷")).map(line => line.split(001")).map(parts => (parts(0), parts(2).toInt)).reduceByKey(_ + _,1).foreach(println)
(渋谷橋,4189)

sparkのフィルタ機能、集計機能を利用してみました。
結果は良好です。

sparkはhadoopのmap reduceに代わると言われている、scalaの分散処理を行なうためのフレームワークです。
今回、sparkとscalaをインストールして、hdfsの領域を参照する手順を確認してみます。

[root@node01 opt]# wget http://www.scala-lang.org/files/archive/scala-2.12.0-M3.tgz
--2015-12-20 01:16:09--  http://www.scala-lang.org/files/archive/scala-2.12.0-M3.tgz
www.scala-lang.org をDNSに問いあわせています... 128.178.154.159
www.scala-lang.org|128.178.154.159|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 20935936 (20M) [application/x-gzip]
`scala-2.12.0-M3.tgz' に保存中

100%[======================================>] 20,935,936  52.4K/s 時間 7m 18s

2015-12-20 01:23:28 (46.7 KB/s) - `scala-2.12.0-M3.tgz' へ保存完了 [20935936/20935936]

[root@node01 opt]# tar zxvf scala-2.12.0-M3.tgz
[root@node01 opt]# chown -R hdspark:hdspark scala-2.12.0-M3
[root@node01 opt]# ln -sv scala-2.12.0-M3 scala


まずは言語のscalaのバイナリをダウンロード
展開して、所有権の変更、バイナリのリンクを行ないます。

[root@node01 opt]# wget http://archive.apache.org/dist/spark/spark-1.5.1/spark-1.5.1-bin-hadoop2.6.tgz
--2015-12-20 01:28:17--  http://archive.apache.org/dist/spark/spark-1.5.1/spark-1.5.1-bin-hadoop2.6.tgz
archive.apache.org をDNSに問いあわせています... 192.87.106.229, 140.211.11.131, 2001:610:1:80bc:192:87:106:229
archive.apache.org|192.87.106.229|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 280901736 (268M) [application/x-tar]
`spark-1.5.1-bin-hadoop2.6.tgz' に保存中

100%[======================================>] 280,901,736  173K/s 時間 45m 8s

2015-12-20 02:13:27 (101 KB/s) - `spark-1.5.1-bin-hadoop2.6.tgz' へ保存完了 [280901736/280901736]

[root@node01 opt]# tar xvf spark-1.5.1-bin-hadoop2.6.tgz
[root@node01 opt]# chown hdspark:hdspark spark-1.5.1-bin-hadoop2.6
[root@node01 opt]# ln -sv spark-1.5.1-bin-hadoop2.6 spark


同じようにフレームワークのsparkをダウンロード
展開、所有権の変更、バイナリのリンクを行ないます。

[root@node01 opt]# su - hdspark
[hdspark@node01 ~]$ vi .bash_profile



export SCALA_HOME=/opt/scala
export SPARK_HOME=/opt/spark
export PATH=$SCALA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH

[hdspark@node01 ~]$ source .bash_profile


hadoopの実行ユーザーにsuして、環境変数を追記します。
SCALA_HOME、SPARK_HOMEの行を追加、新しいPATHを追加しています。

[hdspark@node01 ~]$ cd $SPARK_HOME
[hdspark@node01 spark]$ ./bin/spark-shell
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Using Spark's repl log4j profile: org/apache/spark/log4j-defaults-repl.properties
To adjust logging level use sc.setLogLevel("INFO")
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.5.1
      /_/

Using Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_65)
Type in expressions to have them evaluated.
Type :help for more information.
15/12/21 00:36:29 WARN MetricsSystem: Using default name DAGScheduler for source because spark.app.id is not set.
Spark context available as sc.
15/12/21 00:36:34 WARN General: Plugin (Bundle) "org.datanucleus.store.rdbms" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/opt/spark/lib/datanucleus-rdbms-3.2.9.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/opt/spark-1.5.1-bin-hadoop2.6/lib/datanucleus-rdbms-3.2.9.jar."
15/12/21 00:36:34 WARN General: Plugin (Bundle) "org.datanucleus.api.jdo" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/opt/spark/lib/datanucleus-api-jdo-3.2.6.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/opt/spark-1.5.1-bin-hadoop2.6/lib/datanucleus-api-jdo-3.2.6.jar."
15/12/21 00:36:34 WARN General: Plugin (Bundle) "org.datanucleus" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/opt/spark/lib/datanucleus-core-3.2.10.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/opt/spark-1.5.1-bin-hadoop2.6/lib/datanucleus-core-3.2.10.jar."
15/12/21 00:36:34 WARN Connection: BoneCP specified but not present in CLASSPATH (or one of dependencies)
15/12/21 00:36:34 WARN Connection: BoneCP specified but not present in CLASSPATH (or one of dependencies)
15/12/21 00:36:40 WARN ObjectStore: Version information not found in metastore. hive.metastore.schema.verification is not enabled so recording the schema version 1.2.0
15/12/21 00:36:41 WARN ObjectStore: Failed to get database default, returning NoSuchObjectException
15/12/21 00:36:44 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
15/12/21 00:36:44 WARN General: Plugin (Bundle) "org.datanucleus.store.rdbms" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/opt/spark/lib/datanucleus-rdbms-3.2.9.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/opt/spark-1.5.1-bin-hadoop2.6/lib/datanucleus-rdbms-3.2.9.jar."
15/12/21 00:36:44 WARN General: Plugin (Bundle) "org.datanucleus.api.jdo" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/opt/spark/lib/datanucleus-api-jdo-3.2.6.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/opt/spark-1.5.1-bin-hadoop2.6/lib/datanucleus-api-jdo-3.2.6.jar."
15/12/21 00:36:44 WARN General: Plugin (Bundle) "org.datanucleus" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/opt/spark/lib/datanucleus-core-3.2.10.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/opt/spark-1.5.1-bin-hadoop2.6/lib/datanucleus-core-3.2.10.jar."
15/12/21 00:36:44 WARN Connection: BoneCP specified but not present in CLASSPATH (or one of dependencies)
15/12/21 00:36:44 WARN Connection: BoneCP specified but not present in CLASSPATH (or one of dependencies)
15/12/21 00:36:50 WARN ObjectStore: Version information not found in metastore. hive.metastore.schema.verification is not enabled so recording the schema version 1.2.0
15/12/21 00:36:50 WARN ObjectStore: Failed to get database default, returning NoSuchObjectException
SQL context available as sqlContext.


インストールが終わったので、早速sparkのshellにログインします。

scala> val txtFile = sc.textFile("README.md")
txtFile: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[1] at textFile at <console>:21

scala> txtFile.count()
res0: Long = 98


通常のファイルシステム上にあるテキストファイルを読み込み
行数をカウントしています。

scala> val txtFile = sc.textFile("hdfs://127.0.0.1:9000/output/part-r-00000")
txtFile: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[3] at textFile at <console>:21

scala> txtFile.count()
res1: Long = 4


hdfs上にあるファイルを読み込み
行数をカウントしています。
特に問題ありません。

hiveを利用して、データベースの作成、データの挿入、検索を行なってみます。
RDBのように通常のSQLが利用できます。

[hdspark@node01 ~]$ hive

Logging initialized using configuration in jar:file:/opt/hive/lib/hive-common-1.2.1.jar!/hive-log4j.properties
hive> create database mydb;
OK
Time taken: 1.786 seconds
hive> use mydb;
OK
Time taken: 1.277 seconds
hive> create table uryo (time string,text string,uryo int) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
OK
Time taken: 0.683 seconds

hive> desc uryo;
OK
time                    string
text                    string
uryo                    int
Time taken: 0.116 seconds, Fetched: 3 row(s)


まずはデータベースを作成し、uryoというテーブルを作成します。

hive> LOAD DATA LOCAL INPATH "/tmp/Tokyo_Suii_20151215.csv" INTO TABLE uryo;
Loading data to table mydb.uryo
Table mydb.uryo stats: [numFiles=1, totalSize=248952]
OK
Time taken: 2.431 seconds


東京都水防災総合情報システム
http://www.kasen-suibo.metro.tokyo.jp/im/other/tsim0110g.html

こちらからダウンロードできるCSVを作成したテーブルにロードしました。

hive> SELECT text,sum(uryo) FROM uryo WHERE text LIKE "新%" GROUP BY text order y text;
Query ID = hdspark_20151218010651_89554c13-68ab-4cd8-b321-38cda9d34918
Total jobs = 2
Launching Job 1 out of 2
Number of reduce tasks not specified. Estimated from input data size: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
  set mapreduce.job.reduces=<number>
Job running in-process (local Hadoop)
2015-12-18 01:06:53,902 Stage-1 map = 100%,  reduce = 100%
Ended Job = job_local1762820536_0001
Launching Job 2 out of 2
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
  set mapreduce.job.reduces=<number>
Job running in-process (local Hadoop)
2015-12-18 01:06:55,285 Stage-2 map = 100%,  reduce = 100%
Ended Job = job_local1968841378_0002
MapReduce Jobs Launched:
Stage-Stage-1:  HDFS Read: 596976 HDFS Write: 596976 SUCCESS
Stage-Stage-2:  HDFS Read: 596976 HDFS Write: 596976 SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
新橋戸橋        4896
新河岸橋        49109
新田橋  10517
新鶴見橋        7488
Time taken: 4.113 seconds, Fetched: 4 row(s)


SELECTや集計関数、LIKE句も利用できます。

hive> SELECT COUNT(*) FROM uryo;



OK
30240
Time taken: 4.848 seconds, Fetched: 1 row(s)

hive> SELECT CONCAT(SUBSTR(time,1,2),':00') AS hour,SUM(uryo)
    > FROM uryo
    > WHERE text LIKE '渋谷%'
    > GROUP BY CONCAT(SUBSTR(time,1,2),':00') ORDER BY hour;



00:00   177
01:00   174
02:00   173
03:00   169
04:00   173
05:00   173
06:00   168
07:00   173
08:00   178
09:00   180
10:00   180
11:00   180
12:00   180
13:00   180
14:00   180
15:00   180
16:00   155
17:00   142
18:00   175
19:00   180
20:00   180
21:00   179
22:00   180
23:00   180
Time taken: 6.688 seconds, Fetched: 24 row(s)


様々なSQL文を実行しています。
最後のSQL文は時間ごとの雨量の合計を集計関数を利用して算出しています。

日曜日は渋谷のオイスターバーに行ってきました
店名は「スパイラル」
井の頭線の神泉駅が最寄り駅だけど、渋谷駅からも全然歩けます。

さて、店内は明るく、店員は若い人が多くて、声も大きくてハッキリとした感じです。
そして、店員の返事は必ず「イエス!」
何でこういう返事にしたかは謎です(^_^;)

ここのメニューの中心はもちろん牡蠣!
牡蠣以外のメニューもあるけど、やはり牡蠣のメニューが充実しています。
そして、各地の牡蠣が味わえるのも、とても楽しい
今日は牡蠣づくしで言ってみましょう!!

20151213_092554367_iOS

まずは、牡蠣のお任せ4種盛り
各地の牡蠣から4種類を店員が選んでくれるというもの
食べ方、味の特徴を店員がレクチャーしてくれます
それぞれの微妙な味の違いを感じるのも楽しいです

20151213_095521496_iOS

牡蠣のペペロンチーノ
見たこともない野菜が色々と入っていて、健康にも良さそうな一品

20151213_101355220_iOS

牡蠣の香草パン粉焼き
牡蠣が美味しいのはもちろんのことだけど、まわりのパン粉も美味しくなっている
牡蠣の濃厚なエキスをパン粉が優しく包み込んでいます

20151213_102217615_iOS

アロスメロッソという、見た目はリゾットだけど、汁が多めでお粥にも近い感じ
味噌と牡蠣の濃厚な組み合わせがベストコンビです
少し固めなご飯との相性も抜群

店員の対応もよく、料理も美味しい
また、いいお店に出会うことが出来ました

スパイラル
夜総合点★★★★ 4.0

関連ランキング:オイスターバー | 神泉駅渋谷駅駒場東大前駅

hadoop環境にhiveをインストールしてみます。
hiveはhadoop上のデータをRDBのようにSQLで扱えるツールです。

[root@node01 ~]# wget http://ftp.tsukuba.wide.ad.jp/software/apache/hive/hive-1.2.1/apache-hive-1.2.1-bin.tar.gz
--2015-12-15 00:52:08--  http://ftp.tsukuba.wide.ad.jp/software/apache/hive/hive-1.2.1/apache-hive-1.2.1-bin.tar.gz
ftp.tsukuba.wide.ad.jp をDNSに問いあわせています... 203.178.132.80, 2001:200:0:7c06::9393
ftp.tsukuba.wide.ad.jp|203.178.132.80|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 92834839 (89M) [application/x-gzip]
`apache-hive-1.2.1-bin.tar.gz' に保存中

100%[======================================>] 92,834,839  9.59M/s 時間 8.8s

2015-12-15 00:52:17 (10.0 MB/s) - `apache-hive-1.2.1-bin.tar.gz' へ保存完了 [92834839/92834839]

[root@node01 ~]# tar -xzvf apache-hive-1.2.1-bin.tar.gz
[root@node01 ~]# mv apache-hive-1.2.1-bin/* /opt/hive/
[root@node01 hive]# chown -R hdspark:hdspark /opt/hive/


バイナリファイルをwgetでダウンロード
tarで展開後、全てのファイルを任意のプログラムディレクトリに移動します。
今回は仮に/opt/hiveというプログラムディレクトリに移動しています。
また、プログラムディレクトリの所有者をhadoop実行ユーザーに変更しています。

[root@node01 hive]# su - hdspark
[hdspark@node01 ~]$ vi .bash_profile



export HIVE_HOME=/opt/hive
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH

[hdspark@node01 ~]$ source .bash_profile


hadoop実行ユーザーにsuし、環境変数を編集します。
新しくhive_homeという環境変数を作成しています。

[hdspark@node01 conf]$ cd /opt/hive/
[hdspark@node01 hive]$ mkdir logs
[hdspark@node01 hive]$ cd conf/
[hdspark@node01 conf]$ cp -p hive-log4j.properties.template log4j.properties
[hdspark@node01 conf]$ vi log4j.properties



hive.log.dir=$HIVE_HOME/logs


新しくログフォルダを作成し、ログの出力先に設定します。

[hdspark@node01 conf]$ cp -p hive-env.sh.template hive-env.sh
[hdspark@node01 conf]$ chmod 755 hive-env.sh
[hdspark@node01 conf]$ cp -p hive-exec-log4j.properties.template hive-exec-log4j.properties
[hdspark@node01 conf]$ cp -p hive-default.xml.template hive-default.xml


その他設定ファイルもテンプレートからコピーします。

[hdspark@node01 ~]$ hive

hive> show databases;
OK
default
Time taken: 0.521 seconds, Fetched: 1 row(s)


早速、hiveを実行し、接続できることを確認しました。

このページのトップヘ