智子环境搭建历程

智子 - 韩都衣舍机器学习平台代号😋

一、spark流派

1.1 hadoop

起初选择使用CDH安装(原因:老环境就用的这个,据说比较稳定),然而在双节点情况下总是出现莫名问题。磕磕绊绊安装好了,实际用起来还是有不少问题(集成环境问题定位好麻烦。。),在尝试几波之后最终选择放弃(期间还麻烦运维妹子重做了系统😂)。想到实际需要的功能并不太多,果断转为人工安装部署。
CDH的安装部署过程作为番外放在最后面吧。。。

版本选择

虽然没有安装CDH,还是选用了CDH版的hadoop2.6。(据说体质较好,比较稳健)

文章参考

CentOS 7 集群部署 Hadoop 2.7.3

坑位介绍

主要记录自己部署时遇到的主要问题,详细步骤可以参考上面的文章

💩 jps发现竟然木有DataNode

之前用CDH安装过一遍hadoop导致部分目录有内容残留

  • 查看$HADOOP_HOME/etc/hadoop/hdfs-site.xml
    • namenode路径
    • datanode路径
    • 删除对应目录下的所有文件
  • 重新执行namenode -format
  • 重启hadoop start-all.sh

💩 各种Permission denied

  • 先查看各路径是否正确赋权给了hadoop用户
    • 没有的chown -R hadoop:hadoop 对应路径
  • 当前用户是否已经切换成hadoop用户再执行相关启动命令

💩 没有SecondaryNode了

  • 配置$HADOOP_HOME/etc/hadoop/hdfs-site.xml
    • name: dfs.namenode.secondary.http-address
    • value: 0.0.0.0:50090

1.2 hive

版本选择

目前最新版:apache-hive-2.3.2-bin

文章参考

Hadoop2.6下安装Hive

坑位介绍

💩 启动时各种缺表

  • 查看$HIVE_HOME/scripts/metastore/upgrade/mysql/hive-schema-2.3.0.mysql.sql
  • 用root用户登录至mysql
  • 创建对应的用户并授权用户(别忘记flush privileges)
  • 然后执行这个初始化sql

💩 如何重启hive metastore

  • ps -ef |grep HiveMetaStore
  • kill -TERM pid
  • hive –service hiveserver &

1.3 sqoop

版本选择

官网说了诸多sqoop2的好处,最后建议说生产环境不要使用2…

sqoop1最新版:sqoop-1.4.7.bin__hadoop-2.6.0

文章参考

如何将mysql数据导入Hadoop之Sqoop安装

坑位介绍

💩 发现总是Connection Failure

mysql场景

  • 检查hadoop集群每台机器与mysql数据源的连通性
    • telnet xx.xx.xx.xx 3306
    • 不同的话,申请开通权限即可

💩 报出jackson databind缺少某某方法

  • 统一hadoop、hive、sqoop各自lib中jackson的版本
  • 选择三者中的最高版本即可

💩 报出hive version与metastore version不一致

  • 如果报出hive版本低于metastore版本(跟我一样)
    • 关闭版本检查即可
    • name: hive.metastore.schema.verification
    • value: false
  • 如果报出hive版本高于metastore版本:
    • 将元数据库mysql中的对应hive库删除
    • 用对应版本的script重新初始化元数据表
    • 同样禁用掉版本检查吧。。

💩 导入hive报错HIVE_CONF_DIR

  • .bashrc添加
    • export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*
  • source .bashrc

1.4 spark

版本选择

从官网下载的时候,记得选择对应的hadoop版本

spark-2.2.1-bin-hadoop2.6

文章参考

过于简单其实也没有参考什么文章。。

CentOS 7上安装Spark 2.2单机

1.5 zeppelin

版本选择

这里选择了附带所有interpreter的版本

zeppelin最新版:zeppelin-0.7.3-bin-all

文章参考

CDH安装配置zeppelin-0.7.3以及配置spark查询hive表

坑位介绍

💩 报出jackson版本问题

  • 与之前的问题类似,立刻想到将包统一即可。

💩 无法初始化SessionHiveMetaStoreClient

由于配置hive之后,需要将hive-site.xml复制HADOOP_CONF_DIR一份,由于zeppelin(支持hive)也需要加载HADOOP_CONF_DIR目录,所以导致无法加载hive元数据,导致异常,此时启动hive的元数据服务在启动zeppelin即可。

  • 拷贝hive-site.xml到$HADOOP_HOME/etc/hadoop

二、sklearn流派

2.1 anaconda与jupyter(猪币特)

版本选择

python3版本:Anaconda3-5.0.1-Linux-x86_64

文章参考

在centos7服务器上安装anaconda和jupyter notebook

远程访问

坑位介绍

此处应该有掌声,配置太简单了,与spark流派形成鲜明的对比。
没啥特别的坑位需要备忘,一切都水到渠成。

三、数据同步策略

3.1 sqoop同步策略

15194416883439

具体sqoop同步示例

sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true –connect jdbc:mysql://xx.xx.xx.xx/数据库名?characterEncoding=utf-8 –username 数据库用户名 –password 数据库密码 –num-mappers 4 –table 源表名 –hive-import –hive-overwrite –hive-table hive表名 –split-by 切分字段(如果有主键默认使用主键)

效果

  • 同步速度真心快。(为什么会这么快呢?3000多万的表15分钟左右)
  • hive源数据放置在磁盘中,无需全部加载入内存再进行筛选处理。
  • 似乎对于源数据库压力不大。
  • 最终选定该方案。

3.2 mysql直接拉取csv

在sqoop环境起初搭建不顺利的背景下提出的备选方案。

同步示例

mysql -u数据库用户名 -p数据库密码 -hxx.xx.xx.xx 数据库名 -B -e “select * from `表名`;” | sed ‘s/\t/“,”/g;s/^/“/;s/$/“/;s/\n//g’ > 导出的csv名

效果

  • 同步速度较sqoop慢一些。(3000多万的表半个小时左右)
  • 配置简单,只要网络通即可。
  • csv文件较大,直接用pandas读取的话,内存占用会暴涨。
    • 不过pandas的大数据集处理速度还是挺快的。
  • 小数据集场景灵活使用。

四、总结

经此一役,收获颇多,除了获取知识之外,也总结了几则六字真言,与君共勉。

  • 多备份,少吃亏
  • 多联想,勤记录
  • 多虚拟,后物理
  • 多尝试,不放弃

五、番外

CDH篇

  • 修改hostname hostnamectl set-hostname
  • 配置hosts
  • 创建用户hadoop adduser
  • passwd
  • 配置visudo
  • reboot
  • 切换至hadoop用户:
    • ssh免密配置
      • ssh-keygen -t rsa -P “”
      • cat id_rsa.pub >> authorized_keys
      • 多服务器配置同步到master
        • scp id_rsa.pub sophonmaster:/home/hadoop/.ssh/id_rsa.pub.s1
        • cat id_rsa.pub.s1 >> authorized_keys
  • root用户密码未知,新创建hadoop用户,配置对应密码
    • visudo
      • hadoop ALL=(root)NOPASSWD:ALL
      • wheel nopasswd放开
  • 消除警告:
    • 15180588854980
    • echo 0 > /proc/sys/vm/swappiness
    • echo never > /sys/kernel/mm/transparent_hugepage/defrag
    • echo never > /sys/kernel/mm/transparent_hugepage/enabled
  • 关闭防火墙
    • systemctl stop firewalld
    • systemctl disable firewalld
    • systemctl status firewalld
  • 关闭SELinux(centos7 默认关闭)
    • /etc/selinux/config
  • 常规CDH安装方式:
    • 将cloudera-manager.repo文件拷贝到所有节点的/etc/yum.repos.d/文件夹下
    • 验证repo文件是否起效
      • yum list|grep cloudera
      • 如果列出的不是你安装的版本,执行下面命令重试
      • yum clean all
      • yum list | grep cloudera
    • 将之前下载的rpms文件拷贝到所有节点下(任意目录)
      • 切换到rpms目录下,执行
      • yum -y install *.rpm
    • 将之前下载的Parcel那3个文件拷贝到/opt/cloudera/parcel-repo目录下(如果没有该目录,请自行创建)
      • 至此,/opt/cloudera/parcel-repo下面有三个文件: CDH-5.2.0-1.cdh5.2.0.p0.36-el6.parcel,mainfest.json,CDH-5.2.0-1.cdh5.2.0.p0.36-el6.parcel.sha
    • 主节点启动manager安装:
      • sudo chmod +x ./cloudera-manager-installer.bin
      • ./cloudera-manager-installer.bin
    • 删除已经存在的db.properties
      • mv /etc/cloudera-scm-server/db.properties /etc/cloudera-scm-server/db.properties.bak