Spark SQL 高级编程之 Hadoop 生态简介
1. 如何学好大数据
- 官网(五颗星),多看官网
- 项目实战对知识点进行巩固和融会贯通
- 社区活动,交个朋友,认识一些人,对跳槽就业有好处
- 切记:多动手、多联系、贵在坚持
2. 开发环境
- Linux 系统根据自己爱好即可,一般建议 Ubuntu,生态全
- Hadoop 版本
- Apache 社区,看看就好
- CDH 版本,国内一般都是用这个版本,archive.cloudera.com/cdh5/cdh/5/
- 注意,生产和测试环境选择对应 CDH 版本时,一定要采用尾号一样的版本。
- HDP 版本,国内一般使用的较少
2.1 下载软件包
- http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.15.0.tar.gz
- http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.15.0.tar.gz
- apache-maven-3.5.4.0-bin.tar.gz
- jdk-8u202-linux-x64.tar.gz
- scala-2.12.8.tgz
- Python-3.7.2.tgz
2.1 Hadoop 环境配置
- tar -zxvf jdk-8u202-linux-x64.tar.gz -C ~/app/
- tar -zxvf scala-2.12.8.tgz -C ~/app/
- tar -zxvf hadoop-2.6.0-cdh5.15.0.tar.gz -C ~/app/
- vi ~/.bash_profile 添加:
export JAVA_HOME=/home/alex/app/jdk1.8.0_202
export PATH= J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:PATH
export SCALA_HOME=/home/alex/app/scala-2.12.8
export PATH= S C A L A H O M E / b i n : SCALA_HOME/bin: SCALAHOME/bin:PATH
export HADOOP_HOME=/home/alex/app/hadoop-2.6.0-cdh5.15.0
export PATH= H A D O O P H O M E / b i n : HADOOP_HOME/bin: HADOOPHOME/bin:PATH- cd hadoop-2.6.0-cdh5.15.0/etc/hadoop
- vi hadoop-env.sh
- 注释 export JAVA_HOME=${JAVA_HOME},添加 export JAVA_HOME=/home/alex/app/jdk1.8.0_202
- vi core-site.xml
- 在 configuration 中添加:主机名不可以有下划线
<property>
<name>fs.default.name</name>
<value>hdfs://alexai:8020</value>
</property>
- vi hdfs-site.xml
- 在 configuration 中添加:
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/alex/app/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/alex/app/tmp/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
- cp mapred-site.xml.template mapred-site.xml
- vi mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
- vi yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
- cd /home/alex/app/hadoop-2.6.0-cdh5.15.0/bin
- 格式化:./hadoop namenode -format
- cd sbin
- 如果主机名是 localhost 修改主机名,http://www.cnblogs.com/woshimrf/p/centos-rename.html
- 设置免密登录 https://www.jianshu.com/p/99a03cd0870c
https://segmentfault.com/a/1190000008615560
http://www.iosugar.com/2017/02/14/CentOS-remote-login-SSH-configuration/- 进入 sbin 目录,./start-dfs.sh
- 启动之后查看:jps
- 查看是否存在文件:hadoop fs -ls /,此时是空的目录,新建一个目录,hadoop fs -mkdir /test,此时再输入hadoop fs -ls /变出现内容
- 上传一个文件到 hadoop上,回到hadoop-2.6.0-cdh5.15.0目录中,执行:hadoop fs -put README.txt /test/,再执行hadoop fs -ls /test,会看到刚才上传上去的内容,执行hadoop fs -text /test/README.txt,查看刚才上传的文件内容
- 在服务器浏览器上输入:alexai:50070即可通过视图方式查看,点击 Utilities 下的Browse the file system。如果是远程连接主机,需要在本地配置 hosts,指明 alexai 对应的 IP 地址
- 启动 Yarn:./start-yarn.sh,浏览器中输入:alexai:8088
- 至此 Hadoop 环境构建完成
注意点:- 在配置 Hadoop 时,需要设置本机地址 sudo vi /etc/hosts,添加本机的 IP 地址和机器名,比如 192.168.0.120 alex_ai,IP 地址修改后也需要再次配置
- 如果出现Java_HOME 问题,参考https://stackoverflow.com/questions/14325594/working-with-hadoop-localhost-error-java-home-is-not-set
3. 框架介绍
- Hadoop:分布式系统基础架构。Hadoop 可以认为是一个生态,一个项目。 主要包含如下三个最重要的部件:
- HDFS:分布式文件系统;
- Yarn:资源调度框架;
- MapReduce:构建在 Yarn 之上的平行计算框架。了解即可,目前基本都是用 Spark 了。
- Hive:构建在 Hadoop 上的数据仓库;定义了一种类 SQL 查询语言:HQL;
3.1 HDFS 优缺点
- 优点
- 高容错
- 适合批处理
- 适合大数据处理
- 可构建在廉价机器上
- 缺点
- 低延迟的数据访问
- 不适合小文件存储,named node 还是一样大
3.2 MapReduce 特点
了解即可,目前已经很少使用,被 Spark 替代了。
缺点是不擅长实时计算、流式计算、DAG 计算场景。只适合离线批处理任务场景。
使用时只需要实现 Map 和 Reduce 方法即可。
3.3 Hive
3.3.1 Hive 体系架构
3.3.2 Hive 测试环境
通常使用 MySQL 数据库;
3.3.3 生产环境
MySQL 需要设置主数据库和从数据库;
Hive 只需要部署在一台机器上就行了,不需要在所有机器上部署 Hive;
RM、NN、DN、NM 都需要设置主备;
3.3.4 Hive 环境安装
- 下载:http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.15.0.tar.gz
- 解压:tar -zxvf hive-1.1.0-cdh5.15.0.tar.gz -C ~/app/
- 配置环境变量.bash_profile
export HIVE_HOME=“/Users/xxx/app/hive-1.1.0-cdh5.15.0”
export PATH= H I V E H O M E / b i n : HIVE_HOME/bin: HIVEHOME/bin:PATH- 安装一个关系型数据库,因为这里将数据放到 MySQL 中,https://support.rackspace.com/how-to/installing-mysql-server-on-ubuntu/
- 在目录hive-1.1.0-cdh5.15.0/conf中,cp hive-env.sh.template hive-env.sh
- 在 hive-env.sh 中配置 HADOOP_HOME=/Users/xxx/app/hadoop-2.6.0-cdh5.15.0。如果没有配置 Hadoop,参考前面的章节。
- 在 conf 文件夹中新建hive-site.xml,内容如下,并修改密码等为 MySQL 字段。
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value><fill in with password></value>
<description>password to use against metastore database</description>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://localhost:9083</value>
</property>
</configuration>
- 拷贝 MySQL 驱动mysql-connector-java-5.1.47-bin.jar到lib目录中
- 启动 Hive,到主目录中输入:./hive
3.4 Spark 环境介绍
3.4.1 Spark 环境搭建
3.4.1.1 配置 Maven 环境
- 搭建Maven: tar -zxvf apache-maven-3.5.4-bin.tar.gz -C ~/app/
- vi .bash_profile,输入:
export MAVEN_HOME=/home/alex/app/apache-maven-3.5.4
export PATH= M A V E N H O M E / b i n : MAVEN_HOME/bin: MAVENHOME/bin:PATH- source .bash_profile
- 由于墙的原因,可能需要配置 Maven 的仓库:https://blog.csdn.net/kisslotus/article/details/51000892
3.4.1.2 编译 Python Linux 版本
- tar -zxvf Python-3.6.8.tgz -C ~/app/
- sudo yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
- 在 app 目录下面,mkdir python3
- 在Python-3.6.8目录中执行 ./configure --prefix=/home/alex/app/python3
- make && make install
- vi .bash_profile
export PYTHON_HOME=/home/alex/app/python3
export PATH= P Y T H O N H O M E / b i n : / PYTHON_HOME/bin:/ PYTHONHOME/bin:/PATH
3.4.1.3 使用 Spark 源码安装
- 使用源码好处很多,不建议使用预编译版本安装。下载 Spark 源码:https://archive.apache.org/dist/spark/spark-2.3.2/spark-2.3.2.tgz
- tar -zxvf spark-2.3.2.tgz -C ~/app/
- 安装 Tutorial:https://spark.apache.org/docs/latest/building-spark.html
- export MAVEN_OPTS=“-Xmx2g -XX:ReservedCodeCacheSize=512m”
- 在 Spark 主目录中修改 pom.xml文件,添加:
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
下载的内容来自:https://repository.cloudera.com/artifactory/cloudera-repos/org/apache/hadoop/hadoop-client/2.6.0-cdh5.15.0/
6. 在 Spark 主目录执行:./dev/make-distribution.sh --name 2.6.0-cdh5.15.0 --tgz -Pyarn -Phadoop-2.6 -Phive -Phive-thriftserver -Dhadoop.version=2.6.0-cdh5.15.0
7. 编译也许会非常慢,主要是由于墙的原因,需要下载大量包,即便有梯子从cloudera上下载包也非常慢。如果出现 Connection Refused 之类的错误,都是梯子不给力导致的,可以想办法自己下载 Jar 包。
8. 配置环境变量:
export SPARK_HOME=/home/alex/app/spark-2.3.2-bin-2.6.0-cdh5.15.0
export PATH= S P A R K H O M E / b i n : SPARK_HOME/bin: SPARKHOME/bin:PATH
9. 方式一:以 local 模式启动:spark-shell -master local[n], 以n个线程方式启动,也可以写*,表示启动的线程数量等于处理器数量。启动后,默认可以在 4040 端口查看到。
10. 方式二:以 standalone 模式启动,这种方式是主从模式,一个作为主节点,再设置多个从节点,即 1 master + n workers。
1) 在 conf 目录中,cp spark-env.sh.template spark-env.sh; vi spark-env.sh
SPARK_MASTER_HOST=alex-ai-centos.yichulian.net
SPARK_WORKER_CORES=2
SPARK_WORKER_MEMORY=2g
SPARK_WORKER_INSTANCES=1,本版本中不需要配置这个参数,低版本需要配置这个参数
2) 在 sbin 目录中,./start-all.sh。启动之后,可以在 logs 目录中看到日志信息。停止使用 stop-all.sh
3) 在 logs 目录中,打开主节点日志文件,可以看到 MasterUI,http://alex-ai-centos.yichulian.net:8080
4)配置 slaves:
5)在 conf 目录中,cp slaves.template slaves
6)假设现在有10个从节点机器 machine1 - machine 10,主节点机器 machine0,在 vi slaves文件中,添加:
machine1
machine2
…
machine10
7)之后启动 start-all.sh 时,会在 machine0上启动 master 进程,在 slaves 文件中配置的 machine1-machine10机器上启动 worker 进程
8)启动命令:spark-shell -master spark://alex-ai-centos.yichulian.net:7077。这个命令不要重复执行多次。