hadoop 集群,初學(xué)者順利將它搭起來(lái),肯定要經(jīng)過(guò)很多的坑。經(jīng)過(guò)一個(gè)星期的折騰,我總算將集群正常跑起來(lái)了,所以,想將集群搭建的過(guò)程整理記錄,分享出來(lái),讓大家作一個(gè)參考。
由于搭建過(guò)程比較漫長(zhǎng),所以,這篇文章應(yīng)該也會(huì)很長(zhǎng),希望大家能耐心看完。
創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括順德網(wǎng)站建設(shè)、順德網(wǎng)站制作、順德網(wǎng)頁(yè)制作以及順德網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,順德網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到順德省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
3臺(tái)CentOS 7.4 的服務(wù)器,4CPU,8G內(nèi)存;
jdk 1.8
hadoop 2.7.7
spark 2.3.0
hive 2.1.1
節(jié)點(diǎn)和主機(jī)hostname對(duì)應(yīng)關(guān)系:
主節(jié)點(diǎn): 172.18.206.224 nn1 Namenode and YARN Resourcemanage
從節(jié)點(diǎn)1: 172.18.206.228 dn1 Datanode and YAR ?Nodemanager
從節(jié)點(diǎn)2: 172.18.206.229 dn2 Datanode and YARN Nodemanager
為hadoop集群,創(chuàng)建一個(gè)non-root 用戶,我使用的用戶名是 hadoop。安裝目錄統(tǒng)一在hadoop用戶的家目錄 /data/hadoop 下。
由于 hadoop 集群需要java 環(huán)境的支持,所以,在安裝集群之前,首先確認(rèn)你的系統(tǒng)是否已經(jīng)安裝了jdk,檢查如下:
[root@ND-ES-3 ~]# java -version
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)
如果沒(méi)有安裝 jdk 1.8 以上的版本,則需要卸載舊版本重新安裝,在這里,我選擇的jdk是oracal提供的版本,其他公司提供的jdk,我測(cè)試的時(shí)候,好像和apache hadoop 不兼容,總是報(bào)錯(cuò)。
下載 : jdk-8u181-linux-x64.rpm ,
然后上傳到服務(wù)器,安裝:
rpm -ivh jdk-8u181-linux-x64.rpm
安裝完成后,檢查 java -version 輸出正確,就可以了。
在 nn1,dn1 和 dn2 服務(wù)器上修改 /etc/hosts 文件,方便主機(jī)之間通過(guò)hostname也能夠訪問(wèn)通信:
vi /etc/hosts :
172.18.206.224 nn1 nn1.cluster1.com
172.18.206.228 dn1 dn1.cluster1.com
172.18.206.229 dn2 dn2.cluster1.com
其實(shí)使用,什么hostname,都是可以的,看使用習(xí)慣。
在所有服務(wù)器上創(chuàng)建,可以先不用密碼
useradd -d /data/hadoop/ hadoop
然后,在nn1 上為hadoop 創(chuàng)建密鑰文件,用來(lái)ssh 免密碼登錄,這是為了在后面hadoop集群通信時(shí),不需要每次都輸入密碼,那么麻煩。
創(chuàng)建密鑰對(duì)的方式:
su - hadoop
ssh-key-gen -t rsa
mv id_rsa.pub authorized_keys
chmod 0700 /data/hadoop/.ssh
chmod 0600 /data/hadoop/.ssh/authorized_keys
然后將 authorized_keys 和 id_rsa 密鑰對(duì)復(fù)制到其他兩臺(tái)主機(jī)的 /data/hadoop/.ssh 目錄。
測(cè)試,用hadoop ssh 登錄其他兩臺(tái)服務(wù)器:
[root@ND-ES-3 ~]# su - hadoop
Last login: Mon Sep 10 09:32:13 CST 2018 from 183.6.128.86 on pts/1
[hadoop@ND-ES-3 ~]$ ssh dn1
Last login: Thu Sep 6 15:49:20 2018
Welcome to Alibaba Cloud Elastic Compute Service !
[hadoop@ND-DB-SLAVE ~]$
[hadoop@ND-ES-3 ~]$ ssh dn2
Last login: Fri Sep 7 16:43:04 2018
Welcome to Alibaba Cloud Elastic Compute Service !
[hadoop@ND-BACKUP ~]$
默認(rèn)第一次ssh登錄的時(shí)候,需要輸入確認(rèn)接收 密鑰登錄的,直接確認(rèn)就可以了。
ssh 面密碼登錄打通之后,就可以繼續(xù)往下做了。
安裝過(guò)程比較簡(jiǎn)單,先下載對(duì)應(yīng)版本的壓縮包,再解壓縮就可以使用了,我選的版本是 hadoop-2.7.7.tar.gz。
tar -xvzf /usr/local/src/hadoop-2.7.7.tar.gz
mv hadoop-2.7.7 /data/hadoop/
可以修改 hadoop 家目錄 /data/hadoop/.bash_profile文件
vi /data/hadoop/.bash_profile,添加如下:
## JAVA env variables
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
## HADOOP env variables
export HADOOP_HOME=/data/hadoop/hadoop-2.7.7
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
注意根據(jù)自己的實(shí)際情況修改其中的路徑。
然后, source ~/.bash_profile 使變量設(shè)置生效。
vi /data/hadoop/hadoop-2.7.7/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://nn1:9000</value>
</property>
</configuration>
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/data/hadoop/hadoop-2.7.7/hadoop_store/hdfs/namenode2</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/data/hadoop/hadoop-2.7.7/hadoop_store/hdfs/datanode2</value>
</property>
</configuration>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
<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>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>172.18.206.224:8025</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>172.18.206.224:8030</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>172.18.206.224:8050</value>
</property>
</configuration>
[hadoop@ND-BACKUP hadoop]$ cat slaves
172.18.206.228
172.18.206.229
將 hadoop-env.sh 文件里的 JAVA_HOME 修改為:
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))
> scp -r /data/hadoop/hadoop-2.7.7 hadoop@dn1:/data/hadoop/
> scp -r /data/hadoop/hadoop-2.7.7 hadoop@dn2:/data/hadoop/
mkdir -p /data/hadoop/hadoop-2.7.7/hadoop_store/hdfs/namenode2
mkdir -p /data/hadoop/hadoop-2.7.7/hadoop_store/hdfs/datanode2
chmodu 755 /data/hadoop/hadoop-2.7.7/hadoop_store/hdfs/datanode2
iptabels -F
setenforce 0
hdfs namenode -format
cd /data/hadoop/hadoop-2.7.7/
./sbin/start-all.sh
在 nn1 :
$ jps
3042 NameNode
3349 SecondaryNameNode
3574 ResourceManager
11246 Jps
在 dn1或者 dn2:
$ jps
26642 NodeManager
14569 Jps
26491 DataNode
[hadoop@ND-ES-3 ~]$ hdfs dfsadmin -report
Configured Capacity: 3246492319744 (2.95 TB)
Present Capacity: 2910313086244 (2.65 TB)
DFS Remaining: 2907451403556 (2.64 TB)
DFS Used: 2861682688 (2.67 GB)
DFS Used%: 0.10%
Under replicated blocks: 34
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
-------------------------------------------------
Live datanodes (2):
Name: 172.18.206.228:50010 (dn1)
Hostname: dn1
Decommission Status : Normal
Configured Capacity: 1082119344128 (1007.80 GB)
DFS Used: 1430839296 (1.33 GB)
Non DFS Used: 161390100480 (150.31 GB)
DFS Remaining: 864172031634 (804.82 GB)
DFS Used%: 0.13%
DFS Remaining%: 79.86%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 3
Last contact: Mon Sep 10 17:26:59 CST 2018
Name: 172.18.206.229:50010 (dn2)
Hostname: dn2
Decommission Status : Normal
Configured Capacity: 2164372975616 (1.97 TB)
DFS Used: 1430843392 (1.33 GB)
Non DFS Used: 9560809472 (8.90 GB)
DFS Remaining: 2043279371922 (1.86 TB)
DFS Used%: 0.07%
DFS Remaining%: 94.41%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 3
Last contact: Mon Sep 10 17:26:59 CST 2018
[hadoop@ND-ES-3 ~]$
如果上面的檢查都通過(guò)了,那么hadoop集群就已經(jīng)順利搭建了。
其實(shí),你還可以通過(guò)web頁(yè)面訪問(wèn),來(lái)查看hadoop的情況,例如,通過(guò)50070端口:
http://host_ip:50070
或者通過(guò) 8088端口,查看resource manager資源情況:
http://host_ip:8088
OK,以上就是hadoop集群的搭建過(guò)程,下面,我們繼續(xù)搭建spark集群。
首先,spark 和hadoop 的yarn 整合后的運(yùn)行模式有兩種,一種是client模式,另一種是cluster 模式。默認(rèn)情況下,spark 安裝之后,會(huì)以cluster模式運(yùn)行,一般我們都選擇cluster 模式。具體client模式和cluster模式的原理是什么,請(qǐng)大家有興趣的,可以去搜索更多的文檔來(lái)閱讀。
我使用的 spark版本是:
spark-2.3.0-bin-hadoop2.7.tgz
上傳到服務(wù)器 /usr/local/src/ 目錄,然后解壓:
tar -xvzf /usr/local/src/spark-2.3.0-bin-hadoop2.7.tgz
mv /usr/local/src/spark-2.3.0-bin-hadoop2.7 /data/hadoop/spark-2.3.0
創(chuàng)建軟連接:
cd /data/hadoop
ln -s spark-2.3.0 spark # 別問(wèn)為什么用軟連接,這是為了以后多個(gè)版本切換方便,高手都這么干
現(xiàn)在,spark已經(jīng)安裝在 /data/hadoop/spark 目錄了。
在 /data/hadoop/.bash_profile 文件添加:
## spark
export SPARK_HOME=/data/hadoop/spark
export HADOOP_CONF_DIR=/data/hadoop/hadoop-2.7.7/etc/hadoop
export LD_LIBRARY_PATH=/data/hadoop/hadoop-2.7.7/lib/native:$LD_LIBRARY_PATH
export PATH=/data/hadoop/spark/bin:$PATH
然后,使配置生效:
source .bash_profiel
這里其實(shí)有一個(gè)問(wèn)題,這樣每次添加環(huán)境變量,那么 PATH變量就會(huì)變得越來(lái)越長(zhǎng),如果你用的服務(wù)器是生產(chǎn)環(huán)境長(zhǎng)時(shí)間都不會(huì)重啟的,那也沒(méi)辦法了。
復(fù)制安裝包里,自帶的官方模板文件:
cd /data/hadoop/spark/conf
cp spark-env.sh.template spark-env.sh
添加如下的內(nèi)容:
export SPARK_HOME=/data/hadoop/spark
#export SCALA_HOME=/lib/scala
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))
export HADOOP_HOME=/data/hadoop/hadoop-2.7.7
#export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SCALA_HOME/bin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
#export YARN_CONF_DIR=$YARN_HOME/etc/hadoop
#export SPARK_LOCAL_DIRS=/data/haodop/spark
export SPARK_LIBARY_PATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$HADOOP_HOME/lib/native
#export SPAR_MASTER_PORT=7077
export SPARK_MASTER_HOST=nn1
上面的配置中,有些注釋掉的就是不用的,我復(fù)制過(guò)來(lái),就不改了。
將官方模板復(fù)制一份:
mv slaves.template slaves
vi slaves ,添加如下的內(nèi)容:
nn1
dn1
dn2
將官方的復(fù)制一份:
mv spark-defaults.conf.templates spark-defaults.conf
添加如下的配置:
vi spark-defaults.conf
spark.eventLog.enabled true
spark.eventLog.dir hdfs://nn1:9000/spark-logs
spark.history.provider org.apache.spark.deploy.history.FsHistoryProvider
spark.history.fs.logDirectory hdfs://nn1:9000/spark-logs
spark.history.fs.update.interval 10s
spark.history.ui.port 18080
這個(gè)文件主要是配置spark的內(nèi)存使用或者分配的,如果你對(duì) memory allocation的分配不熟悉,暫時(shí)可以不配置這個(gè)文件,讓spark按照默認(rèn)的參數(shù)運(yùn)行,也是可以的。
因?yàn)樵谏弦徊街?,我們?cè)O(shè)置了 spark.eventLog.dir ,所以,我們要在 hdfs 上創(chuàng)建一個(gè)目錄路徑,給日志用才可以:
[hadoop@ndj-hd-1 spark]$ hadoop dfs -mkdir /spark-logs
然后在 spark-env.sh 最后中添加:
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=3 -Dspark.history.fs.logDirectory=hdfs://nn1:9000/spark-logs"
如果上面的環(huán)境變量設(shè)置都沒(méi)有問(wèn)題,那么可以進(jìn)行下面的簡(jiǎn)單例子測(cè)試。
(spark-defaults.conf 文件可以不配置):
[hadoop@ND-ES-3 spark]$ ./bin/run-example SparkPi 10
2018-09-11 11:17:47 INFO SparkContext:54 - Running Spark version 2.3.0
2018-09-11 11:17:47 INFO SparkContext:54 - Submitted application: Spark Pi
2018-09-11 11:17:47 INFO SecurityManager:54 - Changing view acls to: hadoop
2018-09-11 11:17:47 INFO SecurityManager:54 - Changing modify acls to: hadoop
2018-09-11 11:17:47 INFO SecurityManager:54 - Changing view acls groups to:
2018-09-11 11:17:47 INFO SecurityManager:54 - Changing modify acls groups to:
spark 自帶了一些例子。以上是計(jì)算圓周率的例子以及部分輸出的內(nèi)容。如果計(jì)算成功,在輸出結(jié)束后,你往上翻,會(huì)看到:
Pi is roughly 3.141415141415141
chown -R hadoop:hadoop /data/hadoop/spark
scp -r /data/hadoop/spark dn1:/data/hadoop/
scp -r /data/hadoop/spark dn2:/data/hadoop/
復(fù)制完成之后,注意修改 dn1 和 dn2 節(jié)點(diǎn)上的 /data/hadoop/.bash_profile的系統(tǒng)變量
啟動(dòng)spark 前,要確認(rèn) hadoop集群已經(jīng)在運(yùn)行,
啟動(dòng)spark:
cd /data/hadoop/spark
為了省事,一次性啟動(dòng)所有master和worker:
./sbin/start-all.sh
nn1 啟動(dòng)情況:
[hadoop@ND-ES-3 conf]$ jps
3042 NameNode
8627 RunJar
3349 SecondaryNameNode
3574 ResourceManager
10184 Master
10332 Worker
4654 Jps
dn1 和 dn2:
[hadoop@ND-DB-SLAVE ~]$ jps
26642 NodeManager
10679 Jps
29960 Worker
26491 DataNode
[hadoop@ND-DB-SLAVE ~]$
看到 worker 和 master 啟動(dòng)就可以了。
在安裝完spark 之后,先安裝 scala ,過(guò)程比較簡(jiǎn)單,
下載,并上傳安裝包到服務(wù)器,解壓縮:
tar xvzf scala-2.12.6.tgz
創(chuàng)建軟連接:
ln -s scala-2.12.6 /data/hadoop/scala
修改scalac 的PATH 變量:
vi .bash_profile
# scala
export SCALA_HOME=/lib/scala
export PATH=${SCALA_HOME}/bin:$PATH
生效:
source .bash_profiel
Ok,scala 就配置好,可以使用了。
當(dāng)你的hadoop 集群,和spark 集群都安裝完成之后,就可以開(kāi)始安裝hive 了。
hive是這篇文章的最后一部分了,也是依賴條件比較多的一個(gè)組件。
先將我自己在安裝hive后,總結(jié)的一些坑寫出來(lái)吧:
第一,hadoop和spark功能要正常。
第二,hive需要和MySQL數(shù)據(jù)庫(kù)結(jié)合,所以又要配置好mysql數(shù)據(jù)庫(kù),做好用戶授權(quán)。
第三,注意在hive-site.xml配置文件里,把jdbc驅(qū)動(dòng)、spark引擎配置好。
特別是第三點(diǎn),在很多資料里都沒(méi)提過(guò)的。如果發(fā)現(xiàn)自己配置已經(jīng)做好了,在做測(cè)試驗(yàn)證的時(shí)候,總是不成功,那么,最好的辦法,就是根據(jù)報(bào)錯(cuò),一個(gè)個(gè)問(wèn)題去解決。
hive需要和數(shù)據(jù)庫(kù)結(jié)合使用,這樣在進(jìn)行SQL語(yǔ)句操作時(shí)就可以像操作mysql那樣,不需要寫復(fù)制的代碼了。
我是用二進(jìn)制編譯安裝mysql的方式,因?yàn)榭梢宰约号渲胢ysql的參數(shù)。
下載安裝包的地址:
https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz
創(chuàng)建用戶和用戶組
groupadd mysql
useradd -g mysql -s /sbin/nologin mysql
解壓到指定目錄
tar -zxvf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz -C /usr/local
cd /usr/local/
ln -s mysql-5.7.17-linux-glibc2.5-x86_64 mysql
或者
mv mysql-5.7.17-linux-glibc2.5-x86_64 mysql
配置PATH目錄
vi /etc/profile.d/mysql.sh
添加:
export PATH=$PATH:/usr/local/mysql/bin
然后,source /etc/profile.d/mysql.sh
mysql目錄資源規(guī)劃
文件類型 | 實(shí)例3306 | 軟鏈 |
---|---|---|
數(shù)據(jù)datadir | /usr/local/mysql/data | /data/mysql/data |
參數(shù)文件my.cnf | /usr/local/mysql/etc/my.cnf | |
錯(cuò)誤日志log-error | /usr/local/mysql/log/mysql_error.log | |
二進(jìn)制日志log-bin | /usr/local/mysql/binlogs/mysql-bin | /data/mysql/binlogs/mysql-bin |
慢查詢?nèi)罩緎low_query_log_file | /usr/local/mysql/log/mysql_slow_query.log | |
套接字socket文件 | /usr/local/mysql/run/mysql.sock | |
pid文件 | /usr/local/mysql/run/mysql.pid |
備注:考慮到數(shù)據(jù)和二進(jìn)制日志比較大,需要軟鏈,實(shí)際/data/mysql 在服務(wù)器的數(shù)據(jù)盤,磁盤空間充足,如果你不考慮磁盤空間問(wèn)題,可以安裝默認(rèn)的路徑安排。
mkdir -p /data/mysql/{data,binlogs,log,etc,run}
ln -s /data/mysql/data /usr/local/mysql/data
ln -s /data/mysql/binlogs /usr/local/mysql/binlogs
ln -s /data/mysql/log /usr/local/mysql/log
ln -s /data/mysql/etc /usr/local/mysql/etc
ln -s /data/mysql/run /usr/local/mysql/run
chown -R mysql.mysql /data/mysql/
chown -R mysql.mysql /usr/local/mysql/{data,binlogs,log,etc,run}
備注:也可以只對(duì) datadir 和 binlog 目錄進(jìn)行軟連接
配置 my.cnf 文件
刪除系統(tǒng)自帶的 my.cnf
rm -rf /etc/my.cnf
編輯 my.cnf
vi /usr/local/mysql/etc/my.cnf
添加以下內(nèi)容:
[client]
port = 3306
socket = /usr/local/mysql/run/mysql.sock
[mysqld]
port = 3306
socket = /usr/local/mysql/run/mysql.sock
pid_file = /usr/local/mysql/run/mysql.pid
datadir = /usr/local/mysql/data
default_storage_engine = InnoDB
max_allowed_packet = 512M
max_connections = 2048
open_files_limit = 65535
skip-name-resolve
lower_case_table_names=1
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
innodb_buffer_pool_size = 1024M
innodb_log_file_size = 2048M
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 0
key_buffer_size = 64M
log-error = /usr/local/mysql/log/mysql_error.log
log-bin = /usr/local/mysql/binlogs/mysql-bin
slow_query_log = 1
slow_query_log_file = /usr/local/mysql/log/mysql_slow_query.log
long_query_time = 5
tmp_table_size = 32M
max_heap_table_size = 32M
query_cache_type = 0
query_cache_size = 0
server-id=1
初始化數(shù)據(jù)庫(kù)
mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
在數(shù)據(jù)庫(kù)會(huì)有一個(gè)臨時(shí)密碼生成,請(qǐng)記錄下來(lái),等會(huì)要用到:
[hadoop@ND-ES-3 mysql]$ sudo grep 'temporary password' /usr/local/mysql/log/mysql_error.log
2018-09-08T05:03:32.509910Z 1 [Note] A temporary password is generated for root@localhost: <,Nhx3+7z)UY
生成ssl
mysql_ssl_rsa_setup --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/
設(shè)置啟動(dòng)項(xiàng)(CentOS 7)
cd /usr/lib/systemd/system
touch mysqld.service
輸入如下內(nèi)容:
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
Type=forking
PIDFile=/usr/local/mysql/run/mysqld.pid
# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0
# Execute pre and post scripts as root
PermissionsStartOnly=true
# Needed to create system tables
#ExecStartPre=/usr/bin/mysqld_pre_systemd
# Start main service
ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/usr/local/mysql/run/mysqld.pid $MYSQLD_OPTS
# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql
# Sets open_files_limit
LimitNOFILE = 65535
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false
加載并啟動(dòng)mysql
systemctl daemon-reload
systemctl enable mysqld.service
systemctl is-enabled mysqldsystemctl start mysql
Securing the Initial MySQL Accounts
執(zhí)行 /usr/local/mysql/bin/mysql_secure_installation
剛剛記錄下來(lái)的臨時(shí)密碼在這里可以排上用場(chǎng)了,重新配置root密碼,清空測(cè)試數(shù)據(jù)庫(kù),禁止匿名用戶。
導(dǎo)入時(shí)區(qū)
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
安裝完mysql,就可以正式開(kāi)始hive 安裝了
相同的套路,將hive的安裝包上傳到服務(wù)器,然后解壓縮,創(chuàng)建軟連接,,我使用的版本是:apache-hive-2.1.1-bin.tar.gz
tar xvzf apache-hive-2.1.1-bin.tar.gz
mv apache-hive-2.1.1-bin /data/hadoop/hive-2.1.1
cd /data/hadoop
ln -s hive-2.1.1 hive
修改 PATH
vi /etc/profile.d/hive.sh
export HIVE_HOME=/data/hadoop/hive
export HIVE_CONF_DIR=$HIVE_HOME/conf
export PATH=$PATH:$HIVE_HOME/bin
生效:
source /etc/profile.d/hive.sh
下載mysql-connector 驅(qū)動(dòng)
因?yàn)閔ive 要和mysql結(jié)合使用,所以,需要下載 驅(qū)動(dòng)jar包。我下載用的是:mysql-connector-java-5.1.47.tar.gz。將它解壓縮后,將里面的jar包,復(fù)制到/data/hadoop/hive/lib 目錄。如:
[hadoop@ND-ES-3 lib]$ ls /data/hadoop/hive/lib | grep "mysql-connector*"
mysql-connector-java-5.1.47-bin.jar
mysql-connector-java-5.1.47.jar
登錄mysql數(shù)據(jù)庫(kù),創(chuàng)建一個(gè)用戶,給hive連接用,設(shè)置好授權(quán)密碼:
grant all privileges on *.* to 'hive'@'%' identified by '123456';
以上,創(chuàng)建了一個(gè)用戶hive,它的密碼是 123456;
整合spark 和 hive
將 spark/jars 文件下得scala-library spark-core spark-network-common包復(fù)制到hive/lib下
這步不能少?。。?/em>
配置 hive-env.sh文件
vi hive-env.sh
添加如下內(nèi)容:
#hadoop_home路徑
HADOOP_HOME=/data/hadoop/hadoop-2.7.7
#hive配置文件存放路徑
export HIVE_CONF_DIR=/data/hadoop/hive/conf
#hive相關(guān)jar存放路徑
export HIVE_AUX_JARS_PATH=/data/hadoop/hive/lib
配置 hive-site.xml 文件
cp hive-default.xml.template hive-site.xml ,然后修改其中的一些默認(rèn)參數(shù)。
修改,使用mysql connector:
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
修改,配置msyql地址:
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://dn2:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
修改,數(shù)據(jù)庫(kù)名字hive
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>Username to use against metastore database</description>
</property>
修改,連接mysql的密碼是123456:
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
<description>password to use against metastore database</description>
</property>
在/data/hadoop/hive 創(chuàng)建 temp 目錄:
mkdir /data/hadoop/hive/temp
然后,繼續(xù)修改hive-site.xml 文件中對(duì)應(yīng)參數(shù)的<value>
1
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/data/hadoop/hive/temp/operation_logs</value>
<description>Top level directory where operation logs are stored if logging functionality is enabled</description>
2
<property>
<name>hive.exec.local.scratchdir</name>
<value>/data/hadoop/hive/temp</value>
<description>Local scratch space for Hive jobs</description>
</property>
3
<property>
<name>hive.downloaded.resources.dir</name>
<value>/data/hadoop/hive/temp</value>
<description>Temporary local directory for added resources in the remote file system.</description>
</property>
創(chuàng)建以下的dfs 目錄
hadoop fs -mkdir /data
hadoop fs -mkdir /data/hive
hadoop fs -mkdir /data/hive/warehouse
hadoop fs -mkdir /data/hive/tmp
hadoop fs -mkdir /data/hive/log
然后,繼續(xù)修改 hive-site.xml文件
1.
<property>
<name>hive.metastore.warehouse.dir</name>
<value>hdfs://nn1:9000/data/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
2.
<property>
<name>hive.querylog.location</name>
<value>hdfs://nn1:9000/data/hive/log</value>
<description>Location of Hive run time structured log file</description>
</property>
3.
<property>
<name>spark.enentLog.dir</name>
<value>hdfs://nn1:9000/spark-logs</value>
</property>
4.
<property>
<name>hive.exec.scratchdir</name>
<value>hdfs://nn1:9000/data/hive/tmp</value>
<description>HDFS root scratch dir for Hive jobs which gets created with write all (733) permission. For each connecting user, an HDFS scratch dir: ${hive.exec.scratchdir}/<username> is created, with ${hive.scratch.dir.permission}.</description>
其他的修改,同樣重要,
1.
<property>
<name>hive.stats.dbclass</name>
<value>jdbc:msyql</value>
<description>
最后, 將 spark/jars 文件下得scala-library spark-core spark-network-common包復(fù)制到hive/lib下
hive-site.xml添加:
<property>
<name>hive.enable.spark.execution.engine</name>
<value>true</value>
</property>
<property>
<name>spark.home</name>
<value>/data/hadoop/spark</value>
</property>
<property>
<name>spark.enentLog.enabled</name>
<value>true</value>
</property>
<property>
<name>spark.enentLog.dir</name>
<value>hdfs://nn1:9000/spark-logs</value>
</property>
<property>
<name>spark.serializer</name>
<value>org.apache.spark.serializer.KryoSerializer</value>
</property>
<property>
<name>spark.executor.extraJavaOptions</name>
<value>-XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"</value>
</property>
這里要注意,如果spark-logs 路徑?jīng)]有創(chuàng)建,則需要先用hadoop創(chuàng)建:
hadoop fs -mkdir /spark-logs
另一個(gè),spark需要開(kāi)啟日志記錄的功能,參考上面提到的 spark-defaults.conf 文件。
OK,經(jīng)過(guò)漫長(zhǎng)的配置,終于將hive-site.xml 文件配置完成了。下面開(kāi)始測(cè)試。
初始化hive元數(shù)據(jù)庫(kù)
schematool -dbType mysql -initSchema
啟動(dòng)hive數(shù)據(jù)庫(kù)
直接在命令行輸入hive進(jìn)入CLI模式:
[hadoop@ND-ES-3 hive]$ hive
which: no hbase in (/lib/scala/bin:/data/hadoop/spark/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/java/jdk1.8.0_181-amd64/bin:/data/hadoop/hadoop-2.7.7/sbin:/data/hadoop/hadoop-2.7.7/bin:/usr/local/mysql/bin:/data/hadoop/hive/bin:/data/hadoop/.local/bin:/data/hadoop/bin)
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/data/hadoop/hive-2.1.1/lib/log4j-slf4j-impl-2.4.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/data/hadoop/hadoop-2.7.7/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Logging initialized using configuration in file:/data/hadoop/hive-2.1.1/conf/hive-log4j2.properties Async: true
hive> show databases;
OK
default
Time taken: 0.769 seconds, Fetched: 1 row(s)
hive>
剛開(kāi)始的輸出信息,不影響使用,只要show databases;命令能輸出正確信息,就已經(jīng)配置好了。
不得不說(shuō),配置這個(gè) hadoop+spark+hive的環(huán)境,對(duì)于初學(xué)者來(lái)說(shuō)確實(shí)太麻煩了。
我的安裝過(guò)程,雖然能將集群順利運(yùn)行了,但是仍然有很多地方需要優(yōu)化,例如對(duì)于spark、hadoop、hive 它們的內(nèi)存資源分配,這篇文章就沒(méi)有做深入的討論。希望文章能幫助更多的人在搭建集群時(shí),節(jié)省更多的時(shí)間,將時(shí)間花在更有意思的地方,幫助大家能盡早開(kāi)始體驗(yàn)hadoop的各種功能。
后續(xù)的優(yōu)化方向,會(huì)深入學(xué)習(xí)hadoop集群的性能,有時(shí)間還要看看它們的源代碼。
本文標(biāo)題:hadoop+spark+hive集群搭建(apache版本)
分享網(wǎng)址:http://aaarwkj.com/article10/iggdgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、服務(wù)器托管、網(wǎng)站設(shè)計(jì)、營(yíng)銷型網(wǎng)站建設(shè)、虛擬主機(jī)、移動(dòng)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)