Skip to main content

Command Palette

Search for a command to run...

Hadoop生态&组件部署大总结

Updated
5 min read

准备

下载地址

Apache参考源

中科大开源软件镜像https://mirrors.ustc.edu.cn/apache/
清华大学开源软件镜像站https://mirrors.tuna.tsinghua.edu.cn/apache/
Apache 官方提供镜像https://dlcdn.apache.org/

| Sqoop已不再被 Apache 维护,需要下载请前往GitHub,请参考 快捷下载 内地址

快捷下载

HADOOPhttps://mirrors.ustc.edu.cn/apache/hadoop/
HIVEhttps://mirrors.ustc.edu.cn/apache/hive/
Flumehttps://mirrors.ustc.edu.cn/apache/flume/
Sqoophttps://github.com/apache/sqoop/releases
Kafkahttps://mirrors.ustc.edu.cn/apache/kafka/
Sparkhttps://mirrors.ustc.edu.cn/apache/spark/
Hbasehttps://mirrors.ustc.edu.cn/apache/hbase/
Pighttps://mirrors.ustc.edu.cn/apache/pig/
Zookeeperhttps://mirrors.ustc.edu.cn/apache/Zookeeper/

&nbsp

环境变量参考

Jdk

JAVA_HOME=/usr/base/jdk1.8.0_301
JRE_HOME=${JAVA_HOME}/jre
CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
PATH=${JAVA_HOME}/bin:$PATH
export JAVA_HOME JRE_HOME CLASSPATH PATH

Scala

export SCALA_HOME=/usr/base/scala-2.11.7
export PATH=$PATH:$SCALA_HOME/bin

HADOOP

export HADOOP_HOME=/usr/base/hadoop-2.10.1
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

Flume

export FLUME_HOME=/usr/base/apache-flume-1.9.0-bin
export FLUME_CONF_DIR=$FLUME_HOME/conf
export FLUME_LOG_DIR=$FLUME_HOME/log
export PATH=$PATH:$FLUME_HOME/bin

ZooKeeper

export ZOOKEEPER_HOME=/usr/base/apache-zookeeper-3.5.9-binn
export PATH=$ZOOKEEPER_HOME/bin:$PATH

Sqoop

export SQOOP_HOME=/usr/base/apache-flume-1.9.0-bin
export PATH=$PATH:$SQOOP_HOME/bin

Hive

export HIVE_HOME=/usr/base/apache-hive-2.3.9-bin
export PATH=$HIVE_HOME/bin:$HIVE_HOME/conf:$PATH
export FLINK_HOME=/usr/base/flink-1.13.2
export PATH=$FLINK_HOME/bin:$PATH

Hbase

export HBASE_HOME=/usr/base/hbase-2.4.6
export PATH=$PATH:$HBASE_HOME/bin

Pig

export PIG_HOME=/usr/base/pig-0.17.0
export PATH=$PATH:$PIG_HOME/bin:$PIG_HOME/conf

Spark

export SPARK_HOME=/usr/base/spark-3.1.2-bin-without-hadoop
export PATH=$SPARK_HOME/bin:$PATH


Hadoop

  • 「$PATH」修改为自己的路径
  • 「NAME」修改为 NameNode Host
  • 「DataNode HOST n」 修改为 DataNode Host 序列

通用操作

/etc/hosts

「IP 1」 「HOST 1」
「IP 2」 「HOST 2」
「IP 3」 「HOST 3」
..................
「IP n」 「HOST n」

~/.ssh/id_rsa

ssh-keygen -t rsa

authorized_keys

ssh-copy-id IP

masters

「NAME」

slaves

「DataNode HOST 1」

「DataNode HOST 2」

............

「DataNode HOST n」

&nbsp

各模式下配置文件

伪分布式

core-site.xml

<configuration>
      <!-- 缓存目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>「$PATH」/tmp</value>
    </property>
      <!-- 指定 NameNode -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://「NAME」:9000</value>
    </property>
</configuration>

完全分布式

core-site.xml

<configuration>
      <!-- 缓存目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>「$PATH」/tmp</value>
    </property>
      <!-- 指定 NameNode -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://「NAME」:9000</value>
    </property>
</configuration>

yarn-site.xml

<configuration>
    <!-- 指定Yarn的(ResourceManager)地址-->     
    <property>
            <name>yarn.resourcemanager.hostname</name>
            <value>「NAME」</value>
    </property> 
<configuration>

可选参数

<!-- hdfs-site.xml -->

<proterty>
    <name>dfs.namenode.name.dir</name>
    <value>「$PATH」</value>
</proterty>

<proterty>
    <name>dfs.datanode.data.dir</name>
    <value>「$PATH」</value>
</proterty>

&nbsp

HA分布式

Zoopkeeper 配置

/conf/zoo.cfg
dataDir=/zookeeper/data

server.myid1=「NAME 1」:2888:3888
server.myid2=「NAME 2」:2888:3888
server.myid3=「DataNode HOST 1」:2888:3888
server.myid4=「DataNode HOST 2」:2888:3888:observer
myid
ssh 「NAME 1」 "echo "1" > /zookeeper/data/myid"
ssh 「NAME 2」 "echo "2" > /zookeeper/data/myid"
ssh 「DataNode HOST 1」 "echo "3" > /zookeeper/data/myid"
ssh 「DataNode HOST 2」 "echo "4" > /zookeeper/data/myid"

Hadoop 配置

core-site.xml
<configuration>
        <!--指定hdfs nameservice-->
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://jed</value>
        </property>
        <!--指定hadoop工作目录-->
        <property>
            <name>hadoop.tmp.dir</name>
            <value>「$PATH」/hd</value>
        </property>
        <!--指定zookeeper集群访问地址-->
        <property>
            <name>ha.zookeeper.quorum</name>
            <value>「$HOST」:2181,「DataNode HOST n」:2181</value>
        </property>
</configuration>
hdfs-site.xml
<configuration>
        <!--与core-site.xml中一致的hdfs nameservice-->
        <property>
                <name>dfs.nameservices</name>
                <value>jed</value>
        </property>

        <!--jed的NameNode,nn1,nn2 -->
        <property>
              <name>dfs.ha.namenodes.jed</name>
              <value>nn1,nn2</value>
        </property>

        <!-- 「NAME 1」 的 RPC 通信地址 -->
        <property>
              <name>dfs.namenode.rpc-address.jed.nn1</name>
              <value>「NAME 1」:9000</value>
        </property>
        <!-- nn1 的 http 通信地址 -->
        <property>
              <name>dfs.namenode.http-address.jed.nn1</name>
              <value>「NAME 1」:50070</value>
        </property>
        <!-- nn2 的 RPC 通信地址 -->
        <property>
              <name>dfs.namenode.rpc-address.jed.nn2</name>
              <value>「NAME 2」:9000</value>
        </property>
        <!-- nn2 的 http 通信地址 -->
        <property>
              <name>dfs.namenode.http-address.jed.nn2</name>
              <value>「NAME 2」:50070</value>
        </property>

        <!-- 指定NameNode的edits元数据在JournalNode 上的存放位置 -->
        <property>
              <name>dfs.namenode.shared.edits.dir</name>
              <value>qjournal://「NAME 1」:8485;「NAME 2」:8485;「DataNode HOST n」:8485/jed</value>
        </property>

        <!-- 指定 JournalNode 在本地磁盘存放数据的位置 -->
        <property>
              <name>dfs.journalnode.edits.dir</name>
              <value>「$PATH」/jd</value>
        </property>

        <!-- 开启 NameNode 失败自动切换 -->
        <property>
              <name>dfs.ha.automatic-failover.enabled</name>
              <value>true</value>
        </property>

        <!-- 配置失败自动切换实现方式 -->
        <!-- 此处配置较长,在安装的时候切记检查不要换行-->
        <property>
              <name>dfs.client.failover.proxy.provider.jed</name>
              <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
        <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制占用一行-->
        <property>
              <name>dfs.ha.fencing.methods</name>
              <value>
                      sshfence
                     shell(/bin/true)
              </value>
        </property>
        <!-- 使用 sshfence 隔离机制时需要 ssh 免登陆 -->
        <property>
              <name>dfs.ha.fencing.ssh.private-key-files</name>
              <value>/root/.ssh/id_rsa</value>
        </property>
        <!-- 配置 sshfence 隔离机制超时时间(20s) -->
        <property>
              <name>dfs.ha.fencing.ssh.connect-timeout</name>
              <value>20000</value>
        </property>
</configuration>
mapred-site.xml
<configuration>
        <!-- 指定mapreduce框架为yarn方式 -->
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
</configuration>
yarn-site.xml
<configuration>

<!-- Site specific YARN configuration properties -->
            <!-- 开启 RM 高可用 -->
        <property>
            <name>yarn.resourcemanager.ha.enabled</name>
            <value>true</value>
        </property>

        <!-- 指定 RM 的 cluster id,可以自定义-->
        <property>
            <name>yarn.resourcemanager.cluster-id</name>
            <value>Cyarn</value>
        </property>

        <!-- 指定 RM 的名字,可以自定义 -->
        <property>
            <name>yarn.resourcemanager.ha.rm-ids</name>
            <value>rm1,rm2</value>
        </property>

        <!-- 分别指定 RM 的地址 -->
        <property>
            <name>yarn.resourcemanager.hostname.rm1</name>
            <value>「HashNode HOST 1」</value>
        </property>

        <property>
            <name>yarn.resourcemanager.hostname.rm2</name>
            <value>「HashNode HOST 2」</value>
        </property>

        <!-- 指定 zk 集群地址 -->
        <property>
            <name>yarn.resourcemanager.zk-address</name>
            <value>「NAME 1」:2181,「NAME 2」:2181,「HashNode HOST n」:2181</value>
        </property>

</configuration>


Hive

设置 hive-env.sh 配置文件

进入 hive-0.12.0/conf 目录,复制 hive-env.sh.templaetehive-env.sh

cd /app/hive-0.12.0/conf
cp hive-env.sh.template hive-env.sh
sudo vi hive-env.sh

分别设置 HADOOP_HOMEHIVE_CONF_DIR 两个值:

export HADOOP_HOME=/app/hadoop-1.1.2
export HIVE_CONF_DIR=/app/hive-0.12.0/conf

&nbsp

设置 hive-site.xml 配置文件

复制 hive-default.xml.templaetehive-site.xml

cd /app/hive-0.12.0/conf
cp hive-default.xml.template hive-site.xml
sudo vi hive-site.xml

加入配置项

默认 metastore 在本地,添加配置改为非本地。

<property>
  <name>hive.metastore.local</name>
  <value>false</value>
</property>

修改配置项

hive 默认为 derby 数据库,需要把相关信息调整为 mysql 数据库。

<property>
    <name>hive.metastore.uris</name>
    <value>thrift://hadoop:9083</value>
</property>
<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://hadoop:3306/hive?=createDatabaseIfNotExist=true</value>
</property>
<property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <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>hive</value>
</property>

&nbsp

mysql驱动jar包

放置到 $HIVE_HOME/lib

mv mysql-connector-java-5.1.32-bin.jar /opt/home/apache-hive-1.2.1-bin/lib/

&nbsp

订正错误项

hive.metastore.schema.verification 配置项值修改为 false。

 <property>
   <name>hive.metastore.schema.verification</name>
   <value>false</value>
 </property>

/app/hive-0.12.0/conf/hive-site.xml 文件中的大概在 2000 行位置左右

把原来的 <value>auth</auth> 修改为 <value>auth</value>,如下所示:

 <property>
    <name>hive.server2.thrift.sasl.qop</name>
    <value>auth</auth>
  </property>


Flume

设置 flume-env.sh 配置文件

$FLUME_HOME/conf 下复制改名 flume-env.sh.templateflume-env.sh,修改 conf/ flume-env.sh 配置文件

cd /app/flume-1.5.2/conf
cp flume-env.sh.template flume-env.sh
sudo vi flume-env.sh

修改配置文件内容

JAVA_HOME= /app/lib/jdk1.7.0_55
JAVA_OPTS="-Xms100m -Xmx200m -Dcom.sun.management.jmxremote"


Sqoop

设置 bin/configure-sqoop 配置文件

修改 bin/configure-sqoop 配置文件。

cd /app/sqoop-1.4.5/bin
sudo vi configure-sqoop

注释掉 HBase 和 Zookeeper 等检查(除非使用 HBase 和 Zookeeper 等 HADOOP 上的组件)。

&nbsp

设置 conf/sqoop-env.sh 配置文件

如果不存在 sqoop-env.sh 文件,复制 sqoop-env-template.sh 文件,然后修改 sqoop-env.sh 配置文件。

cd /app/sqoop-1.4.5/conf
cp sqoop-env-template.sh sqoop-env.sh
sudo vi sqoop-env.sh

设置 hadoop 运行程序所在路径和 hadoop-*-core.jar 路径(Hadoop1.X 需要配置

export HADOOP_COMMON_HOME=/app/hadoop-1.1.2
export HADOOP_MAPRED_HOME=/app/hadoop-1.1.2

编译配置文件 sqoop-env.sh 使之生效。


Kafka

Kafka所有的配置文件都在“$KAFKA_HOME/config”目录下,修改以下配置文件前,需要切换到“$KAFKA_HOME/config”目录。

cd $KAFKA_HOME/config

修改server.properties文件

vim server.properties

内容修改如下:

broker.id=0

port=6667

host.name=agent1

log.dirs=/data/data1/kafka

zookeeper.connect=agent1:2181,agent2:2181,agent3:2181

| 其中,参数host.name可填写agent1对应的IP地址log.dirs为实际的存储数据路径

修改节点相关参数。

登录agent2,修改server.properties。

vim server.properties

内容修改如下:

broker.id=1
host.name=agent2 #可填对应的IP地址

登录agent3,修改server.properties。

vim server.properties

内容修改如下:

broker.id=2
host.name=agent3 #可填对应的IP地址


Spark

Spark所有的配置文件都在“$SPARK_HOME/conf“目录下,修改以下配置文件前,切换到“$SPARK_HOME/conf”目录。

cd $SPARK_HOME/conf

修改spark-env.sh

  1. 以spark-env.sh.template为模板,拷贝一份命名为spark-env.sh。
cp spark-env.sh.template spark-env.sh
  1. 编辑spark-env.sh文件。
export JAVA_HOME=/usr/local/jdk8u252-b09
export HADOOP_HOME=/usr/local/hadoop 
export SCALA_HOME=/usr/local/scala 
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop export HDP_VERSION=3.1.0

修改spark-defaults.conf

修改文件

echo "spark.master                     yarn" >> spark-defaults.conf
echo "spark.eventLog.enabled           true" >> spark-defaults.conf
echo "spark.eventLog.dir               hdfs://server1:9000/spark2-history" >> spark-defaults.conf
echo "spark.eventLog.compress          true" >> spark-defaults.conf
echo "spark.history.fs.logDirectory    hdfs://server1:9000/spark2-history" >> spark-defaults.conf

同步hadoop的core-site.xml和hdfs-site.xml

同步文件

cp /usr/local/hadoop/etc/hadoop/core-site.xml /usr/local/spark/conf 
cp /usr/local/hadoop/etc/hadoop/hdfs-site.xml /usr/local/spark/conf

同步mariadb-java-client包

同步文件

cp /usr/local/hive/lib/mariadb-java-client-2.3.0.jar /usr/local/spark/jars

Hbase

HBase所有的配置文件都在“HBASE_HOME/conf”目录下,修改以下配置文件前,切换到“HBASE_HOME/conf”目录。

cd $HBASE_HOME/conf

修改hbase-env.sh

修改环境变量JAVA_HOME为绝对路径,HBASE_MANAGES_ZK设为false。

export JAVA_HOME=/usr/local/jdk8u252-b09 
export HBASE_MANAGES_ZK=false 
export HBASE_LIBRARY_PATH=/usr/local/hadoop/lib/native

修改hbase-site.xml

vim hbase-site.xml

添加或修改configuration标签范围内的部分参数。

<configuration>
    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://server1:9000/HBase</value>
    </property>
    <property>
        <name>hbase.tmp.dir</name>
        <value>/usr/local/hbase/tmp</value>
    </property>
    <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
    </property>
    <property>
        <name>hbase.unsafe.stream.capability.enforce</name>
        <value>false</value>
    </property>
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>agent1:2181,agent2:2181,agent3:2181</value>
    </property>
    <property>
        <name>hbase.unsafe.stream.capability.enforce</name>
        <value>false</value>
    </property>
</configuration>

&nbsp

修改regionservers

vim regionservers

将regionservers文件内容替换为agent节点IP(可用主机名代替)。

agent1
agent2
agent3

&nbsp

拷贝hdfs-site.xml

拷贝hadoop目录下的的的hdfs-site.xml文件到“hbase/conf/”目录,可选择软链接或拷贝。

cp /usr/local/hadoop/etc/hadoop/hdfs-site.xml /usr/local/hbase/conf/hdfs-site.xml

之后请自行同步至各节点

More from this blog

【两万字总结】Spark 部署与入门

Spark 介绍 核心概念 Spark 是 UC Berkeley AMP lab 开发的一个集群计算的框架,类似于 Hadoop,但有很多的区别。 最大的优化是让计算任务的中间结果可以存储在内存中,不需要每次都写入 HDFS,更适用于需要迭代的 MapReduce 算法场景中,可以获得更好的性能提升。 例如一次排序测试中,对 100TB 数据进行排序,Spark 比 Hadoop 快三倍,并且只需要十分之一的机器。 Spark 集群目前最大的可以达到 8000 节点,处理的数据达到 PB 级别...

Oct 20, 202115 min read

【引言】浙大机器学习课程记录

机器学习的定义 第一种定义 ARTHUR SAMUEL对Machine learning 的定义 Machine Learning is Fields of study that gives computers the ability to learn without being explicitly programmed 机器学习是这样的领域,它赋予计算机学习的能力,(这种学历能力)不是通过显著式编程获得的 显著式编程 提前人为指定规律的编程方式 非显著式编程 让计算机自己总结规律的...

Oct 19, 20212 min read

TensorFlow 2 Keras实现线性回归

介绍 线性回归是入门机器学习必学的算法,其也是最基础的算法之一。 接下来,我们以线性回归为例,使用 TensorFlow 2 提供的 API 和 Eager Execution 机制对其进行实现。 线性回归是一种较为简单,但十分重要的机器学习方法,它也是神经网络的基础。 如下所示,线性回归要解决的问题就是如何找到最理想的直线去拟合散点样本。 对于一个线性回归问题,一般来讲有 2 种解决方法,分别是: 最小二乘法 代数求解 矩阵求解 梯度下降法。 本次,我们将使用梯度下降方法来解决线性回...

Oct 12, 20211 min read

TensorFlow 2 基础概念语法与常用模块

TensorFlow 2 简介 TensorFlow 是由谷歌在 2015 年 11 月发布的深度学习开源工具,我们可以用它来快速构建深度神经网络,并训练深度学习模型。运用 TensorFlow 及其他开源框架的主要目的,就是为我们提供一个更利于搭建深度学习网络的模块工具箱,使开发时能够简化代码,最终呈现出的模型更加简洁易懂。 2019 年,TensorFlow 推出了 2.0 版本,也意味着 TensorFlow 从 1.x 正式过度到 2.x 时代。根据 TensorFlow 官方 介绍内...

Oct 12, 20213 min read

uiu's log

27 posts

Insist on programming & Love open source