C#码农的大数据之路 - 使用Ambari自动化安装HDP2.6(基于Ubuntu16.04)并运行.NET Core编写的MR作业

准备主机

准备3台主机,名称作用如下:

昵称 Fully Qualified Domain Name IP 作用
Ubuntu-Parrot head1.parrot 192.168.9.126 Ambari控制中心,头结点(辅助)
Ubuntu-Laiothrix head0.parrot 192.168.9.127 头节点(主)
Ubuntu-Siskin data0.parrot 192.168.9.128 数据节点

使用hostname <fully.qualified.domain.name>修改主机名,等价于编辑/etc/hostname文件(前者临时,后者永久)

并使用hostname -f获取FQDN,那验证上面的修改是否成功

对每一台主机还要进行如下设置:

  • 配置NTP,sudo apt-get install ntp并设置服务自动启动sudo systemctl enable ntp
  • 关闭防火墙:sudo ufw disable
  • 为所有用户指定umask:sudo echo umask 0022 >> /etc/profile (这样所有新创建的文件都具有755权限)
  • 安装Python2.7, sudo apt-get install python,虽然Ubuntu16.04默认集成了Python3.5但那不适用于Ambari

楼主使用hystar作为集群中所有主机的用户名,复制文中命令时,请将用户名改为您电脑的用户名

配置网络

配置HDP集群原则上要求所有主机可以FQDN(Fully Qualified Domain Name)相互找到对方,包括从IP查找FQDN以及由FQDN查找IP,对于商用的集群这个需要配置集群内DNS来完成。对于测试目的的集群,可以将如下内容添加到每台主机的/etc/hosts来模拟实现:

192.168.9.126 head1.parrot
192.168.9.127 head0.parrot
192.168.9.128 data0.parrot

上面的内容是按照文初的主机列表编辑的。如果园友的环境不一样,可以按需编辑。格式如:1.2.3.4 <fully.qualified.domain.name>

配置完后,可以相互ping一下FQDN看看是否可以正常解析。

注意,要保留127.0.0.1 localhost这个配置

配置无密码访问

这一步要设置安装Ambari的机子与集群其它机器之间的无密码SSH访问

原则上HDP集群要求SSH访问使用root账户,但是Ubuntu系统默认不启用root账户。我们可以将我们的普通账户设为无需密码使用sudo来代替使用root账户。

配置如密码访问的方式到处可见,这里简单的列出几条命令:

在Ambari主机上依次执行如下命令:

ssh-keygen
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
ssh hystar@head0.parrot 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
ssh hystar@data0.parrot 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
ssh hystar@head0.parrot 'chmod 600 .ssh/authorized_keys'
ssh hystar@data0.parrot 'chmod 600 .ssh/authorized_keys'

执行这些命令时,连接远程主机是需要输入密码的,执行之后可以再尝试连接远程主机ssh hystar@head0如果不需要输入密码说明配置成功。

由于我们后续需要在Ambari Server主机上安装Ambari Agent,所以我们对Ambari Server所在的主机本身对自己也配置了无密码SSH访问。

离线安装准备

为了可以离线安装,我们下载Ambari和HDP(以及HDP-Utils)的"tarball"包,下载地址参见此文档,下载后我们得到如下三个文件:

  • ambari-2.5.0.3-ubuntu16.tar.gz
  • HDP-2.6.0.3-ubuntu16-deb.tar.gz
  • HDP-UTILS-1.1.0.21-ubuntu16.tar.gz

下载完成后建议验证下MD5确保文件未损坏

然后我们需要配置一台Web服务器作为apt-get的源,用来提供安装所需要的deb包。

由于楼主是在本地虚机安装HDP,本打算使用IIS作为Web服务,但IIS对于提供普通的文件有个麻烦的地方,就是如果扩展名没有注册,会由于MINE类型未知而报403错误。

接着为了方便,用IIS集成的FTP,虽然倒是成功了,但是速度极慢,*上网友说的原因是每次FTP访问身份验证消耗了太多的时间。

然后想到了WSL,这个应该是最方便的途径。使用sudo apt-get install nginx给BashForWindows安装Nginx。注意需要停掉Windows中的W3SVC服务WSL中的Nginx才能启动成功。而且这个WSL中的Nginx需要每次进入bash后使用service nginx start启动。

然后把ambari-2.5.0.3-ubuntu16.tar.gz解压到本地磁盘,然后使用ln -s创建一个软连接挂到Nginx默认发布目录:

sudo ln -s /mnt/d/HDP/ambari-2.5.0.3-ubuntu16/ambari /usr/share/nginx/html/ambari

这样http://localhost/ambari可以发布包文件。

在Windows防火墙中手动添加80端口的入站规则。只是启用自带的万维网服务这个预定义的规则是不够的。

接着,在之前下载tarball的页面下载两个用于apt的list文件:

  • ambari.list
  • hdp.list

修改其中的地址为我们自己搭建的服务器的地址,注意把目录层级弄对就可以了。

将ambari.list中原来的地址改为(IP地址为Windows系统的IP):

http://192.168.9.222/ambari/ubuntu16/

将修改后的ambari.list文件添加待安装Ambari Server的主机的/etc/apt/sources.list.d下。

如果是在线安装,无需修改ambari.list内容,直接将其添加到/etc/apt/sources.list.d下即可。

按照类似的方法,使用如下两条命令配置HDP和HDP Utils包的发布

sudo ln -s /mnt/d/HDP/HDP-2.6.0.3-ubuntu16-deb/HDP /usr/share/nginx/html/hdp
sudo ln -s /mnt/d/HDP/HDP-UTILS-1.1.0.21-ubuntu16/HDP-UTILS-1.1.0.21/repos /usr/share/nginx/html/hdputils

这样HDP和HDP Utils包源分别位于http://192.168.9.222/hdp/ubuntu16http://192.168.9.222/hdputils/ubuntu16

安装Ambari

保证准备工作进行正确。首先执行下面命令导入key:

sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B9733A7A07513CAD

然后执行更新:

sudo apt-get update

后续我们需要在所有主机上由此Ambari源安装Ambari Agent,所以我们需要在所有主机上执行这两条命令,以便Ambari Agent可以顺利安装。

sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B9733A7A07513CAD

sudo apt-get update

使用下面的命令检查update是否成功,即包信息是否已经被缓存。

apt-cache showpkg ambari-server
apt-cache showpkg ambari-agent
apt-cache showpkg ambari-metrics-assembly

如果一切正常,就可以开始安装Ambari了。

sudo apt-get install ambari-server

Ambari所依赖的PostgreSQL将一并被安装。

配置Ambari

执行sudo ambari-server setup配置Ambari。

遇到Customize user account for ambari-server daemon选择n,使Ambari在root下执行,当然也可以选择其它用户。

然后输入数字,选择要安装的JDK版本并等待下载安装完成。

Enter advanced database configuration选择n来使用内置数据库。

如无意外,安装会成功完成。

启动Ambari

使用如下命令,控制Ambari的启停

sudo ambari-server start
sudo ambari-server status
sudo ambari-server stop

创建集群

Ambari启动后可以访问http://head1.parrot:8080登录到Ambari,默认用户名和密码为admin/admin。

登录Ambari后点击Launch Install Wizard按钮,进入Ambari集群安装向导。

安装Ambari集群步骤如下:

  1. 给集群命名,名称不能包含特殊字符
  2. 选择要安装的版本。由于我们选择离线安装,所以选择Use Local Repository并把不需要的系统配置移除,并在需要的系统配置中填入包源地址。对于之前的配置,HDP与HDP Utils的地址分别为:
http://192.168.9.222/hdp/ubuntu16
http://192.168.9.222/hdputils/ubuntu16
  1. 第三步是安装选项,目标主机的FQDN列表如下:
head1.parrot
head0.parrot
data0.parrot

然后在Ambari Server主机上执行cat ~/.ssh/id_rsa将私钥的文本粘贴到对应的文本框中,并在ssh用户名中填入我们的远程连接所用的用户名

点击Register and Confirm,Ambari开始在所选的主机上安装Ambari Agent。

  1. 进入这一步后,将自动开始在集群的机子上安装Ambari Agent。等Progess停止走动时,Status一列将显示执行结果。Success表示成功完成。如果不幸遇到失败可以点击连接查看日志找到失败原因。

    在一切成功的情况下也有可能会出现一些警告,点击链接Click here to see the warnings,里面会告诉你怎么修复警告,如图。

C#码农的大数据之路 - 使用Ambari自动化安装HDP2.6(基于Ubuntu16.04)并运行.NET Core编写的MR作业

按照说明解决警告后,可以点击Return Checks重新检查。待检查无误后进入下一步

博主并不是在Ambari Server或集群中任何一台机子上登录的Ambari控制台,它们都是*面的Linux。楼主使用Windows上的Firefox登录Ambari控制台。

第一次尝试时,楼主使用http://192.168.9.126:8080访问,到这一步时始终无法正常安装Ambari Agent。报错类似Registration failed. Unable to register with the server原因就是主机连不上Ambari Server。对于这个问题十分不解,之前所有主机的/etc/hosts都配置了啊。后来一番查找无果后,考虑是不是和访问Ambari控制台的机子的有关,遂把上面的hosts记录也加到Windows一份。同时为了保险,把Windows的hosts记录也加到HDP集群中每台主机的/etc/hosts(这个可能没有必要)。然后使用http://head1.parrot:8080访问Ambari控制台,重试上面的安装步骤,一切顺利完成。

  1. 这一步选择要在集群中安装的组件
  2. 接着是选择所选服务Master的安装位置。按照之前的配置,原则上它们都应该安装在head0.parrot结点。

    从下拉列表选择服务要部署的host位置,点击服务后面的“加号”可以增加服务部署的机子。而“减号”用来减少部署的机子。

    把SNameNode和NameNode放在不同的host上实现高可用,最终楼主的选择如下:

C#码农的大数据之路 - 使用Ambari自动化安装HDP2.6(基于Ubuntu16.04)并运行.NET Core编写的MR作业

YARN的ResouceManager的HA需要在安装完成后配置,具体实现见HortonWorks官网文档

  1. 然后选择所选服务Slave及Client的安装位置。按照之前的配置,Slave应该安装在data0.parrot结点。

    另外,我将Client安装在head1.parrot

这一步host后面的星号表示这台host已经安装了Master,将鼠标移到星号上可以看到该host已安装的Master。

  1. 这一步将对每个服务的配置项进行设置,如数据存储位置,密码等。所有标签被标记为红色的都是必须输入的项。

    设置完成后点击Next,进行下一步之前会检查所输入的设置项并给出一些建议,修改后重试,或者直接点击Proceed Anyway忽略警告继续安装。

一般来说标记为红色必填的都是需要输入密码的配置项。对于非生产的测试环境,可以把所有密码统一设置方便使用。

  1. 这一步汇总一个检查清单,列出了即将进行的部署的详情。这是部署前最后修改设置的最后机会。

    点击Deploy开始部署。下面就是耐心等待进度条完成。

  2. Ambari Server开始在3台host上安装服务并在安装完成后尝试启动。(如果遇到启动不成功,可以后面调整配置重试启动,如果是安装不成功就需要清理文件重试安装了,后者比较麻烦)

    C#码农的大数据之路 - 使用Ambari自动化安装HDP2.6(基于Ubuntu16.04)并运行.NET Core编写的MR作业

提示

  1. 楼主按照上面的方法安装完成后,Hive启动不了(组件中的HiveServer2无法启动)。日志显示是MySQL无法连接。楼主选择Hive使用集成的MySQL作为MetaStore,两者安装在同一台主机上,按理应该没有问题。但Ambari Server和它们不在一台主机。楼主想了半天,只可能是这个原因,于是找到MySQL的配置文件/etc/mysql/mysql.conf.d/mysqld.cnf将其中bind-address=127.0.0.1注释掉,自此HiveServer2可以正常启动。
  2. 启动时,最好先启动ZooKeeper。在ZooKeeper不启动的情况下,ResourceManager等无法启动。
  3. 默认配置下,主机重启后,所有服务都是处于停止状态(Ambari Server默认可以自行启动)。在Admin选项卡Service Auto Start菜单中可以配置哪些服务自动启动。

运行.NET Core编写的MR Job

首先准备好用.NET Core编写的Map和Reduce程序,源码见此,请自行下载编译。

解决方案中的NetCoreMapperNetCoreReducer分别对应Map和Reduce程序,使用publish.bat生成项目得到输出,最终两个项目的输出文件有如下这些:

C#码农的大数据之路 - 使用Ambari自动化安装HDP2.6(基于Ubuntu16.04)并运行.NET Core编写的MR作业

然后准备输入文件davinci.txt(这个测试数据是HDInsight官方例子中的测试数据,就是一篇英文文章,可以自己随意制作一个)与之前生成的.NETCore程序,均拷贝到head0.parrot主机中

为了方便WSL访问集群中的主机,首先配置WSL的hosts,目前Windows10中的WSL基于Ubuntu所以hosts也位于/etc/hosts。编辑这个文件加入以下内容:

192.168.9.126 head1.parrot
192.168.9.127 head0.parrot
192.168.9.128 data0.parrot

接着配置下WSL到head0结点和data0结点的无密码访问

ssh-keygen
ssh user@head0.parrot 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
ssh user@head0.parrot 'chmod 600 .ssh/authorized_keys'
ssh user@data0.parrot 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
ssh user@data0.parrot 'chmod 600 .ssh/authorized_keys'

接着将输入数据和所有的.NET Core程序文件拷贝到集群中(head0结点的主机上)

scp davinci.txt hystar@head0.parrot:/home/hystar
ssh hystar@head0.parrot 'mkdir coreapp'
scp publish/* hystar@head0.parrot:/home/hystar/coreapp

然后将输入数据拷贝到HDFS中(程序文件不需要):

useradd -g hdfs hystar
hadoop fs -mkdir -p /user/hystar
hadoop fs -put /home/hystar/davinci.txt /example/data/gutenberg/davinci.txt

然后就是准备Hadoop Streaming执行的脚本

首先找到Hadoop Streaming的jar包所在的位置。SSH到Hadoop的头结点所在主机head0.parrot,并执行下面命令

find / -name "hadoop-streaming*" 2>/dev/null

按照之前所给出的HDP安装的文章,楼主的Hadoop安装于/usr/hdp/2.6.0.3-8/hadoop-mapreduce/hadoop-streaming-2.7.3.2.6.0.3-8.jar

接着是脚本内容:

hadoop jar  /usr/hdp/2.6.0.3-8/hadoop-mapreduce/hadoop-streaming-2.7.3.2.6.0.3-8.jar \
-files "/home/hystar/coreapp" \
-mapper "dotnet coreapp/NetCoreMapper.dll" \
-reducer "dotnet coreapp/NetCoreReducer.dll" \
-input /example/data/gutenberg/davinci.txt \
-output /example/data/StreamingOutput/wc.txt

注意files选项直接给出.NETCore App所在的文件夹(主机目录,而非HDFS目录),而不用逐个指定文件。

mapper及reducer选项中的coreapp/这个路径也不能省。

最后提交任务前,还需要在干活的结点(data0.parrot)安装.NET Core。同样在WSL中ssh到data0.parrot安装即可。

安装前注意删除旧版,详细文档见此

一切准备妥当,执行脚本就可以提交并运行基于Hadoop Streaming的任务。一些顺利的话,可以在/example/data/StreamingOutput/wc.txt/part-0001中看到结果。

附录

Ambari相关

http://192.168.9.126:8080/api/v1/hosts 查看Ambari Server管理的主机,即安装了Ambari Agent的主机。

上一篇:JVM之详解Java类的装载过程及类加载过程


下一篇:Java类加载器 — classloader 的原理及应用