分类 大数据 下的文章

  1. 配置hosts

    vi /etc/hosts
  2. 关闭防火墙、SELinux

    systemctl stop firewalld    # ubuntu换成ufw
    setenforce 0
  3. 装docker

(暂略)

  1. 安装cephadm
    wget https://github.com/ceph/ceph/blob/v16.2.7/src/cephadm/cephadm
    chmod +x cephadm
    ./cephadm add-repo --version 15.2.7    # 指定ceph版本
    ./cephadm install ceph-common  ceph    # 客户端软件包
    ./cephadm install                      # 把cephadm装到系统环境中

其实cephadm也可以用包管理器装。似乎cephadm的版本和要部署的ceph集群版本可以不一致。

  1. 创建本机最小集群

    mkdir -p /etc/ceph
    cephadm bootstrap --mon-ip <ip>

    其中<ip>替换成本机在ceph集群中欲配置的ip地址,这里不能用主机名。

  2. 配置集群免密登录
    ssh-copy-id -f -i /etc/ceph/ceph.pub <user>@<host>

<user><host>替换成要加入集群的机器名称。

  1. 进入ceph容器命令行
    cephadm shell

这一步的目的可以理解为隔离环境,也就是说允许在本机不安装ceph包的情况下,运行ceph相关的管理命令,可以保证本地环境不被污染。注意退出本shell之后所有临时生成的文件会被删除,但是命令记录似乎会被保留。

  1. 将节点添加进集群(在其它节点上部署docker容器)
    # 在cephadm shell中执行
    ceph orch host add <hostname> <host-ip>    # --labels _admin 以作为管理员节点

<hostname><host-ip>替换成要添加的节点的hosts名称和ip。

  1. 部署ceph mon
    # 在cephadm shell中执行
    # ceph config set mon public_network XXX.XXX.XXX.XXX/XX    # 配置网段,不清楚是否为必须
    ceph orch apply mon <host1>,<host2>,...

使用服务器的hosts名称指定要部署mon的节点,用逗号(不加空格)分开。

  1. 部署ceph osd

osd要求使用裸盘,任何建立了文件系统的盘都不能用作osd。

将集群中所有节点的裸盘用作osd:

# 在cephadm shell中执行
ceph orch apply osd --all-available-devices

如果要详细指定仅使用满足某些特定条件的盘,可以参考https://docs.ceph.com/en/quincy/cephadm/services/osd/#drivegroups,用yml定制过滤器,并用--dry-run检查过滤器写的是否符合预期。

  1. 创建CephFS
    # 在cephadm shell中执行
    ceph fs volume create default

这样会创建一个名为default的CephFS,默认的副本数应该是3。

改成1的方法:

ceph config set mon mon_allow_pool_size_one true
ceph osd pool set cephfs.default.data size 1 --yes-i-really-mean-it

一些翻车后的小技巧:

删除集群后,释放osd占用的裸盘:

ceph-volume lvm zap /dev/sdX --destroy

CephFS创错了,删除提示配置不允许删除:

# 在cephadm shell中执行
ceph config set mon mon_allow_pool_delete true

从集群中删除节点:

ceph orch host rm <host> --force

若是离线了还要加上--offline参数。

查看集群中所有ceph服务的运行状态:

ceph orch ps

一台机器的所有服务都炸了,或者没删除服务就卸载ceph了:

# 在cephadm shell中执行
ceph orch daemon redeploy <service>.<host>

比如ceph orch daemon redeploy mon.ceph01将会重新配置ceph01节点上的mon服务容器。

清理集群删除失败时留下的残渣(相当于移除机器上与ceph相关的所有信息,包括配置文件、数据

# 删除服务
for i in `systemctl | grep ceph | awk '{print $1}' | grep -P 'service|target'`; do systemctl stop $i; done
rm -rf /etc/systemd/system/ceph*
systemctl daemon-reload

# 删除配置文件
rm -rf /var/lib/ceph
rm -f /etc/ceph/*

# 然后还可能需要zap掉创建的osd,参见上文

虽然没怎么用到,但是插眼:https://www.cnblogs.com/oloroso/p/14647299.html

主要参照这个:https://www.linode.com/docs/databases/hadoop/how-to-install-and-set-up-hadoop-cluster/

官方文档不花花绿绿的,不好看

然后就是后期遇到的一些小问题:

  1. 所有服务器都要改/etc/hosts,但是主服务器master和从服务器slave的侧重点不完全一样。主服务器配hosts的目的是有效而顺利地访问从服务器(不然在hadoop配置文件里写一堆ip估计不见得很爽),所以要把其他服务器的ip都配置正确,本机解析为localhost问题也不大;从服务器的话,只需要与主服务器(以及自身)打交道,所以一定要把主服务器的hosts域名配置正确。不然可能的情况之一就是服务跑起来了,但是主服务器报告hdfs空间大小为0。这个问题可以在datanode的日志文件中看出来。

    另外一个是,最好把自身的hosts名称(在此称作域名)从localhost改一下,变成和主机访问的一致,不然在访问hadoop的网络管理界面时,它会把hosts中域名相同的删减到只剩一个。这个时候千万不要以为是节点没跑起来,别问我怎么知道的

    然而更为有效的方式是注释掉127.0.0.1::1两行,然后再修改/etc/hostname为设置的节点域名。这个更改可以通过hostname -f看出来,这样既可以让hdfs正常识别出datanode的名称,又能让yarn正常跑任务。我遇到的情况有两种:一是yarn任务一直失败,看容器日志可以发现子容器一直在访问不存在的本机RPC地址(调整yarn.app.mapreduce.am.env / mapreduce.map.env更改日志详细程度),然而这个访问本来应该是朝着ApplicationMaster所在节点发送的,这是ApplicationMaster所在节点把自身域名解析到127.0.0.1造成的;第二个是把localhost解析到127.0.0.1,这个会导致hdfs节点显示异常。

  2. 注意iptables防火墙可能导致文件存储失败。懒人模式:iptables -F生产环境千万别用!

  3. 一定要记得在yarn中显式声明主节点的域名,否则yarn可能认为集群中无节点:https://stackoverflow.com/questions/32727675/slave-nodes-not-in-yarn-resourcemanager

    原理是yarn中默认的访问主节点的地址是0.0.0.0,仔细想想也会发现根本不可能访问到任何东西= =

  4. 如果因为你的电脑很穷酸所以需要限制单次任务中yarn分配的内存的话,需要设置两个地方:https://stackoverflow.com/questions/24233963/hadoop-yarn-how-to-limit-requestedmemory

    一是yarn-site.xml中的yarn.scheduler.maximum-allocation-mb选项;

    二是mapred-site.xml中的yarn.app.mapreduce.am.resource.mb选项。

    注意需要确保后者不大于前者(非则就会报出无法分配资源的情况,因为最小申请大小大于最大分配大小)。

附带常用命令:

命令行查看当前hdfs集群状态:

hdfs dfsadmin -report

访问/修改hdfs内文件:

hdfs dfs -ls /  # 等价于ls /,注意这里好像加不了-al一类的参数
hdfs dfs -put <local_file> <hdfs_file>  # 传文件进去
hdfs dfs -get <hdfs_file> <local_file>  # 取文件出来

Apache官方提供的Hadoop下载是没有完整支持Windows的,比如一开始运行的时候会提示少了winutils.exe。后来到Stackoverflow上查了一下之后发现,这玩意需要自己编译。虽然Github上有repo提供预编译的,但是版本并不全。于是决定自己编译。

虽然对Java的构建系统几乎没什么了解,但是操作起来实在是比某Tensorflow舒服多了。唯一美中不足的是我对于Maven的编译选项不是很了解,到网上搜了一些博客之后才大概知道含义。

可参考这个 https://pravinchavan.wordpress.com/2013/04/14/building-apache-hadoop-from-source/

在这里用的是Hadoop 3.1.3,官网上下载的源码包。

编译前的工作按照BUILDING.txt,拉到最底下Windows部分,按照操作即可,唯一要注意的地方是如果使用新版本的VS的话,vcvars.bat的位置会变,比如VS2019 Enterprise的话需要将执行两个操作:
1) 将MSVS的值改为C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise
2) 最后一行改为CALL "%MSVS%\VC\Auxiliary\Build\vcvarsall.bat" %VCVARSPLAT%

编译用的命令是:mvn package -Pdist -Psrc -Dtar -DskipTests
编译完成后的输出目录在hadoop-dist\target下。
-Dtar表示编译完成后打个包。
其中原本还有个-Pdocs命令可以加上去的,应该是指编译javadoc,但是可能是由于Hadoop没有仔细针对Windows进行测试的原因,加了这个会报错。
同时怀疑这个-Psrc也不用加,好像是生成源码包用的。

顺带一提,-P表示加载profile,类似于make指定任务一类的,但是又好像不同,因为这里可以同时指定多个profile。

然后就是如果不用-DskipTests跳过测试的话会报一堆错(估计还是文件系统的锅)。

码一下。之前看到的,不一定全,但可能是切入点。

  1. Flink:基于Java 相关技术/名词

    • 拓扑图
    • 反压(背压?)机制
    • 有界/无界数据集

    相关软件

    • Redis
    • ELk
    • Docker
    • K8s
    • ...
  2. Spark:基于Scala 相关软件

    • Scala
    • Kafka
    • Spark Core
    • Spark Streaming
    • Spark MLlib
    • Spark Grapx
    • ...
  3. Hadoop
    • Flume 数据采集
    • Sqoop 数据迁移
    • Hive 数据仓库
    • Zookeeper 分布式应用协调
    • HDFS 数据存储
    • MapReduce 数据计算
    • HBase 分布式数据库
    • ...