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

结束

至此,相关组件的搭建已经结束,若有问题,能够直接留言,很是感谢观看!

相关文章
相关标签/搜索