かざん

徒然に

Centosを日本語環境にする

忘れやすいのでメモとして残しておく

やりたいこと

  • 言語をja_JP.UTF-8にする
  • 時刻を日本時刻にする

環境

[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

# デフォルトの言語設定
[root@localhost ~]# echo $LANG
en_US.UTF-8


# デフォルトのタイムゾーン
[root@localhost ~]# echo $LANG
ja_JP.UTF-8
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@localhost ~]# timedatectl status
      Local time: Thu 2019-06-20 14:33:38 UTC
  Universal time: Thu 2019-06-20 14:33:38 UTC
        RTC time: Mon 2019-06-17 03:51:34
       Time zone: UTC (UTC, +0000)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

言語をja_JP.UTF-8にする

日本語パッケージをインストール

yum -y install ibus-kkc vlgothic-*

文字セットを変更

[root@dlp ~]# localectl set-locale LANG=ja_JP.UTF-8
[root@dlp ~]# source /etc/locale.conf 
[root@dlp ~]# echo $LANG 
ja_JP.UTF-8

時刻を日本時刻にする

[root@localhost ~]#  timedatectl set-timezone Asia/Tokyo
[root@localhost ~]# timedatectl status
      Local time: Thu 2019-06-20 23:34:27 JST
  Universal time: Thu 2019-06-20 14:34:27 UTC
        RTC time: Mon 2019-06-17 03:52:23
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

参考

CentOS 7 : 日本語環境にする : Server World タイムゾーンを日本時間(JST)に変更する CentOS 7, 6 – CentOSサーバ構築術 文具堂

splitコマンドを使って標準出力の内容を分割してgzip圧縮

SQLなどで得たcsv形式の出力など、出力内容を一定の行数ごとに分割し、それぞれをgzip圧縮して保存する方法を試したのでその備忘録

やりたいこと

例: SQL(純粋なSELECT *など)の実行結果を500レコードごとに分割

レコード1
レコード2
レコード3
......      ==> ファイル1.csv.gz
レコード500
---------------------
レコード501
レコード502
レコード503
......      ==> ファイル2.csv.gz
レコード1000
---------------------
レコード1001
レコード1002
レコード1003
......      ==> ファイル3.csv.gz
レコード1500

参考

linuxcommand.net

orebibou.com

www.server-memo.net

使用するコマンド

split

書式

  • ファイルを分割: split オプション 分割元ファイル 分割後ファイル名
  • パイプで送られてきた標準入力を分割: command | split オプション - 分割後ファイル名
    • 標準入力から受け取っている場合、ファイル名を指定する箇所に「-」を指定してやる必要がある
  • 分割後のファイル名を指定しないと'x'というプレフィックスのファイルとなる

gzip

ファイルを圧縮する

前準備

1000行のサンプルファイルを作成。こいつをcatした時の出力をqueryの標準出力とみたてる

[vagrant@localhost split_test]$ for i in `seq 1 1000`
> do
>   echo ${i},${i},${i} >> sample.csv
> done
[vagrant@localhost split_test]$ wc -l sample.csv
1000 sample.csv
[vagrant@localhost split_test]$ head sample.csv && tail sample.csv
1,1,1
2,2,2
3,3,3
4,4,4
5,5,5
6,6,6
7,7,7
8,8,8
9,9,9
10,10,10
991,991,991
992,992,992
993,993,993
994,994,994
995,995,995
996,996,996
997,997,997
998,998,998
999,999,999
1000,1000,1000

やってみた

やりたいこと

1,1,1
2,2,2
......      ==> split_dump_file_part00.csv.gz
500,500,500
---------------------
501,501,501
502,502,502
......      ==> split_dump_file_part01.csv.gz
1000,1000,1000

使用するsplitコマンドのオプション

  • -l: 指定した行単位で分割
  • --additional-suffix: 指定した文字列をサフィックスとして追加
  • --filter: 分割した内容に対して個別にコマンドを実行
    • 個別のファイルの名前は${FILE}で得る
  • -d: 分割後ファイル名に付与される文字を英字ではなく数字にする(00から開始、デフォはaaから開始)

実行

[vagrant@localhost split_test]$ cat sample.csv | split -l 500 --additional-suffix=.csv --filter='gzip > ${FILE}.gz' - split_dump_file_part -d

確認

[vagrant@localhost split_test]$ ls split_dump_file_part*
split_dump_file_part00.csv.gz  split_dump_file_part01.csv.gz
[vagrant@localhost split_test]$ zcat split_dump_file_part* | wc -l
1000
[vagrant@localhost split_test]$ zcat split_dump_file_part* | head
1,1,1
2,2,2
3,3,3
4,4,4
5,5,5
6,6,6
7,7,7
8,8,8
9,9,9
10,10,10
[vagrant@localhost split_test]$ zcat split_dump_file_part* | tail
991,991,991
992,992,992
993,993,993
994,994,994
995,995,995
996,996,996
997,997,997
998,998,998
999,999,999
1000,1000,1000

SkitchとMojaveのショートカットキーがバッティングする

タイトルの通り。
スクリーンショットした画像を即座に加工できる利点があるので、長らくSkitchを愛用しているのだが、その中で一番多用しているショートカットコマンド「十時スナップショット(cmd+shift+5)」が、
macOS Mojaveで新たに拡張されたスクリーンショットのショートカットコマンドとバッティングしてしまったので解決方法をメモ

解決方法はいたって簡単で、
「システム環境設定 -> キーボード -> ショートカット -> スクリーンショット」という順で移動していって、
「cmd+shift+5」のチェックを外せばおうけい

f:id:okuya-KAZAN:20190314001620p:plain

Vagrantを使ってChefのSever/Client環境を構築

Vagrantを使ってChefのSever/Client環境を構築したのでその備忘録 (1年くらいまえにやったことなので、多少情報が古い可能性がある...)

概要

やったこと

Vagrantを使って以下4つのVMを立てて、ChefのSever/Client環境を構築した - Chef Server - Chef Client01 - Chef Client02 - Chef Client03 VMのOSはCent OS7.2

Chefの構成

Workstation:Chef ServerへCookbookをアップロードしたり設定変更を行う環境 - 今回は手元のMacBookを使用 Chef Server:Chefの設定ファイルを管理するサーバー Chef Client:Chefによって管理されているサーバー - 厳密に言えばこの文章で述べているClientはNodeのことを指している

仕組み

WorkstationからChef ServerにCook Bookアップロード WorkstationからChef Client起動 Chef ClientがChef ServerからCookbookを取り込む

参考にさせていただいた記事

Chef client-server入門 <男は黙ってChef client-server> - Qiita Vagrantで作った環境にChef12 でChef Serverをためしてみた · GitHub https://qiita.com/brighton0725/items/cc363e9400d133c0f9e8j

Workstation(ローカル環境)の事前準備

chefdkのインストール

https://downloads.chef.io/chefdk こちらのダウンロードページからOS X を選択してdmgファイルをダウンロード。 ダウンロードしたdmgファイルを起動させ、指定の通りにNextボタンを押してインストールを完了させる インストールが完了したら以下のコマンドで確認

$ chef --version
Chef Development Kit Version: 3.3.23
chef-client version: 14.5.33
delivery version: master (6862f27aba89109a9630f0b6c6798efec56b4efe)
berks version: 7.0.6
kitchen version: 1.23.2
inspec version: 2.2.112

作業ディレクトリを作成しVagrant環境構築

$ mkdir chef-server-client
$ cd $_

下記サイトからBOXのURLをコピーしてくる - http://www.vagrantbox.es/

$ vagrant box add centos72 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box
$ vagrant init centos72

起動時に自動でVMにChef Solo及びChef Clientをインストールしてくれるvagrant-omnibusをインストール

vagrant plugin install vagrant-omnibus

Vagrantfile編集

以下Vagrantfileの中身

$script = <<EOF
  sudo yum update -y
  sudo yum install -y wget ntp openssl-devel
  sudo ntpdate ntp.nict.jp
  sudo rpm -Uvh https://packages.chef.io/files/stable/chef-server/12.17.33/el/7/chef-server-core-12.17.33-1.el7.x86_64.rpm
EOF

$client_script = <<EOF
  sudo yum update -y
  sudo yum install -y ntp openssl-devel
  sudo ntpdate ntp.nict.jp
  curl -L https://www.chef.io/chef/install.sh | sudo bash
  sudo bash -c "echo '192.168.33.12 chef-server' >> /etc/hosts"
EOF

Vagrant.configure("2") do |config|

  config.omnibus.chef_version = :latest

  config.vm.define :chef_server do |host|
    host.vm.box = "centos/7"
    host.vm.hostname = 'chef-server'
    host.vm.network :private_network, ip: '192.168.33.12'
    host.vm.provision :shell, :inline => $script
  end

  config.vm.define :chef_client01 do |host|
    host.vm.box = "centos/7"
    host.vm.hostname = 'chef-client'
    host.vm.network :private_network, ip: '192.168.33.13'
    host.vm.provision :shell, :inline => $client_script
  end

  config.vm.define :chef_client02 do |host|
    host.vm.box = "centos/7"
    host.vm.hostname = 'chef-client'
    host.vm.network :private_network, ip: '192.168.33.14'
    host.vm.provision :shell, :inline => $client_script
  end

  config.vm.define :chef_client03 do |host|
    host.vm.box = "centos/7"
    host.vm.hostname = 'chef-client'
    host.vm.network :private_network, ip: '192.168.33.15'
    host.vm.provision :shell, :inline => $client_script
  end

end

Chef Serverの構築

$ vagrant up chef_server
$ vagrant ssh chef_server

以下Chef Server上での作業

#Chef Serverの初期構成
$ sudo chef-server-ctl reconfigure

#Web UI をインストール
$ sudo chef-server-ctl install opscode-manage
$ sudo opscode-manage-ctl reconfigure
$ sudo chef-server-ctl reconfigure

#test実行
$ sudo chef-server-ctl test

Web UI のインストールに成功すると、https://192.168.33.12 にアクセスできるようになる 後述するWorkstation側でhosts の設定をしていると https://chef-server/ でもアクセスできる

ユーザー, organization作成

用途 - ユーザ: Web UIのログインに必要 - 組織: Chef Server内を論理分割するのに必要 今回作成したユーザ、組織 - ユーザ名: kazan - 組織名: pokoya 組織名、ユーザ名に特に深い意味はない

ユーザー登録

$ chef-server-ctl user-create USER_NAME FIRST_NAME LAST_NAME EMAIL 'PASSWORD' --filename FILE_NAMEで作成

$ sudo chef-server-ctl user-create kazan admin admin xxxxxxx@gmail.com 'XXXXXX' --filename kazan.pem

organization登録

鍵は ORGANIZATION-validator.pem となる

$ sudo chef-server-ctl org-create pokoya "pokoya org" --association_user kazan --filename /etc/opscode/pokoya/pokoya-validator.pem

確認

$ sudo chef-server-ctl user-list
kazan
pivotal
$ sudo chef-server-ctl org-list
pokoya
$ ls
kazan.pem  pokoya-validator.pem

WebUI(https://192.168.33.12)でログインできるか確認 f:id:okuya-KAZAN:20181021232357p:plain f:id:okuya-KAZAN:20181021232358p:plain f:id:okuya-KAZAN:20181021232400p:plain

Workstationでの準備

$ sudo vim /etc/hosts
# 以下追記
192.168.33.12 chef-server

workstation内のChef-repoとChef Serverを紐付けるにはChef-repoの.chef以下に以下のファイルが必要 - knife.rb - ORGANIZATION-validator.pem - USER.pem

まだChefサーバとの接続確認はとれない

$ knife ssl check
WARNING: No knife configuration file found. See https://docs.chef.io/config_rb_knife.html for details.
Connecting to host localhost:443
ERROR: Network Error: Connection refused - connect(2) for "localhost" port 443
Check your knife configuration and network settings

.chef/knife.rb の設定

$ cd chef-server-cleient
$ mkdir .chef

WebUIに接続(https://192.168.33.12)し、「Generate Knife Config」を押して、knife.rbをダウンロード f:id:okuya-KAZAN:20181021231555p:plain

ダウンロードしてきたknife.rbを.chef以下に配置

$ cp ~/Downloads/knife.rb ./.chef/
$ cat .chef/knife.rb
# See https://docs.getchef.com/config_rb_knife.html for more information on knife configuration options
current_dir = File.dirname(__FILE__)
log_level                :info
log_location             STDOUT
node_name                "kazan"
client_key               "#{current_dir}/kazan.pem"
chef_server_url          "https://chef-server/organizations/pokoya"
cookbook_path            ["#{current_dir}/../cookbooks"]

Workstationに鍵を転送

USER.pem, ORGANIZATION-validator.pemをServerからコピーしてきて.chef以下に配置

# USER.pem
$ scp -o stricthostkeychecking=no vagrant@192.168.33.12:/home/vagrant/kazan.pem .chef/kazan.pem

# ORGANIZATION-validator.pem
$ scp -o stricthostkeychecking=no vagrant@192.168.33.12:/home/vagrant/pokoya-validator.pem .chef/pokoya-validator.pem

コピーしたファイルのパーミッションは 600に変更

$ sudo chmod 600 .chef/*pem

証明書もってくる

knife.rb で設定したChef Serverの自己証明書を信頼する設定コマンドknife ssl fetchを実行する 設定は knife.rb が参照できるよう作業ディレクトリ配下で実行

$ knife ssl fetch -s https://chef-server/organizations/pokoya

確認

.chef以下に必要なファイルの用意ができたことで、Chefサーバーとの接続確認がknifeコマンドを通して可能になる sslで通信ができるかチェック

$ knife ssl check
Connecting to host chef-server:443
Successfully verified certificates from `chef-server'

確認

$ ls -l .chef
-rw-------  1 okuyamatakashi  staff  1678 10 21 21:45 kazan.pem
-rw-r--r--@ 1 okuyamatakashi  staff   415 10 21 21:42 knife.rb
-rw-------  1 okuyamatakashi  staff  1678 10 21 21:47 pokoya-validator.pem
drwxr-xr-x  3 okuyamatakashi  staff   102 10 21 21:51 trusted_certs

$ knife user list # ユーザ名確認
kazan

$ knife client list # 組織名確認
pokoya-validator

$ knife node list
# 出力なし

Chef Clientの準備

Chef Serverとの認証は鍵認証を使う 鍵認証のやり方の1つに、Chef ServerはClientごとに秘密鍵を発行し、公開鍵を自身(Chef Server)に登録する方法がある だが、clientごとに発行するのは手間なので、Chef Serverにあらかじめ用意されているvalidator keyを使う ClientがChef Serverとの通信の際にvalidator keyを使うことで、Chef Serverにclientとして登録され、以降の認証に必要な鍵が発行される - これは最初の1回目にだけ利用される

$ vagrant up chef_client01
$ vagrant ssh-config chef_client01 --host chef-client01 >> ~/.ssh/config
$ vagrant up chef_client02
$ vagrant ssh-config chef_client02 --host chef-client02 >> ~/.ssh/config
$ vagrant up chef_client03
$ vagrant ssh-config chef_client03 --host chef-client03 >> ~/.ssh/config

Workstation上でnodeの登録

knife bootstrap NodeのIPアドレス -x username --sudoで登録できる

$ knife bootstrap chef-client01 -x vagrant -P vagrant --sudo
$ knife bootstrap chef-client02 -x vagrant -P vagrant --sudo
$ knife bootstrap chef-client03 -x vagrant -P vagrant --sudo

Nodeの名前を指定したい場合(例: chef-client01-DBnode)

$ knife bootstrap 192.168.33.13 --ssh-user vagrant --ssh-password 'vagrant' --sudo --use-sudo-password --node-name chef-client01-DBnode

確認

nodeの確認

$ knife node list
chef-client01
chef-client02
chef-client03

Clientの確認

$ knife client list
chef-client01
chef-client02
chef-client03
pokoya-validator

今後

今回作成したWorkstationの作業ディレクトリをChef-repoとしてレシピを作成してノードに適用していく 今回はそのための土台作り

Vagrantを使ってMac上にHiveの実行環境構築

前回Macにたてた仮想マシン上でHadoopの擬似分散環境を構築したので、今回はさらにHiveが使えるようにしていく。

参考

[1]VagrantでCDH擬似分散環境構築 - Qiita
[2]Setup a Single-node Hadoop machine using CDH5 and HUE – Part 5

VM起動、接続

起動するVM前回の記事でHadoopの擬似分散環境を構築したcdh-trainというホスト名のVM

$ vagrant up
$ vagrant ssh

手順

ファイルディスクリプタ:数の上限を増やす
[root@cdh-train ~]# vim /etc/security/limits.conf
# /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
Hiveとmetastore関連パッケージのインストール
[root@cdh-train ~]# yum install hive
[root@cdh-train ~]# yum install hive-metastore mysql-server mysql-connector-java
hiveユーザができていることを確認
[root@cdh-train ~]# hdfs dfs -ls /user
~ 中略 ~
drwxrwxrwx   - hive    supergroup          0 2018-09-17 04:48 /user/hive
~ 中略 ~
hive metastoreをmysqlに設定([2])

複数のHiveユーザで1つのHadoopクラスタを共用しようとしている場合、Hiveが使用するディレクトリを全てのユーザから書き込み可能にする必要がある 以下のコマンドで、使用するディレクトリを作成し、パーミッションを適切に設定

[root@cdh-train ~]# sudo -u hive hdfs dfs -mkdir /user/hive/warehouse
[root@cdh-train ~]# sudo -u hive hdfs dfs -chmod 1777 /user/hive/warehouse
[root@cdh-train ~]# cp /usr/share/java/mysql-connector-java.jar /usr/lib/hive/lib/.
[root@cdh-train ~]# service mysqld start
[root@cdh-train ~]# chkconfig mysqld on
[root@cdh-train ~]# /usr/bin/mysql_secure_installation
[root@cdh-train ~]# cd /usr/lib/hive/scripts/metastore/upgrade/mysql
[root@cdh-train mysql]# mysql -u root -p
mysql> create database metastore;
mysql> use metastore;
mysql> source hive-schema-1.1.0.mysql.sql;
mysql> create user 'hive'@'localhost' identified by 'mypassword';
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'hive'@'localhost';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,LOCK TABLES,EXECUTE ON metastore.* TO 'hive'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> quit;
/usr/lib/hive/conf/hive-site.xmlの編集

変更箇所(4箇所)

<property>
<name>javax.jdo.option.ConnectionURL</name>
<!--<value>jdbc:derby:;databaseName=/var/lib/hive/metastore/metastore_db;create=true</value>-->
<value>jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=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>-->
<value>com.mysql.jdbc.Driver</value>
</property>

<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>

<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>mypassword</value>
</property>

</configuration>
hive-server2のインストール
yum install hive-server2
spark関連のインストール

[root@cdh-train ~]# yum install spark-core && \ [root@cdh-train ~]# yum install spark-master && \ [root@cdh-train ~]# yum install spark-worker && \ [root@cdh-train ~]# yum install spark-history-server && \ [root@cdh-train ~]# yum install spark-python

HBase,Mahout,Hueのインストール

[root@cdh-train ~]# yum install hbase [root@cdh-train ~]# yum install mahout [root@cdh-train ~]# yum install hue

Vagrantfileを編集し、ポートフォワード設定

Vagrantfile

#HDFS namenode
config.vm.network "forwarded_port", guest: 50070, host: 50070
#HDFS datanode
config.vm.network "forwarded_port", guest: 50075, host: 50075

#YARN ResourceManager
config.vm.network "forwarded_port", guest: 8088, host: 8088
#YARN NodeManager
config.vm.network "forwarded_port", guest: 8042, host: 8042
# もしかしてこっち?config.vm.network "forwarded_port", guest: 50060, host: 50060
#JobHistory
config.vm.network "forwarded_port", guest: 19888, host: 19888

## Spark Master, Worker, Driver, HistoryServer
config.vm.network "forwarded_port", guest: 8080, host: 8080
config.vm.network "forwarded_port", guest: 8081, host: 8081
config.vm.network "forwarded_port", guest: 4040, host: 4040
config.vm.network "forwarded_port", guest: 18080, host: 18080

実際にHive使ってみる

Beelineを使ってみる
[root@cdh-train ~]# beeline
Beeline version 1.1.0-cdh5.15.1 by Apache Hive
beeline> !connect jdbc:hive2://localhost:10000/
scan complete in 6ms
Connecting to jdbc:hive2://localhost:10000/
Enter username for jdbc:hive2://localhost:10000/: <- Enter
Enter password for jdbc:hive2://localhost:10000/: <- Enter
Connected to: Apache Hive (version 1.1.0-cdh5.15.1)
Driver: Hive JDBC (version 1.1.0-cdh5.15.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ

0: jdbc:hive2://localhost:10000/> create database test;

0: jdbc:hive2://localhost:10000/> show databases;
INFO  : Compiling command(queryId=hive_20180925092727_ebd569f2-8196-4a3c-98b1-f4f63ae283f7): show databases
INFO  : Semantic Analysis Completed
INFO  : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:database_name, type:string, comment:from deserializer)], properties:null)
INFO  : Completed compiling command(queryId=hive_20180925092727_ebd569f2-8196-4a3c-98b1-f4f63ae283f7); Time taken: 0.492 seconds
INFO  : Concurrency mode is disabled, not creating a lock manager
INFO  : Executing command(queryId=hive_20180925092727_ebd569f2-8196-4a3c-98b1-f4f63ae283f7): show databases
INFO  : Starting task [Stage-0:DDL] in serial mode
INFO  : Completed executing command(queryId=hive_20180925092727_ebd569f2-8196-4a3c-98b1-f4f63ae283f7); Time taken: 0.069 seconds
INFO  : OK
+----------------+--+
| database_name  |
+----------------+--+
| default        |
| test           |
+----------------+--+
2 rows selected (0.858 seconds)
データロードしてみる

以下のようなタブ区切りでレコードが記述されたデータ(sample.txt)を用意 左から西暦、気温、品質コードを表すこととする

1950 0   1
1950    22  1
1950    -22 2
1950    -11 1
1950    -13 2
1949    35  1
1949    111 2
1949    111 2
1949    13  1

テーブル作成

jdbc:hive2://localhost:10000/> create table records(year STRING,temperature INT,quality INT)ROW FORMAT DELIMITEDfields terminated by '\t';

jdbc:hive2://localhost:10000/> show tables in test;
~ 中略 ~
+-----------+--+
| tab_name  |
+-----------+--+
| records   |
+-----------+--+
1 row selected (0.155 seconds)

データのロード sample.txtは/vagrantディrクトリ直下に置いておく

jdbc:hive2://localhost:10000/> load data local inpath '/vagrant/sample.txt' overwrite into table records;

このコマンドを実行するとHiveは指定されたローカルファイルをHiveの保管用ディレクトリに保存する ファイルはそのままのフォーマットで保存され、Hiveが手を入れることはない なお、Hiveの保管用ディレクトリはHDFSに設定している(fs.default.name) 確認

[root@cdh-train ~]# sudo -u hive hdfs dfs -ls warehouse/test.db/records
Found 1 items
-rwxrwxrwt   1 anonymous supergroup         51 2018-09-25 09:36 warehouse/test.db/records/sample.txt

無事できている では、実際にデータを引っ張ってくるクエリを叩いてみる

jdbc:hive2://localhost:10000/> select year, MAX(temperature)
. . . . . . . . . . . . . . . . > from records
. . . . . . . . . . . . . . . . > where temperature != 9999
. . . . . . . . . . . . . . . . > and quality = 1
. . . . . . . . . . . . . . . . > group by year;
~ 中略 ~
+-------+------+--+
| year  | _c1  |
+-------+------+--+
| 1949  | 35  |
| 1950  | 22   |
+-------+------+--+
2 rows selected (80.498 seconds)

VMホストcdh-trainの現状

前回の記事と今回の記事で構築したVMHDFSの階層を確認する

[root@cdh-train ~]# hdfs dfs -ls /user
Found 8 items
drwxr-xr-x   - hdfs    supergroup          0 2018-09-17 11:50 /user/hdfs
drwxr-xr-x   - mapred  supergroup          0 2018-09-17 04:48 /user/history
drwxrwxrwx   - hive    supergroup          0 2018-09-19 14:35 /user/hive
drwxrwxrwx   - hue     supergroup          0 2018-09-17 04:49 /user/hue
drwxrwxrwx   - jenkins supergroup          0 2018-09-17 04:48 /user/jenkins
drwxrwxrwx   - oozie   supergroup          0 2018-09-17 04:49 /user/oozie
drwxrwxrwx   - root    supergroup          0 2018-09-17 04:48 /user/root
drwxr-xr-x   - hdfs    supergroup          0 2018-09-17 04:50 /user/spark
[root@cdh-train ~]# hdfs dfs -ls /user/hdfs
Found 3 items
drwxr-xr-x   - hdfs supergroup          0 2018-09-17 08:21 /user/hdfs/input
drwxr-xr-x   - hdfs supergroup          0 2018-09-17 10:53 /user/hdfs/output
drwxr-xr-x   - hdfs supergroup          0 2018-09-17 11:50 /user/hdfs/output_wc
[root@cdh-train ~]# hdfs dfs -ls /user/hive
Found 1 items
drwxrwxrwt   - hive supergroup          0 2018-09-19 15:25 /user/hive/warehouse

Vagrantを使ってMac上にHadoop擬似分散環境を構築

Mac上にVagrant仮想マシンを立て、そこでHadoopの擬似分散モードを試す環境を構築したので、その備忘録

参考

[1]VagrantでCDH擬似分散環境構築 - Qiita
[2]Macのローカル環境でhadoopを1から勉強する - Qiita
[3]bash 起動時の環境ファイルについて調べてみた - Qiita
[4]2017.03.21 CDH5で擬似分散モードのHadoopクラスタを構築する - hellosungbum’s diary

VM起動、接続

Vagrantに関しては以下の記事で扱っている
Vagrantを使ってMac上に仮想マシン(VM)を立ち上げる - かざん技術ブログ

仮想マシンを立ち上げ、早速接続(CentOsのバージョンは6.2)

$ vagrant up
$ vagrant ssh

※以下、VM上での作業

不要サービス無効化

ローカルからSSHする際に邪魔になりそうなのでfirewallを切ったり

[vagrant@cdh-train ~]$ sudo service iptables stop
[vagrant@cdh-train ~]$ sudo chkconfig iscsi off
[vagrant@cdh-train ~]$ sudo chkconfig iscsid off
[vagrant@cdh-train ~]$ sudo chkconfig iptables off
[vagrant@cdh-train ~]$ sudo chkconfig ip6tables off
[vagrant@cdh-train ~]$ sudo chkconfig mdmonitor off
[vagrant@cdh-train ~]$ sudo chkconfig netfs off
[vagrant@cdh-train ~]$ sudo chkconfig nfslock off
[vagrant@cdh-train ~]$ sudo chkconfig postfix off
[vagrant@cdh-train ~]$ sudo chkconfig udev-post off

wgetをインストール

[vagrant@cdh-train ~]$ sudo yum install wget

JDKインストール

前準備(ローカル上にて)

下記サイトからrpmファイルおとしてくる

今回落としたのは"jdk-8u181-linux-x64.rpm"
ローカル上の、仮想マシンと同期しているディレクトリに、落としてきたrpmファイルを配置

インストール
[vagrant@cdh-train vagrant]$ sudo su -
[root@cdh-train ~]# cd /vagrant
[root@cdh-train ~]# chmod 777 jdk-8u181-linux-x64.rpm
[root@cdh-train ~]# rpm -ivh jdk-8u181-linux-x64.rpm
確認
[root@cdh-train ~]# java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
パス通す

$PATH に値を追加する場合、システムグローバルに適用する場合は /etc/profile.d/ 配下にファイルを追加、個人毎の適用の場合は ~/.bashrc(bash_profile)に追記するのが良さそう
ログイン時、profile.shの中に入っている.shファイルが全て実行されるので、そこで環境変数が代入される

[root@cdh-train ~]# echo "export JAVA_HOME=/usr/java/default" > /etc/profile.d/jdk.sh
[root@cdh-train ~]# source /etc/profile.d/jdk.sh
[root@cdh-train ~]# exit

CDH5をインストール

今回は直接リポジトリを追加

[vagrant@cdh-train ~]$ wget http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/cloudera-cdh5.repo
[vagrant@cdh-train ~]$ sudo mv cloudera-cdh5.repo /etc/yum.repos.d/

RPMをダウンロードするやり方(今回やってない)

# 鍵を追加
[vagrant@cdh-train ~]$ sudo rpm --import http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera
[vagrant@cdh-train ~]$ wget http://archive.cloudera.com/cdh5/one-click-install/redhat/6/x86_64/cloudera-cdh-5-0.x86_64.rpm
[vagrant@cdh-train ~]$ yum -y --nogpgcheck localinstall cloudera-cdh-5-0.x86_64.rpm
[vagrant@cdh-train ~]$ yum clean all

擬似分散モードの設定のHadoopをインストール

インストール

擬似分散環境用の設定ファイルhadoop-conf-pseudoをインストール
依存関係のあるモジュールも自動でインストールされるため、HDFSやYARNも含まれる
インストールすることで自動的にhdfsユーザ、mapredユーザが作られる

[vagrant@cdh-train ~]$ sudo yum install hadoop-conf-pseudo
確認
[vagrant@cdh-train ~]$ sudo yum list installed | grep hadoop
hadoop.x86_64                        2.6.0+cdh5.15.1+2822-1.cdh5.15.1.p0.4.el6
hadoop-0.20-mapreduce.x86_64         2.6.0+cdh5.15.1+2822-1.cdh5.15.1.p0.4.el6
hadoop-client.x86_64                 2.6.0+cdh5.15.1+2822-1.cdh5.15.1.p0.4.el6
hadoop-conf-pseudo.x86_64            2.6.0+cdh5.15.1+2822-1.cdh5.15.1.p0.4.el6
hadoop-hdfs.x86_64                   2.6.0+cdh5.15.1+2822-1.cdh5.15.1.p0.4.el6
hadoop-hdfs-datanode.x86_64          2.6.0+cdh5.15.1+2822-1.cdh5.15.1.p0.4.el6
hadoop-hdfs-namenode.x86_64          2.6.0+cdh5.15.1+2822-1.cdh5.15.1.p0.4.el6
hadoop-hdfs-secondarynamenode.x86_64 2.6.0+cdh5.15.1+2822-1.cdh5.15.1.p0.4.el6
hadoop-mapreduce.x86_64              2.6.0+cdh5.15.1+2822-1.cdh5.15.1.p0.4.el6
hadoop-mapreduce-historyserver.x86_64
hadoop-yarn.x86_64                   2.6.0+cdh5.15.1+2822-1.cdh5.15.1.p0.4.el6
hadoop-yarn-nodemanager.x86_64       2.6.0+cdh5.15.1+2822-1.cdh5.15.1.p0.4.el6
hadoop-yarn-resourcemanager.x86_64   2.6.0+cdh5.15.1+2822-1.cdh5.15.1.p0.4.el6

[vagrant@cdh-train ~]$ hadoop version
Hadoop 2.6.0-cdh5.15.1
Subversion http://github.com/cloudera/hadoop -r 2d822203265a2827554b84cbb46c69b86ccca149
Compiled by jenkins on 2018-08-09T16:23Z
Compiled with protoc 2.5.0
From source with checksum 96bc735f7d923171f18968309fa3c477
This command was run using /usr/lib/hadoop/hadoop-common-2.6.0-cdh5.15.1.jar

HDFSフォーマット

注意点はhdfsユーザで実行するところ

[vagrant@cdh-train ~]$ sudo su -
[root@cdh-train ~]# sudo -u hdfs hdfs namenode -format

各デーモン起動

[root@cdh-train ~]# for x in `cd /etc/init.d ; ls hadoop-hdfs-*` ; do sudo service $x start ; done

HDFSに必要なディレクトリの作成

たくさんのファイルが出来上がっていたのでログも残していく

[root@cdh-train ~]# sudo /usr/lib/hadoop/libexec/init-hdfs.sh
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /tmp'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -chmod -R 1777 /tmp'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /var'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /var/log'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -chmod -R 1775 /var/log'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -chown yarn:mapred /var/log'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /tmp/hadoop-yarn'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -chown -R mapred:mapred /tmp/hadoop-yarn'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /tmp/hadoop-yarn/staging/history/done_intermediate'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -chown -R mapred:mapred /tmp/hadoop-yarn/staging'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -chmod -R 1777 /tmp'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /var/log/hadoop-yarn/apps'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -chmod -R 1777 /var/log/hadoop-yarn/apps'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -chown yarn:mapred /var/log/hadoop-yarn/apps'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /hbase'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -chown hbase /hbase'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /benchmarks'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -chmod -R 777 /benchmarks'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /user'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /user/history'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -chown mapred /user/history'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /user/jenkins'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -chmod -R 777 /user/jenkins'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -chown jenkins /user/jenkins'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /user/hive'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -chmod -R 777 /user/hive'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -chown hive /user/hive'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /user/root'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -chmod -R 777 /user/root'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -chown root /user/root'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /user/hue'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -chmod -R 777 /user/hue'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -chown hue /user/hue'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /user/oozie'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /user/oozie/share'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /user/oozie/share/lib'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /user/oozie/share/lib/hive'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /user/oozie/share/lib/mapreduce-streaming'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /user/oozie/share/lib/distcp'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /user/oozie/share/lib/pig'
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -mkdir -p /user/oozie/share/lib/sqoop'
+ ls '/usr/lib/hive/lib/*.jar'
+ ls /usr/lib/hadoop-mapreduce/hadoop-streaming-2.6.0-cdh5.15.1.jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar
+ su -s /bin/bash hdfs -c '/usr/bin/hadoop fs -put /usr/lib/hadoop-mapreduce/hadoop-streaming*.jar /user/oozie/share/lib/mapreduce-streaming'
作成されたディレクトリの確認
[root@cdh-train ~]# sudo -u hdfs hdfs dfs -ls -R /

YARNの起動

sudo service hadoop-yarn-resourcemanager start && \
sudo service hadoop-yarn-nodemanager start && \
sudo service hadoop-mapreduce-historyserver start

サンプルプログラムの実行(Word Count)

HDFSユーザに変更
sudo su - hdfs
データを作成し、HDFS上に配置
-bash-4.1$ echo "hoge fuga bar foo hoge fuga" > wordcount.txt
-bash-4.1$ hdfs dfs -mkdir -p /user/hdfs/input
-bash-4.1$ hdfs dfs -put wordcount.txt /user/hdfs/input
-bash-4.1$ hdfs dfs -cat /user/hdfs/input/wordcount.txt
hoge fuga bar foo hoge fuga
実行
-bash-4.1$ hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar wordcount /user/hdfs/input/wordcount.txt /user/hdfs/output_wc
-bash-4.1$ hdfs dfs -text /user/hdfs/output_wc/*
bar 1
foo 1
fuga    2
hoge    2

Vagrantfileの編集

ブラウザから管理画面をみるための設定

#HDFS
config.vm.network "forwarded_port", guest: 50070, host: 50070
#ResourceManager
config.vm.network "forwarded_port", guest: 8088, host: 8088
#NodeManager
config.vm.network "forwarded_port", guest: 8042, host: 8042
#JobHistory
config.vm.network "forwarded_port", guest: 19888, host: 19888

こうすることで、今まで以下のようにアドレスを指定していた管理画面が

以下のように接続できる

問題

JobHistoryのポート、アドレスが違うのか、接続できない...

Vagrantを使ってMac上に仮想マシン(VM)を立ち上げる

仮想マシンMacなどから立ち上げるツールであるVagrantの備忘録。 なお、今回はVirtual Boxw使って仮想環境を構築していく。

参考

https://dotinstall.com/lessons/basic_vagrant

【Vagrantドキュメント意訳】09.プロビジョニング - Qiita

Vagrantの便利機能メモ - Qiita

virtualbox,Vagrantのインストール

Home Brewを使ったインストール
$ brew cask install virtualbox
$ brew cask install vagrant
サイトからインストール

f:id:okuya-KAZAN:20180924223715p:plain

立てたいOSのBOXを取得

使えるvagrant boxのコマンド確認
vagrant box -h
Usage: vagrant box <subcommand> [<args>]

Available subcommands:
     add
     list
     outdated
     prune
     remove
     repackage
     update

For help on any individual subcommand run `vagrant box <subcommand> -h`
例として今回はCentOS6.4とCentOS7を落とす

まだboxはない

$ vagrant box list
There are no installed boxes! Use `vagrant box add` to add some.

URLを指定してCentOS6.4を取得

$ vagrant box add centos64 https://github.com/2creatives/vagrant-centos/releases/download/v6.4.2/centos64-x86_64-20140116.box

URLを指定してCentOS7.2を取得 - VirtualBoxを使っているのでproviderは3を選択

$ vagrant box add centos72 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box

確認

vagrant box list
centos72 (virtualbox, 0)
centos64  (virtualbox, 0)

仮想マシン初期化

1つのboxから複数の仮想マシンを作成することができる 仮想マシンごとにディレクトリを作成

$ mkdir centos62 && cd $_
$ vagrant init centos62

Vagrantfileができている

$ ls
Vagrantfile

仮想マシンの操作

Vagrantfileがあるフォルダでvagrant [コマンド] - halt, up - シャットダウン、起動 - status - 起動中か確認
- suspend、resume - 一旦停止、再起動 - reload - 再起動 - destroy - 仮想マシン全てを削除

仮想マシンに接続、抜け出す

接続
vagrant ssh

または

ssh vagrant@127.0.0.1 -p 2222

@127.0.0.1は立ち上げ時にログで出力される

抜け出す

仮想マシン上で

[vagrant@vagrant-centos64 ~]$ exit

データの同期

仮想マシンの/vagrantディレクトリと作成したローカル上のディレクトリは同期している

$ vagrant ssh

[vagrant@vagrant-centos64 ~]$ cd /vagrant
[vagrant@vagrant-centos64 vagrant]$ ls
Vagrantfile
[vagrant@vagrant-centos64 vagrant]$ touch hoge.txt
[vagrant@vagrant-centos64 vagrant]$ exit
$ ls
Vagrantfile hoge.txt

自作のBOXを作る

パッケージ作成
centos64_v2 $ vagrant package
==> default: Attempting graceful shutdown of VM...
==> default: Clearing any previously set forwarded ports...
==> default: Exporting VM...
==> default: Compressing package to: /Users/okuyamatakashi/workspace/vagrant/centos64_v2/package.box

package.boxができている

centos64_v2 $ ls
Vagrantfile  package.box  provision.sh
パッケージをもとにBox(my_box)作成
centos64_v2 $ vagrant box add my_box package.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'my_box' (v0) for provider:
    box: Unpacking necessary files from: file:///Users/okuyamatakashi/workspace/vagrant/centos64_v2/package.box
==> box: Successfully added box 'my_box' (v0) for 'virtualbox'!

Boxができたか確認

centos64_v2 $ ls ~/.vagrant.d/boxes
centos-VAGRANTSLASH-7 centos64               my_box

確認できたのでpackage.boxはもういらない

centos64_v2 $ rm package.box

my_boxを基にVMを立てる & 起動

$ mkdir myBox && cd $_
$ vagrant init my_box

sahara

sandboxが作れるplugin「sahara」を使ってバージョン管理を行う

saharaをインストール

$ vagrant plugin install sahara

他に使えるpluginのコマンド確認したい場合

$ vagrant plugin -h
Usage: vagrant plugin <command> [<args>]

Available subcommands:
     expunge
     install
     license
     list
     repair
     uninstall
     update

For help on any individual command run `vagrant plugin COMMAND -h`

$ vagrant plugin list
sahara (0.0.17, global)

sandboxモードオン - 今後のVMの変更が気にくわなかったらrollback - 気に入ったらcommit

$ vagrant sandbox on
[default] Starting sandbox mode...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

sandboxモードがオンになっているか確認

$ vagrant sandbox status
[default] Sandbox mode is on

VMに接続し、変更を加える

$ vagrant ssh
[vagrant@vagrant-centos64 ~]$ touch test
[vagrant@vagrant-centos64 ~]$ exit

変更が気にくわなかったのでrollback

$ vagrant sandbox rollback
[default] Rolling back the virtual machine...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

VMに接続し、変更を加える

$ vagrant ssh
[vagrant@vagrant-centos64 ~]$ ls # testファイルはなくなっている!
[vagrant@vagrant-centos64 ~]$ touch test2
[vagrant@vagrant-centos64 ~]$ exit

変更が気に入ったのでcommit - 以下の作業はVMを止めて行うこと!! - 処理に時間がかかってしまう

$ vagrant suspend
$ vagrant sandbox commit
[default] Committing the virtual machine...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

プロビジョニング

プロビジョニングで、仮想マシンが立ち上がったあとに実行される処理を指定できる

プロビジョニングの実行

以下3つのコマンド実行時に実行される 1. vagrant up 2. 仮想マシン起動中、vagrant provision 3. 仮想マシン起動中、vagrant reload --provision

設定方法

Vagrantfileのconfig.vm.provisionメソッドを使用して設定 シェルの実行

# Vagrantfile
config.vm.provision :shell, inline: "echo hello world"

ファイルを読み込ませる

# Vagrantfile
config.vm.provision :shell, path: "start.sh"

# start.sh
echo "Hello this is Start file"
結果
$ vagrant up
~ 中略 ~
default: hello world
~ 中略 ~
default: Hello this is Start file

おまけ

試しにWebサーバーを立てた(ドットインストールの#6,7「Webページを表示させよう」)

[vagrant@vagrant-centos64 ~]$ sudo service httpd start
Starting httpd: httpd: apr_sockaddr_info_get() failed for vagrant-centos64.vagrantup.com
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]
[vagrant@vagrant-centos64 ~]$ sudo chkconfig httpd on
[vagrant@vagrant-centos64 ~]$ sudo service iptables stop
[vagrant@vagrant-centos64 ~]$ sudo chkconfig iptables off
[vagrant@vagrant-centos64 ~]$ exit
atom Vagrantfile

#config.vm.network "private_network", ip: "192.168.33.10"という行のコメントアウトを外し、リロード

$ vagrant reload
  • ブラウザで 192.168.33.10 を見てみる f:id:okuya-KAZAN:20180924223738p:plain

  • local からサイトの内容を変えよう

[vagrant@vagrant-centos64 ~]$ sudo rm -rf /var/www/html
[vagrant@vagrant-centos64 ~]$ # シンボリックリンクを貼る
[vagrant@vagrant-centos64 ~]$ sudo ln -fs /vagrant /var/www/html
[vagrant@vagrant-centos64 ~]$ exit
logout
Connection to 127.0.0.1 closed.
centos6 $ vi index.html
# 編集
  • ブラウザで 192.168.33.10 を見てみる f:id:okuya-KAZAN:20180924223750p:plain