介绍
Hadoop是一个强大的大数据生态系统,提供许多工具和服务,主要用于存储,管理和处理大量数据。通常在生产中,数据工程师会在功能强大的服务器上运行Hadoop集群,这引出了以下问题:一个学生或任何愿意使用该技术的用户如何才能在使用商业硬件的测试环境中运行该技术?
我们会立即想到的答案之一是虚拟机,尽管在适当的环境中这可能是一个不错的解决方案,但是由于要求苛刻,对于低端硬件而言,这仍然是一个挑战性的障碍,特别是对于需要立即运行多个实例的更繁重的任务,例如确保 Hadoop 和关系数据库服务(如:Oracle)之间的通信,而两者都驻留在两个不同的 VM 中。这是 Docker Containers Magic 的起点,本文将指导您彻底设置 Hadoop 和 Oracle 容器,以使用 Sqoop 将关系数据库数据集传输到 HDFS。
设置 Hadoop Docker 容器
在开始之前,我们需要在我们的机器上安装 Docker,这可以通过访问以下链接上的官方Docker下载页面轻松完成。
https://docs.docker.com/get-docker/
接下来,要设置任何 docker 容器,我们将需要适当的docker映像文件,该文件充当我们要运行的容器的蓝图,我们可以创建自己的Docker映像,也可以使用社区在Docker Hub上公开共享的现有映像,您可以通过此链接进行访问(请注意,注册帐户是必需的)。
https://hub.docker.com/
在这个案例研究中,我将使用 cloudera quickstart 映像,它提供了 Hadoop 的预配置单节点部署,非常适合测试和学习目的,可以通过此url链接到该映像。
https://hub.docker.com/r/cloudera/quickstart
现在,我们应该准备开始设置容器,首先,下载 cloudera quickstart 映像,确保 docker 已启动并在您的计算机上运行,并执行以下命令。
docker pull cloudera/quickstart:latest
docker pull 命令将仅在 docker hub 中查找相对于该名称的映像,并将开始将其下载到本地计算机上,至于最新标签,则表明我们要检索该映像的最新版本(可在 Docker Hub上检查)
然后,为确保成功下载映像,我们可以使用以下命令列出所有可用映像。
docker images
在结果中,您应该在图像列表中看到cloudera / quickstart图像,如下所示:
图1:docker images命令概述
在接下来的步骤中,我们将创建容器,这可以通过运行以下命令来完成。
docker run --name cloudera --hostname=quickstart.cloudera --privileged=true -t -i -p 8888:8888 -p 80:80 -p 8020:8020 -p 7180:7180 cloudera/quickstart /usr/bin/docker-quickstart
上面命令中使用的一些最关键的标志和选项可以解释如下:
name:定义容器的标签名称,在使用docker命令更改容器的配置时非常有用。
hostname:定义容器的主机名。
p:将来宾的端口映射到主机的端口(例如:-p 8888:8888将来宾容器上的Hue UI的 端口映射到主机的机器8888端口,然后访问主机上的Hue界面,只需转到: http:// localhost:8888)。
cloudera / quickstart:指图像的名称。
运行以下命令后,我们可以列出所有正在运行的容器。
docker ps
图2:docker ps命令概述
注意:要启动一个可用的容器,可以使用 Windows 上的 Docker 桌面应用程序或以下命令。
docker start -ai [CONTAINER_NAME_OR_ID]
图3:Docker桌面应用程序概述
到这,您已经使用 cloudera / quickstart 映像成功设置了Hadoop的容器,现在您可以有效地使用 Hadoop 的强大服务和命令,让我们通过使用新设置中的jps命令来检查正在运行的Hadoop 进程容器。(jps表示:Java虚拟机进程状态工具)。
图3:JPS命令概述
设置Oracle数据库容器
在这一部分中,我将简要介绍如何设置此案例研究所需的另一个容器,即基于官方Oracle Entreprise 12c 映像的Oracle容器,该容器可在以下链接中找到。
https://hub.docker.com/_/oracle-database-enterprise-edition
通过遵循前面提到的确切步骤,我们将开始使用以下命令下载映像。
docker pull store/oracle/database-enterprise:12.2.0.1
然后,我们使用docker run命令创建容器(在这种情况下,我们无需映射任何端口)。
docker run -d -it --name Oracle-DB store/oracle/database-enterprise:12.2.0.1
同样,我们可以检查这些命令是否成功运行。
图4:以上命令
恭喜,已正确设置了必要的容器,我们现在可以继续执行我们的主要目标,即使用称为 Sqoop 的工具将 SQL 数据集从 Oracle 数据库传输到 Hadoop 中,但是在此之前,我们将需要准备实际数据一个具有单个表的 Oracle 数据库。
准备Oracle数据集
首先,我们将启动Oracle容器,然后通过运行以下命令打开Shell终端。
docker exec -it --user root Oracle-DB /bin/bash
此命令的简短描述:
docker exec:允许在可用容器中运行命令
user:此标志用于指定执行命令的用户
Oracle-DB:引用我们在设置容器时指定的容器名称。
之后,我们将在主文件夹中创建一个名为 scripts 的目录,该目录将用于存储我们的 SQL 脚本,稍后我们将编写该目录以创建表,之后,我们将直接对该目录授予完全权限。
图5:脚本目录创建
接下来,我们将通过使用docker exec启动 Oracle的 SQL * PLUS 命令行界面,然后我们将登录到默认系统管理员的帐户(您可以在 Docker Hub 上的官方页面上查看更多详细信息)。
docker exec -it [CONTAINER_NAME_OR_ID] bash -c "source /home/oracle/.bashrc; sqlplus /nolog"
图6:启动SQL * PLUS
然后,我们将创建一个新用户,并向他授予开始创建表并向其中填充数据所需的权限。
图7:新用户创建
图8:授予权限
在下一步中,我们将创建一个简单的 SQL 表,首先需要编写它的创建脚本,为此,我将使用edit 命令在先前设置的 scripts 目录中创建一个新文件。
注意:要使用提供语法高亮显示功能的改进版本的VI,您必须安装它,因为它不是预先内置在容器中的,还需要更改默认的SQL * PLUS编辑器。
图9:制作表格的创建文件
表格的创建脚本在下面。
create table PRODUCTS(id NUMBER PRIMARY KEY,name VARCHAR(15) NOT NULL, price NUMBER NOT NULL);commit;
让我们在此表中插入一些记录,再次从脚本文件夹中创建一个新文件开始。
图10:制作数据插入文件
insert into PRODUCTS values(1, 'product1', 100);insert into PRODUCTS values(2, 'product2', 200);insert into PRODUCTS values(3, 'product3', 300);commit;
最后,我们将在SQL * PLUS中执行这两个脚本。
图11:执行表的创建脚本
图12:执行数据插入脚本
数据准备就绪,我们可以跳入Hadoop容器,在其中我们将使用Sqoop将这些数据集直接传输到HDFS中。
使用Sqoop将Oracle的SQL数据集导入Hadoop
正如您可能一直猜测的那样,我们将用于传输数据的工具是Sqoop(从SQL到Hadoop)。顾名思义,Sqoop是一种旨在在Hadoop和关系数据库(例如 MySQL,SQLServer 或我们的示例Oracle)之间传输数据的工具,实际上,它允许双向传输,换句话说,您也可以将数据从Hadoop 导出到关系数据库中。
图13:Sqoop操作
在内部,Sqoop 运行 MapReduce 作业,输入的命令与映射任务相关联,以从外部关系数据库中检索数据,然后将使用reduce任务将该数据放入Hadoop。为了确保与外部数据库的连接,Sqoop 使用了各种连接器 API,最常用的是 JDBC Drivers。
在继续进行手头的任务之前,我将简要介绍如何使用 Sqoop。
Sqoop 主要提供两个命令来运行传输操作。
sqoop import或sqoop-import:将数据从关系数据库传输到Hadoop。
sqoop export或sqoop-export:将数据从Hadoop传输到关系数据库中的现有表。
接下来是需要作为sqoop参数传递的最关键的标志和选项:
— connect:指定jdbc URI字符串。
— username:提供数据库用户名。
-P:提示用户指定密码(推荐)。
— password:直接在命令中提供密码。
— target-dir:指定目标输出目录。
— table:指定我们要传输的SQL表。
— m:指定映射器的数量(默认为4)。
在运行sqoop命令时,我们可以指定更多选项,以进一步自定义我们希望运行的操作(将数据直接传输到Hive或Hbase等),但是对于本案例研究,我将坚持上述操作。现在,我们继续执行手头的任务,因此请确保您的Hadoop和Oracle容器都在运行,并让我们开始传输过程。如前所述,Sqoop需要JDBC Drivers来进行操作,因此,在运行sqoop-import命令之前,我们需要在容器内(特别是在/ var / lib / sqoop目录中)添加Oracle数据库连接器。
如果需要下载连接器,则必须通过下面的链接访问Oracle的官方下载页面。
https://www.oracle.com/database/technologies/jdbc-upc-downloads.html
就我而言,我将jar文件存储在主机中,然后通过简单的使用docker命令将其复制到Hadoop容器中,该命令允许在主机和来宾容器之间传输文件或目录。
docker cp [SRC_FILE][CONTAINER_ID_OR_NAME]:[DEST_FILE]
图14:将驱动程序文件复制到容器
通过检查/ var / lib / sqoop /目录,您可能已经注意到默认情况下mysql连接器已可用。好了,所有先决条件已经准备就绪,我将在HDFS中简单地创建一个新目录,该目录将用于存储sqoop导入命令的输出。
hdfs dfs -mkdir /user/sqoop
继续,我们最终可以使用以下命令执行导入操作。
sqoop import --connect jdbc:oracle:thin:@172.17.0.2:1521:ORCLCDB --table PRODUCTS --username tutorial_user -P --m 1 --target-dir /user/sqoop/output_tutorial
我上面使用的所有标志都在上一部分中进行了说明,但是,我希望您密切注意驱动程序的URI字符串 jdbc:oracle:thin:@ 172 .17.0.2:1521:ORCLCDB。
我将解释每个单独的片段:
jdbc.oracle:thin:这是驱动程序的名称(不同数据库系统之间的名称差异很大。)
172.17.0.2:这是Oracle容器的IP地址(默认情况下,新设置的每个docker容器都连接到同一网桥网络。)
1521:默认的Oracle侦听器端口。
ORCLCDB:侦听器的名称(这取决于所使用的Oracle版本,要了解当前在您的容器上运行的侦听器,请使用以下命令:docker exec -it [CONTAINER_NAME_OR_ID] bash -c“ source /home/oracle/.bashrc; lsnrctl 状态” )。
查看sqoop-import命令的结果
最后但并非最不重要的一点是,我们可以查看在sqoop导入期间作为参数传递的输出目录中导入的数据集,在这种情况下,我们可以通过运行以下命令直接在HDFS存储中查看结果。
hdfs dfs -ls / user / sqoop / output_tutorial
图15:目标目录中结果
我们可以通过执行一个简单的cat命令来查看实际文件的内容。
hdfs dfs -cat / user / sqoop / output_tutorial / part-m-00000
图16:结果文件内容
最后,我们将通过访问Hue UI直接查看我们的结果,如果正确设置了端口映射,则可以通过以下方式在浏览器中打开它:
http://localhost:8888/
使用具有以下凭据的默认cloudera帐户登录:
用户名:cloudera
密码:cloudera
最后,跳入文件浏览器,然后查找输出目录,您应该能够清楚地看到结果,如下所示。
Hue界面中的结果概述
结论 在本文中,我已详细说明了如何设置Hadoop和Oracle docker容器,然后如何创建一个简单的Oracle表,该表用于我们使用Sqoop导入命令进行测试。本指南说明了使用Docker容器替代虚拟机的有效性,因此我们可能拥有针对Hadoop及其服务等强大工具的有效可用测试环境。
链接:
https://medium.com/@achir.youssef97/a-step-by-step-guide-for-loading-oracle-data-into-hadoop-using-docker-containers-c4bc5c0cb3d2
翻译:奶酪二哈-BKing
The article is only for learning, if infringement, please contact BKing8@88.com to delete.
文章仅用于学习,如有侵权,请联系邮件 BKing8@88.com 删除