ubuntu下hadoop、spark、hive、azkaban集羣搭建

 

星期二, 08. 十月 2019 11:01上午html

起始準備:

1. jdk安裝

在三臺(取決於你的機器數)機器上都執行如下操做:java

1)能夠經過apt-get安裝jdk,在命令行下執行 whereis java 來得到java的安裝路徑,或者手動下載jdk的安裝包來進行安裝node

2)在~/.bashrc文件或者/etc/profile文件加入如下參數mysql

    export JAVA_HOME=your_pathgit

    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATHgithub

3)命令行執行source ~/.bashrc或者source /etc/profile來使得參數生效(對應你所修改的文件) 4)最後執行 java -version 判斷java安裝是否成功web

2. ssh免密登陸

一樣須要在三臺機器上執行下述操做: 1) 切換到根目錄下,cd ~ 2) 在該目錄下執行ssh-keygen,sql

  • 能夠經過 ssh-copy-id 將祕鑰發給指定機器:shell

    ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@172.16.22.132,數據庫

  • 也能夠經過scp將祕鑰發給目標機器,而後在目標機器上新建 authorized_keys ,將祕鑰拷貝到該文件裏:

scp id_rsa.pub root@172.16.22.132:/root/.ssh     cd /root/.ssh/ cat id_rsa.pub >> authorized_keys

第一部分: hadoop集羣搭建

參考連接: https://www.cnblogs.com/charles1ee/p/11239375.html

hadoop版本是: 2.7.7

此次搭建的是hadoop的徹底分佈式版本,一個master節點,兩個slave節點

1. 修改/etc/hostname文件,改成master(master所在機器),或者slave1(節點1所在機器),slave2(節點2所在機器),修改保存後 重啓機器 ;

2. 在master機器上修改/etc/hosts文件,將域名和ip地址對應起來,以下圖,在修改結束後,slave1和slave2每臺機器上都拷貝一份,或者在原來的基礎上追加也可, 以下圖:

3. 在document目錄下新建workspace, 下述全部的組件都放在該目錄下。解壓hadoop-2.7.7.tar.gz,更名爲hadoop, 對該目錄執行 sudo chown -R 777 hadoop 4. 修改master配置文件

  • 修改hadoop-env.sh文件 export JAVA_HOME=your_path

  • 修改hdfs-site.xml文件

<configuration>
                                <property>
                                <name>dfs.replication</name>
                                <value>2</value>
                                </property>
                                <property>
                                <name>dfs.namenode.name.dir</name>
                                <value>file:/data/hadoop_data/hdfs/namenode</value>
                                </property>
                                <property>
                                 <name>dfs.datanode.data.dir</name>
                                <value>file:/data/hadoop_data/hdfs/datanode</value>
                                </property>
                                #設置secondaryNode爲slave1機器
                                <property>
                                <name>dfs.namenode.secondary.http-address</name>
                                <value>slave1:50090</value>
                                </property>
                            </configuration>
  • 修改core-site.xml文件

<configuration>
                                <property>
                                    <name>fs.defaultFS</name>
                                    <value>hdfs://master:9000</value>
                                </property>
                                <property>
                                    <name>hadoop.tmp.dir</name>
                                    <value>/data/hadoop_data/hadoop_tmp</value>
                                </property>
                            </configuration>
  • 修改mapred-site.xml文件

<configuration>
                                <property>
                                    <name>mapreduce.framework.name</name>
                                    <value>yarn</value>
                                </property>
                            </configuration>
  • 修改yarn-site.xml文件

<configuration>
                                <property>
                                <name>yarn.resourcemanager.hostname</name>
                                <value>master</value>
                                </property>
                                <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.address</name>
                                <value>master:8050</value>
                                </property>
                                <property>
                                <name>yarn.resourcemanager.scheduler.address</name>
                                <value>master:8030</value>
                                </property>
                                <property>
                                <name>yarn.resourcemanager.resource-tracker.address</name>
                                <value>master:8025</value>
                                </property>
                                #使用hadoop yarn運行pyspark時,不添加下面兩個參數會報錯
                                <property>
                                <name>yarn.nodemanager.pmem-check-enabled</name>
                                <value>false</value>
                                </property>
                                <property>
                                <name>yarn.nodemanager.vmem-check-enabled</name>
                                <value>false</value>
                                </property>
                                #下面三個參數是在配置azkaban時,定時任務一直處於preparing, 緣由是機器內存不夠
                                <property>
                                <name>yarn.scheduler.maximum-allocation-mb</name>
                                <value>12240</value>
                                </property>
                                <property>
                                <name>yarn.scheduler.minimum-allocation-mb</name>
                                <value>100</value>
                                </property>
                                <property>
                                <name>yarn.nodemanager.resource.memory-mb</name>
                                <value>12240</value>
                                </property>
                            </configuration>

5. 修改slave的配置文件 slave節點與master節點的配置大體相同,只是mapred-site.xml文件與master節點不相同,該配置爲

  • 修改mapred-site.xml文件

<configuration>
                                <property>
                                <name>mapred.job.tracker</name>
                                <value>master:54311</value>
                                </property>
                            </configuration>

6. 日誌文件修改 執行hadoop 命令報WARNING解決辦法 vim log4j.properties添加: log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR

7. 安裝並配置完成後返回master節點格式化namenode

    cd /data/hadoop_data/hdfs/namenode

    hadoop namenode -format

在master節點執行命令

    start-all.sh //啓動

    stop-all.sh //關閉

8. 如下是界面圖( 注: 在輸入url時,將hadoop-master-001換成咱們上面主機的域名master )

第二部分: spark集羣搭建

spark組件能夠經過編譯源代碼來得到,直接從官網下載(http://spark.apache.org/downloads), 點擊下圖方框的連接,找到本身須要的版本。

本次搭建所使用的版本是2.1.0 參考連接: http://dblab.xmu.edu.cn/blog/1086-2/ spark的搭建步驟:

  1. 採用源碼編譯獲得支持hive的spark版本;

    1. 進入下載目錄,執行命令 tar -zxvf spark-2.1.0.tar.gz 解壓spark的包

    2. 進入spark的根目錄,執行命令 ./dev/make-distribution.sh --name 2.7.3 --tgz -Pyarn -Phadoop-2.7 -Dhadoop.version=2.7.7 -Phadoop-provided -Phive -Phive-thriftserver -DskipTests 該命令開始編譯spark的源碼,最終會在根目錄下生成一個tgz的包 spark-2.1.0-bin-2.7.3.tgz

    3. 各個參數的解釋以下:

      • -DskipTests,不執行測試用例,但編譯測試用例類生成相應的class文件至target/test- classes下。

      • -Dhadoop.version 和-Phadoop: 本機上Hadoop的版本號,不加此參數時hadoop 版本爲1.0.4 。

      • -Pyarn :是否支持Hadoop YARN ,不加參數時爲不支持yarn 。

      • -Phive和-Phive-thriftserver:是否在Spark SQL 中支持hive ,不加此參數時爲不支持hive 。

      • –with-tachyon :是否支持內存文件系統Tachyon ,不加此參數時不支持tachyon 。

      • –tgz :在根目錄下生成 spark-$VERSION-bin.tgz ,不加此參數時不生成tgz 文件,只生成/dist 目錄。

      • –name :和–tgz結合能夠生成spark-$VERSION-bin-$NAME.tgz的部署包,不加此參數時NAME爲hadoop的版本號

  2.  將 spark-2.1.0-bin-2.7.3.tgz 包拷貝到其中一臺機器上解壓,解壓後的文件夾重命名爲spark,進入該目錄下的/conf文件夾下,這裏是spark的全部配置文件目錄,在這邊須要修改三個文件,分別是slaves, hive-site.xml 和 spark-env.sh文件;

    1. 修改~/.bashrc

        export SPARK_HOME=/home/benhairui/Documents/workspace/spark 
        export PATH=$PATH:$SPARK_HOME/bin

                   2. slaves配置文件修改,在該文件末尾添加slave節點,這裏是slave1和slave2.

        slave1 
        slave2
  • 修改spark-env.sh文件

#master實例綁定的ip地址,例如綁定到一個公網的ip
                             export SPARK_MASTER_HOST=master 
                             #master實例綁定的端口(默認是7077)
                             export SPARK_MASTER_PORT=7077 
                             #scala的安裝路徑
                             export SCALA_HOME=/usr/share/scala-2.11 
                             #java的安裝路徑
                             export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
                             #hadoop的安裝路徑
                             export HADOOP_HOME=/home/benhairui/Documents/workspace/hadoop
                             #hadoop的配置文件路徑
                             export HADOOP_CONF_DIR=/home/benhairui/Documents/workspace/hadoop/etc/hadoop
                             #該參數的官方解釋: spark使用hadoop客戶端的libraries來訪問HDFS和YARN,spark1.4後「hadoop free」的spark包容許用戶
                             #鏈接任何的hadoop版本集羣,爲了使用這個版本,須要在spark-env.sh裏修改SPARK_DIST_CLASSPATH, 包含hadoop的jar包
                             #https://spark.apache.org/docs/latest/hadoop-provided.html,該連接有詳細的參數解釋
                             export SPARK_DIST_CLASSPATH=$(/home/benhairui/Documents/workspace/hadoop/bin/hadoop classpath)

spark測試 到此,spark的安裝結束,能夠經過下述的方式來簡單的驗證是否安裝成功:

1. 先經過命令行啓動hadoop集羣, start-all.sh

2. 經過命令行啓動spark集羣,start-all.sh spark啓動後master節點比沒啓動jps下多了一個"master"標識,以下: 

而slave節點多了一個"worker"標識,以下:

後續的測試,能夠經過spark-shell鏈接spark集羣來,訪問hdfs的數據來進一步確認

./spark-shell --master spark://master:7077

第三部分: hive搭建(非集羣,只在hadoop的master節點上配置)

參考連接: https://blog.csdn.net/Dante_003/article/details/72867493

hive的版本是2.3.6

由於hive on spark, 是與spark集羣作交互,所以,須要修改對spark的一些配置文件進行修改,主要涉及到hive-site.xml 和 spark-env.sh。

  • 將spark裏的scala-library-2.11.8.jar、spark-network-common_2.11-2.1.1.jar、spark-core_2.11-2.1.1.jar包,拷貝到hive的lib文件夾中;同時下載mysql 的jdbc鏈接包mysql-connector-java-5.1.38.jar,也將其放入hive的lib包中。

  • 修改hive-site.xml, 同時將其拷貝到spark的conf目錄下

<configuration>
							<!--jdbc -->
						<property>
						    <name>javax.jdo.option.ConnectionURL</name>
						    <value>jdbc:mysql://192.168.5.111:3306/hive2?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
						</property>
						<property>
						    <name>javax.jdo.option.ConnectionDriverName</name>
						    <value>com.mysql.jdbc.Driver</value>
						</property>
						<property>
						    <name>javax.jdo.option.ConnectionUserName</name>
						    <value>benhairui</value>
						</property>
						<property>
						    <name>javax.jdo.option.ConnectionPassword</name>
						    <value>Mahairui123**</value>
						    <description>password to use against metastore database</description>
						</property>

						<!--spark engine -->
						<property>
						    <name>hive.execution.engine</name>
						    <value>spark</value>
						</property>
						<property>
						    <name>hive.enable.spark.execution.engine</name>
						    <value>true</value>
						</property>
						<!--sparkcontext -->
						<property>
						    <name>spark.master</name>
						    <value>yarn-cluster</value>
						</property>
						<property>
						    <name>spark.serializer</name>
						    <value>org.apache.spark.serializer.KryoSerializer</value>
						</property>
						<!--下面的根據實際狀況配置 -->
						<property>
						    <name>spark.executor.instances</name>
						    <value>3</value>
						</property>
						<property>
						    <name>spark.executor.cores</name>
						    <value>4</value>
						</property>
						<property>
						    <name>spark.executor.memory</name>
						    <value>10240m</value>
						</property>
						<property>
						    <name>spark.driver.cores</name>
						    <value>2</value>
						</property>
						<property>
						    <name>spark.driver.memory</name>
						    <value>4096m</value>
						</property>
						<property>
						    <name>spark.yarn.queue</name>
						    <value>default</value>
						</property>
						<property>
						    <name>spark.app.name</name>
						    <value>myInceptor</value>
						</property>

						<!--事務相關 -->
						<property>
						    <name>hive.support.concurrency</name>
						    <value>true</value>
						</property>
						<property>
						    <name>hive.enforce.bucketing</name>
						    <value>true</value>
						</property>
						<property>
						    <name>hive.exec.dynamic.partition.mode</name>
						    <value>nonstrict</value>
						</property>
						<property>
						    <name>hive.txn.manager</name>
						    <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
						</property>
						<property>
						    <name>hive.compactor.initiator.on</name>
						    <value>true</value>
						</property>
						<property>
						    <name>hive.compactor.worker.threads</name>
						    <value>1</value>
						</property>
						<property>
						    <name>spark.executor.extraJavaOptions</name>
						    <value>-XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
						    </value>
						</property>
						<!--其它 -->
						<property>
						    <name>hive.server2.enable.doAs</name>
						    <value>false</value>
						</property>
						<!-- 指定hive服務暴露出去的端口,默認是10000,有時候會不起做用,能夠直接顯示指定下
						<property>
						    <name>hive.server2.thrift.port</name>
						    <value>11000</value>
						</property>

						<property>
						     <name>hive.server2.thrift.bind.host</name>
						    <value>localhost</value>
						</property>
						-->				
						</configuration>
  • 修改hive-env.sh

    export HADOOP_HOME=/home/benhairui/Documents/workspace/hadoop 
    export HIVE_CONF_DIR=/home/benhairui/Documents/workspace/hive/conf 
    export HIVE_AUX_JARS_PATH=/home/benhairui/Documents/workspace/hive/lib
  • 修改~/.bashrc

    export HIVE_HOME=/home/benhairui/Documents/workspace/hive 
    export PATH=$PATH:$HIVE_HOME/bin
  • 修改spark的spark-env.sh, 在spark-env.sh裏添加下面配置

    export HIVE_CONF_DIR=/home/benhairui/Documents/workspace/hive/conf 
    export SPARK_CLASSPATH=$SPARK_CLASSPATH:/home/benhairui/Documents/workspace/hive/lib/mysql-connector-java-5.1.40-bin.jar

初始化數據庫

/opt/hive/bin/schematool -initSchema -dbType mysql

當出現下面的信息表示初始化成功

    Starting metastore schema initialization to 2.0.0

    Initialization script hive-schema-2.0.0.mysql.sql

    Initialization script completed schemaTool completed

hive測試 啓動hive, 執行命令

    hiveserver2 (./hive --service hiveserver2)

用beeline來鏈接hive2

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

進入命令行後,就可使用hive的命令來進行建立和查詢表等。下面是個人查詢語句和結果:

固然,你也能夠去元信息所在的mysql數據庫中查看metastore的信息。

第四部分: azkaban搭建(非集羣)

參考連接: https://blog.csdn.net/weixin_35852328/article/details/79327996

azkaban是一個任務調度系統,本次搭建的也是一個單機版的azkaban。

  1. 首先從github上clone azkaban的源碼: git clone https://github.com/azkaban/azkaban.git

  2. azkaban是用gradle管理的,所以,用gradlew對源碼進行編譯和打包, 進入根目錄下,執行下面的命令: ./gradlew clean ./gradlew distTar 這樣,在根目錄下若干文件夾下的build/distribution下能夠看到各個發佈包.

  3. 拷貝azkaban-exec-server、azkaban-web-server下的tar包到目標文件夾下,並解壓,分別重命名爲executor和server, 並拷貝./azkaban-db/build/sql文件夾下的sql文件。 azkaban依賴於關係型數據庫,所以找一個mysql, 執行下述的命令: 進入mysql mysql> create database azkaban; mysql> use azkaban; Database changed mysql> source /home/hadoop/azkaban-2.5.0/create-all-sql-2.5.0.sql;

  4. 建立ssl配置 命令: keytool -keystore keystore -alias jetty -genkey -keyalg RSA

  5. 運行此命令後,會提示輸入當前生成 keystor的密碼及相應信息,輸入的密碼請勞記,信息以下:再次輸入新密碼: 
    您的名字與姓氏是什麼? 
    [Unknown]: 
    您的組織單位名稱是什麼? 
    [Unknown]: 
    您的組織名稱是什麼? 
    [Unknown]: 
    您所在的城市或區域名稱是什麼? 
    [Unknown]: 
    您所在的州或省份名稱是什麼? 
    [Unknown]: 
    該單位的兩字母國家代碼是什麼 
    [Unknown]: CN 
    CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN 正確嗎? 
    [否]: y
    輸入的主密碼 
    (若是和 keystore 密碼相同,按回車): 
    再次輸入新密碼: 
    完成上述工做後,將在當前目錄生成 keystore 證書文件,將keystore 考貝到 azkaban web服務器根目錄中的bin目錄下.如:cp keystore azkaban/server/bin
    配置文件 
    注:先配置好服務器節點上的時區 
    一、先生成時區配置文件Asia/Shanghai,用交互式命令 tzselect 便可 
    二、拷貝該時區文件,覆蓋系統本地時區配置 

  6. 進入executor/conf目錄下,修改azkaban.properties:

# Azkaban Personalization Settings
                    #服務器名稱
                    azkaban.name=Test
                    azkaban.label=My Local Azkaban
                    azkaban.color=#FF3601
                    azkaban.default.servlet.path=/index
                    #默認根目錄
                    web.resource.dir=web/
                    default.timezone.id=Asia/Shanghai
                    # Azkaban UserManager class
                    user.manager.class=azkaban.user.XmlUserManager
                    user.manager.xml.file=conf/azkaban-users.xml
                    # Loader for projects
                    executor.global.properties=conf/global.properties
                    azkaban.project.dir=projects
                    # Velocity dev mode
                    velocity.dev.mode=false
                    # Azkaban Jetty server properties.
                    jetty.use.ssl=true
                    jetty.maxThreads=25
                    jetty.port=8081
                    # Where the Azkaban web server is located
                    azkaban.webserver.url=http://master:8081
                    # mail settings
                    mail.sender=
                    mail.host=
                    # User facing web server configurations used to construct the user facing server URLs. They are useful when there is a reverse proxy between Azkaban web servers and users.
                    # enduser -> myazkabanhost:443 -> proxy -> localhost:8081
                    # when this parameters set then these parameters are used to generate email links.
                    # if these parameters are not set then jetty.hostname, and jetty.port(if ssl configured jetty.ssl.port) are used.
                    # azkaban.webserver.external_hostname=myazkabanhost.com
                    # azkaban.webserver.external_ssl_port=443
                    # azkaban.webserver.external_port=8081
                    job.failure.email=
                    job.success.email=
                    lockdown.create.projects=false
                    cache.directory=cache
                    # JMX stats
                    jetty.connector.stats=true
                    executor.connector.stats=true
                    # Azkaban plugin settings
                    azkaban.jobtype.plugin.dir=plugins/jobtypes
                    # Azkaban mysql settings by default. Users should configure their own username and password.
                    database.type=mysql
                    mysql.port=3306
                    mysql.host=192.168.5.111
                    mysql.database=azkaban
                    mysql.user=benhairui
                    mysql.password=Mahairui123**
                    mysql.numconnections=100
                    # Azkaban Executor settings
                    executor.maxThreads=50
                    executor.flow.threads=30
                    executor.port=12321

6.進入server/conf目錄下,修改azkaban.properties:

# Azkaban Personalization Settings
					azkaban.name=Test
					azkaban.label=My Local Azkaban
					azkaban.color=#FF3601
					azkaban.default.servlet.path=/index
					web.resource.dir=web/
					default.timezone.id=Asia/Shanghai
					# Azkaban UserManager class
					user.manager.class=azkaban.user.XmlUserManager
					user.manager.xml.file=conf/azkaban-users.xml
					# Loader for projects
					executor.global.properties=conf/global.properties
					azkaban.project.dir=projects
					# Velocity dev mode
					velocity.dev.mode=false
					# Azkaban Jetty server properties.
					jetty.use.ssl=true
					jetty.maxThreads=25
					jetty.port=8081
					jetty.ssl.port=8443
					jetty.keystore=keystore
					jetty.password=mahairui
					jetty.keypassword=mahairui
					jetty.truststore=keystore
					jetty.trustpassword=mahairui
					# Azkaban Executor settings
					executor.port=12321
					# mail settings
					mail.sender=
					mail.host=
					# User facing web server configurations used to construct the user facing server URLs. They are useful when there is a reverse proxy between Azkaban web servers and users.
					# enduser -> myazkabanhost:443 -> proxy -> localhost:8081
					# when this parameters set then these parameters are used to generate email links.
					# if these parameters are not set then jetty.hostname, and jetty.port(if ssl configured jetty.ssl.port) are used.
					# azkaban.webserver.external_hostname=myazkabanhost.com
					# azkaban.webserver.external_ssl_port=443
					# azkaban.webserver.external_port=8081
					job.failure.email=
					job.success.email=
					lockdown.create.projects=false
					cache.directory=cache
					# JMX stats
					jetty.connector.stats=true
					executor.connector.stats=true
					# Azkaban mysql settings by default. Users should configure their own username and password.
					database.type=mysql
					mysql.port=3306
					mysql.host=192.168.5.111
					mysql.database=azkaban
					mysql.user=benhairui
					mysql.password=Mahairui123**
					mysql.numconnections=100
					#Multiple Executor
					azkaban.use.multiple.executors=true
					#azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,CpuStatus
					azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus
					azkaban.executorselector.comparator.NumberOfAssignedFlowComparator=1
					azkaban.executorselector.comparator.Memory=1
					azkaban.executorselector.comparator.LastDispatched=1
					azkaban.executorselector.comparator.CpuUsage=1

注: azkaban.executorselector.filters參數,其中MinimumFreeMemory過濾器會檢查executor主機空餘內存是否會大於6G,若是不足6G,則web-server不會將任務交由該主機執行,能夠將其去掉

7.用戶配置,修改web/conf目錄下的azkaban-users.xml文件。能夠爲其添加用戶,固然不加也是能夠的。

<azkaban-users>
						<user username="azkaban" password="azkaban" roles="admin" groups="azkaban" />
						<user username="metrics" password="metrics" roles="metrics"/>
						#添加下面這行
						<user username="admin" password="admin" roles="admin,metrics" />
						<role name="admin" permissions="ADMIN" />
						<role name="metrics" permissions="METRICS"/>
					</azkaban-users>

8.啓動測試

在web下執行 

    ./bin/start-web.sh

在executor下執行 

    ./bin/start-exec.sh

啓動後,在瀏覽器下輸入: https://服務器地址(這是就是master):8443便可訪問。以下圖:

而後輸入用戶名和密碼,即上面azkaban-users.xml裏的用戶名和密碼,便可訪問。 進入後,能夠上傳本身的調度任務,以下圖:

最後,直接點擊"Execute flow", 便可執行本身的依賴任務, 同時,能夠看到相關的DAG圖,以及直接結束後的日誌,以下圖:

注: 在執行任務調度的時候,可能會發生: "executor became inactive before setting up the flow 11"的錯誤,這個是官方的一個bug,咱們須要手動激活executor, 在命令行執行下面的命令:

curl http://${executorHost}:${executorPort}/executor?action=activate

結束

至此,相關組件的搭建已經結束,若有問題,能夠直接留言,很是感謝觀看!

相關文章
相關標籤/搜索