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,虽然倒是成功了,但是速度极慢,StackOverflow上网友说的原因是每次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/ubuntu16
和http://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集群步骤如下:
- 给集群命名,名称不能包含特殊字符
- 选择要安装的版本。由于我们选择离线安装,所以选择
Use Local Repository
并把不需要的系统配置移除,并在需要的系统配置中填入包源地址。对于之前的配置,HDP与HDP Utils的地址分别为:
http://192.168.9.222/hdp/ubuntu16
http://192.168.9.222/hdputils/ubuntu16
- 第三步是安装选项,目标主机的FQDN列表如下:
head1.parrot
head0.parrot
data0.parrot
然后在Ambari Server主机上执行cat ~/.ssh/id_rsa
将私钥的文本粘贴到对应的文本框中,并在ssh用户名中填入我们的远程连接所用的用户名
点击Register and Confirm
,Ambari开始在所选的主机上安装Ambari Agent。
- 进入这一步后,将自动开始在集群的机子上安装Ambari Agent。等
Progess
停止走动时,Status
一列将显示执行结果。Success表示成功完成。如果不幸遇到失败可以点击连接查看日志找到失败原因。
在一切成功的情况下也有可能会出现一些警告,点击链接Click here to see the warnings
,里面会告诉你怎么修复警告,如图。
按照说明解决警告后,可以点击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控制台,重试上面的安装步骤,一切顺利完成。
- 这一步选择要在集群中安装的组件
- 接着是选择所选服务Master的安装位置。按照之前的配置,原则上它们都应该安装在
head0.parrot
结点。
从下拉列表选择服务要部署的host位置,点击服务后面的“加号”可以增加服务部署的机子。而“减号”用来减少部署的机子。
把SNameNode和NameNode放在不同的host上实现高可用,最终楼主的选择如下:
YARN的ResouceManager的HA需要在安装完成后配置,具体实现见HortonWorks官网文档
- 然后选择所选服务Slave及Client的安装位置。按照之前的配置,Slave应该安装在
data0.parrot
结点。
另外,我将Client安装在head1.parrot
。
这一步host后面的星号表示这台host已经安装了Master,将鼠标移到星号上可以看到该host已安装的Master。
- 这一步将对每个服务的配置项进行设置,如数据存储位置,密码等。所有标签被标记为红色的都是必须输入的项。
设置完成后点击Next
,进行下一步之前会检查所输入的设置项并给出一些建议,修改后重试,或者直接点击Proceed Anyway
忽略警告继续安装。
一般来说标记为红色必填的都是需要输入密码的配置项。对于非生产的测试环境,可以把所有密码统一设置方便使用。
-
这一步汇总一个检查清单,列出了即将进行的部署的详情。这是部署前最后修改设置的最后机会。
点击Deploy
开始部署。下面就是耐心等待进度条完成。 -
Ambari Server开始在3台host上安装服务并在安装完成后尝试启动。(如果遇到启动不成功,可以后面调整配置重试启动,如果是安装不成功就需要清理文件重试安装了,后者比较麻烦)
提示
- 楼主按照上面的方法安装完成后,Hive启动不了(组件中的HiveServer2无法启动)。日志显示是MySQL无法连接。楼主选择Hive使用集成的MySQL作为MetaStore,两者安装在同一台主机上,按理应该没有问题。但Ambari Server和它们不在一台主机。楼主想了半天,只可能是这个原因,于是找到MySQL的配置文件
/etc/mysql/mysql.conf.d/mysqld.cnf
将其中bind-address=127.0.0.1
注释掉,自此HiveServer2可以正常启动。 - 启动时,最好先启动ZooKeeper。在ZooKeeper不启动的情况下,ResourceManager等无法启动。
- 默认配置下,主机重启后,所有服务都是处于停止状态(Ambari Server默认可以自行启动)。在
Admin
选项卡Service Auto Start
菜单中可以配置哪些服务自动启动。
运行.NET Core编写的MR Job
首先准备好用.NET Core编写的Map和Reduce程序,源码见此,请自行下载编译。
解决方案中的NetCoreMapper
和NetCoreReducer
分别对应Map和Reduce程序,使用publish.bat生成项目得到输出,最终两个项目的输出文件有如下这些:
然后准备输入文件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的主机。