docker上從零開始搭建hadoop和hive環(huán)境

本文將介紹如何在docker上從零開始安裝hadoop以及hive環(huán)境鳖目。本文不會介紹如何安裝docker仪媒,也不會過多的介紹docker各個命令的具體含義狸眼,對docker完全不了解的同學建議先簡單的學習一下docker再來看本教程藤树。

一、構(gòu)建自己的centos鏡像

由于官方的centos鏡像什么軟件都沒有拓萌,而安裝hadoop需要用到ssh岁钓、java等環(huán)境,因此我們可以根據(jù)官方的centos鏡像先構(gòu)建一個屬于自己的鏡像微王。整個過程也很簡單屡限,我們先新建一個目錄存放Dockerfile和執(zhí)行腳本run.sh。

vim run.sh

#!/bin/bash
/usr/sbin/sshd -D

vim Dockerfile

#生成的新鏡像以centos鏡像為基礎(chǔ)
FROM centos
MAINTAINER by kongtrio(kongtrio@sina.com)
#升級系統(tǒng)
RUN yum -y update
#安裝openssh-server炕倘、client
RUN yum -y install openssh-server openssh-clients.x86_64 vim less wget
#修改/etc/ssh/sshd_config
#RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config

#將密鑰文件復制到/etc/ssh/目錄中钧大。這里要用root的權(quán)限生成key
RUN mkdir -p /root/.ssh
#生成秘鑰、公鑰
RUN ssh-keygen -t rsa -b 2048 -P '' -f /root/.ssh/id_rsa
RUN cat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keys
RUN cp /root/.ssh/id_rsa /etc/ssh/ssh_host_rsa_key
RUN cp /root/.ssh/id_rsa.pub /etc/ssh/ssh_host_rsa_key.pub

# 安裝 jre 1.8
RUN yum -y install java-1.8.0-openjdk.x86_64
ENV JAVA_HOME=/etc/alternatives/jre_1.8.0

#定義時區(qū)參數(shù)
ENV TZ=Asia/Shanghai
#設置時區(qū)
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone

#將ssh服務啟動腳本復制到/usr/local/sbin目錄中罩旋,并改變權(quán)限為755
ADD run.sh /usr/local/sbin/run.sh
RUN chmod 755 /usr/local/sbin/run.sh

#變更root密碼為root
RUN echo "root:root"| chpasswd
#開放窗口的22端口
EXPOSE 22
#運行腳本啊央,啟動sshd服務
CMD ["/usr/local/sbin/run.sh"]

之后通過dockerfile構(gòu)建一個屬于自己的鏡像:

docker build -t my_centos:v1 .

通過鏡像啟動容器:

docker run -d -P --name hadoop_centos my_centos:v1 /usr/local/sbin/run.sh

懶得去構(gòu)建鏡像的同學也可以直接使用我的鏡像啟動容器:

docker run -d -P --name hadoop_centos kongtrio/kongtrio_centos:latest /usr/local/sbin/run.sh

啟動容器后,我們就可以進入容器進行hadoop和hive的相關(guān)安裝了瘸恼。

docker exec -it hadoop_centos /bin/bash

二劣挫、hadoop 偽分布式環(huán)境安裝

3種安裝模式

hadoop目前支持三種安裝模式:

  • 單機模式:默認情況下册养,Hadoop即處于該模式东帅,用于開發(fā)和調(diào)式。
  • 偽分布式系統(tǒng):一臺主機模擬多主機球拦,在一臺機器啟動NameNode靠闭、DataNode帐我、JobTracker、TaskTracker這些守護進程愧膀。
  • 安全分布式:各個守護進程運行在各個主機上拦键,實現(xiàn)分布式部署。

我們這里介紹的是如何在一個docker容器中部署偽分布式系統(tǒng)檩淋。

偽分布式環(huán)境安裝

安裝前首先要獲取hadoop的安裝包芬为,我們可以直接去官網(wǎng)獲取,也可以直接獲取源碼后編譯獲得蟀悦。如何編譯hadoop源碼可以看我的這篇博客:mac 下編譯hadoop源碼媚朦。

1. 解壓安裝包

假設我們現(xiàn)在拿到了2.7.0版本的安裝包,且我們在第一節(jié)中啟動了名稱為hadoop_centos的docker容器。這時候就可以先把包拷貝到容器的對應目錄后進入容器:

# 拷貝安裝包
docker cp hadoop-2.7.0.tar.gz hadoop_centos:/usr/local
# 進入容器
docker exec -it hadoop_centos /bin/bash
cd /usr/local/
# 解壓安裝包
tar xvf hadoop-2.7.0.tar.gz

2. 修改相關(guān)配置文件

修改一下core-site.xml日戈、hdfs-site.xml询张、mapred-site.xml配置文件的值。

vim /usr/local/hadoop-2.7.0/etc/hadoop/core-site.xml

<property>
      <name>fs.defaultFS</name>
      <value>hdfs://127.0.0.1:9000</value>
</property>

vim /usr/local/hadoop-2.7.0/etc/hadoop/hdfs-site.xml

<property>
      <name>dfs.replication</name>
      <value>1</value>
</property>

cp /usr/local/hadoop-2.7.0/etc/hadoop/mapred-site.xml.template /usr/local/hadoop-2.7.0/etc/hadoop/mapred-site.xml

vim /usr/local/hadoop-2.7.0/etc/hadoop/mapred-site.xml

<property>
     <name>mapreduce.framework.name</name>
     <value>yarn</value>
</property>

之后還要修改一下hadoop-env.sh的內(nèi)容浙炼,主要指定JAVA_HOME的環(huán)境變量份氧,否則啟動hadoop時會提示找不到JAVA_HOME的值。

vim /usr/local/hadoop-2.7.0/etc/hadoop/hadoop-env.sh

# 將原來的 export JAVA_HOME=${JAVA_HOME} 改成下面這個
export JAVA_HOME="/etc/alternatives/jre_1.8.0"

3. 指定HADOOP環(huán)境變量

vim /etc/profile

# 在文本最后加上
export HADOOP_HOME="/usr/local/hadoop-2.7.0"
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

source /etc/profile

4. namenode 初始化

hadoop namenode -format

5. 啟動hdfs和yarn

啟動hdfs相關(guān)進程:

start-dfs.sh

執(zhí)行start-dfs.sh腳本后弯屈,hadoop會啟動3個和hdfs相關(guān)的進程蜗帜。通過ps -ef | grep hadoop我們可以看到這幾個進程分別是NameNodeSecondaryNamenode资厉、Datanode钮糖。如果少了就要注意hdfs是否沒有正常啟動了。

之后啟動yarn的相關(guān)進程:

start-yarn.sh

執(zhí)行腳本后正常會有ResourceManagerNodeManager這兩個進程酌住。

6. 驗證程序已經(jīng)正確啟動

# 新建一個目錄
hadoop fs -mkdir /test
# 查看是否有對應目錄了
hadoop fs -ls /
# 最后輸出
Found 1 items
drwxr-xr-x   - root supergroup          0 2018-12-23 14:09 /test

三店归、hive環(huán)境安裝

編譯hive

hive的編譯比hadoop簡單一些,獲取hive源碼后進入目錄執(zhí)行以下命令即可:

# -Dmaven.javadoc.skip=true 記得加上
mvn clean package -DskipTests  -Pdist -Dmaven.javadoc.skip=true

安裝hive

安裝hive之前酪我,必須保證機器上已經(jīng)有hadoop環(huán)境了消痛。因此,安裝hive之前請先確保hadoop已經(jīng)安裝完成都哭。

我們可以通過官網(wǎng)獲取指定版本的hive安裝包秩伞,也可以自己編譯獲取hive的相關(guān)版本的安裝包。

1. 解壓安裝包

# 拷貝安裝包
docker cp apache-hive-2.1.1-bin.tar.gz hadoop_centos:/usr/local
# 進入容器
docker exec -it hadoop_centos /bin/bash
cd /usr/local/
# 解壓安裝包
tar xvf apache-hive-2.1.1-bin.tar.gz

2. 修改配置文件

cp /usr/local/apache-hive-2.1.1-bin/conf/hive-default.xml.template /usr/local/apache-hive-2.1.1-bin/conf/hive-site.xml

vim /usr/local/apache-hive-2.1.1-bin/conf/hive-site.xml

在最前面加上這些配置:

  <property>
    <name>system:java.io.tmpdir</name>
    <value>/tmp/hive/java</value>
  </property>
  <property>
    <name>system:user.name</name>
    <value>${user.name}</value>
  </property>

如果沒加上面這些錯誤欺矫,在啟動hive的時候會報以下錯誤:

Exception in thread "main" java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
        at org.apache.hadoop.fs.Path.initialize(Path.java:205)
        at org.apache.hadoop.fs.Path.<init>(Path.java:171)
        at org.apache.hadoop.hive.ql.session.SessionState.createSessionDirs(SessionState.java:644)
        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:563)
        at org.apache.hadoop.hive.ql.session.SessionState.beginStart(SessionState.java:531)
        at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:705)
        at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:641)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
Caused by: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
        at java.net.URI.checkPath(URI.java:1823)
        at java.net.URI.<init>(URI.java:745)
        at org.apache.hadoop.fs.Path.initialize(Path.java:202)
        ... 12 more

3. 初始化hive數(shù)據(jù)庫

我們這里先直接使用hive內(nèi)置的derby作為元數(shù)據(jù)的數(shù)據(jù)庫纱新。直接用默認的配置就行了,執(zhí)行以下命令初始化數(shù)據(jù)庫:

schematool -initSchema -dbType derby

初始化后會提示:

# ... 省略一些輸出
Initialization script completed
schemaTool completed

4. 配置hive相關(guān)環(huán)境變量

vim /etc/profile

# 在文本最后加上
export HIVE_HOME="/usr/local/apache-hive-2.1.1-bin"
# 設置PATH變量
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin

source /etc/profile

5. 驗證

我們先創(chuàng)建一個數(shù)據(jù)文件放到/usr/local下,

cd /usr/local

vim test.txt

1,jack
2,hel
3,nack

之后通過hive命令進入hive交互界面穆趴,然后執(zhí)行相關(guān)操作

# 建表
create table test(
    id      int
   ,name    string
)
row format delimited
fields terminated by ',';

# 導入數(shù)據(jù)
load data local inpath '/usr/local/test.txt' into table test;

# 查詢剛才導入的數(shù)據(jù)  
select * from test;

# 查詢結(jié)果:
OK
1       jack
2       hel
3       nack

配置mysql作為元數(shù)據(jù)庫

上面的教程我們使用derby作為hive的元數(shù)據(jù)庫脸爱,但是在我們實際使用中,更常見的是使用mysql作為元數(shù)據(jù)庫未妹。下面介紹一下如何使用mysql作為元數(shù)據(jù)庫簿废。

1. mysql資源準備

首先我們在mac上啟動一個mysql鏡像的docker容器:

# 為了讓mac可以訪問該mysql實例空入,我們將它的端口映射到3307上
docker run -p 3307:3306 --name mysql5.5 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
# 在mac上進入該mysql交互界面,創(chuàng)建一個hive的元數(shù)據(jù)庫  
mysql -uroot -proot -P 3307 -h 127.0.0.1
create database hive;
# 之后通過docker inspect檢查該容器的ip族檬,我獲取到的ip是172.17.0.3
docker inspect mysql5.5 | grep "IPAddress" 

2. 配置修改

之后進入我們之前的容器中歪赢,修改hive的相關(guān)配置

vim /usr/local/apache-hive-2.1.1-bin/conf/hive-site.xml

    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>root</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://172.17.0.3:3306/hive</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>

主要修改數(shù)據(jù)庫url、驅(qū)動单料、用戶名埋凯、密碼,數(shù)據(jù)庫url記得填mysql實例的地址扫尖,我使用的mysql實例是在另一個docker容器上递鹉,所以直接填那個容器的ip。

之后還要通過wget獲取mysql驅(qū)動到hive的lib下

cd /usr/local/apache-hive-2.1.1-bin/lib
wget http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.38/mysql-connector-java-5.1.38.jar

3. 初始化元數(shù)據(jù)庫

schematool -initSchema -dbType mysql

成功后提示:

# ... 省略一些輸出
Initialization script completed
schemaTool completed

4. 驗證

參考上一節(jié)的驗證過程

啟動 Hiveserver2

剛才我們都是通過hive命令直接進入hive交互界面藏斩,現(xiàn)在我們介紹一下如何啟動hiveserver2躏结,并通過beeline連接hiveserver2來進行相關(guān)操作。

1. 修改hadoop的一些權(quán)限配置

啟動hiveserver2之前狰域,需要先往hdfs的core-site.xml加入以下配置:

vim /usr/local/hadoop-2.7.0/etc/hadoop/core-site.xml

<property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
</property>

然后重啟hdfs:

stop-dfs.sh
start-dfs.sh

2. 后臺啟動hiveserver2

nohup hiveserver2 &

3. 驗證

通過beeline連接

beeline -u jdbc:hive2://127.0.0.1:10000

查詢一下之前建立的表看下是否能正常訪問

select * from test;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末媳拴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子兆览,更是在濱河造成了極大的恐慌屈溉,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抬探,死亡現(xiàn)場離奇詭異子巾,居然都是意外死亡,警方通過查閱死者的電腦和手機小压,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門线梗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怠益,你說我怎么就攤上這事仪搔。” “怎么了蜻牢?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵烤咧,是天一觀的道長。 經(jīng)常有香客問我抢呆,道長煮嫌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任抱虐,我火速辦了婚禮昌阿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己宝泵,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布轩娶。 她就那樣靜靜地躺著儿奶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鳄抒。 梳的紋絲不亂的頭發(fā)上闯捎,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音许溅,去河邊找鬼瓤鼻。 笑死,一個胖子當著我的面吹牛贤重,可吹牛的內(nèi)容都是我干的茬祷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼并蝗,長吁一口氣:“原來是場噩夢啊……” “哼祭犯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起滚停,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤沃粗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后键畴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體最盅,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年起惕,在試婚紗的時候發(fā)現(xiàn)自己被綠了涡贱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡惹想,死狀恐怖盼产,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情勺馆,我是刑警寧澤戏售,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站草穆,受9級特大地震影響灌灾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜悲柱,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一锋喜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦嘿般、人聲如沸段标。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逼庞。三九已至,卻和暖如春瞻赶,著一層夾襖步出監(jiān)牢的瞬間赛糟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工砸逊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留璧南,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓师逸,卻偏偏與公主長得像司倚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子篓像,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 摘要:大數(shù)據(jù)門檻較高对湃,僅僅環(huán)境的搭建可能就要耗費我們大量的精力,本文總結(jié)了作者是如何搭建大數(shù)據(jù)環(huán)境的(單機版和集群...
    楊赟快跑閱讀 15,032評論 3 65
  • 最近在學習大數(shù)據(jù)技術(shù)遗淳,朋友叫我直接學習Spark拍柒,英雄不問出處,菜鳥不問對錯屈暗,于是我就開始了Spark學習拆讯。 為什...
    Plokmijn閱讀 26,536評論 6 26
  • 一、系統(tǒng)參數(shù)配置優(yōu)化 1养叛、系統(tǒng)內(nèi)核參數(shù)優(yōu)化配置 修改文件/etc/sysctl.conf种呐,添加如下配置,然后執(zhí)行s...
    張偉科閱讀 3,750評論 0 14
  • (搭建集群部分借鑒了kiwenlau/hadoop-cluster-docker中的內(nèi)容弃甥,不過那里的基礎(chǔ)環(huán)境是Ub...
    ProteanBear閱讀 3,840評論 0 12
  • 日課008 | 信仰值多少錢 001 信仰的價格: 一些經(jīng)濟學家想要測試信仰的真誠度爽室,做了一個實驗,找了兩個基督教...
    左非閱讀 311評論 0 1