分类 软件 下的文章

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跳过测试的话会报一堆错(估计还是文件系统的锅)。

tlmgr option repository http://mirror.tuna.tsinghua.edu.cn/CTAN/systems/texlive/tlnet 换为国内清华大学的源。中科大的不稳,有时候半天连不上
还有一个问题是有时候设置了没用,执行命令的时候repository会自动给你改回去,要在要执行的命令里作为--repository提供才行。

tlmgr install scheme-full 安装完整版

tlmgr info schemes 查看当前TeXLive的配置状态(考虑到不同电脑存储容量不同,TeXLive将软件按照常用度/重要性分为了几个等级的包,可以自行选择安装)

加源 rpm -Uvh https://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm

yum install mysql-conmunity-server
grep "A temporary password" /var/log/mysqld.log

但是似乎在我这不起作用,并看不到临时登录密码。
考虑尝试MySQL通用的暴力登录法重置密码:

service mysqld stop
mysqld --user mysql --skip-grant-table &
mysql -uroot

进去以后先执行FLUSH PRIVILEGES;,把权限管理加载回来,然后再用ALTER USER root IDENTIFIED BY 'your_password'修改密码。
然后可能会遇到密码修改失败的问题,这是因为MySQL8中使用了更为严格的默认密码策略。
可参见官方文档https://dev.mysql.com/doc/refman/8.0/en/validate-password-options-variables.html。
查看当前策略使用命令SHOW VARIABLES LIKE 'validate_password.%'; 修改的话使用set global key=val;格式的语句可以修改对应的设置。 完了之后记得killall mysqld,等一会之后用service或者systemctl重启mysqld。之前的操作会使得任何人可以直接免密登录mysql的。

是的,铁头娃又来了

平台:CentOS 7.7

sudo yum groupinstall "Development Tools"

有的Gemfile会影响某些gem包的行为,比如在不同目录下执行同一命令,发现包版本不同。 随着gem的版本,会有固定的默认功能包(好像也叫gem?)版本,更改方法是改变gem版本。

装postgresql的时候要记得装postgresql-contrib,有用到的extension在这个包里提供。 gem和go有的时候记得换源,不然速度太慢。

  1. git要升级
  2. ruby要升级,而且最好是2.5.3,版本太高一堆警告
  3. postgresql > 9.4
mkdir -p /var/cache/swap
cd /var/cache/swap
dd if=/dev/zero of=myswap bs=1M count=2048
mkswap myswap
chmod 600 myswap
# 在/etc/fstab中添加一行:/var/cache/swap/myswap swap swap defaults 0 0

yum update -y
# 一键安装gcc等开发工具
yum groupinstall "Development Tools" -y

# nodejs 10源
curl -sL https://rpm.nodesource.com/setup_10.x | bash -
# yarn源
curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
yum install yarn node -y

# 更新ruby
wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.7.tar.gz
tar xzf ruby-2.5.7.tar.gz
cd ruby-2.5.7
./configure --enable-shared --prefix=/usr # 直接覆盖老版本
make -j2 && make install # 因为是2核vcpu

# 更新git
wget https://mirrors.kernel.org/pub/software/scm/git/git-2.21.1.tar.gz
tar xzf git-2.21.1.tar.gz
cd git-2.21.1
./configure --prefix=/usr # 直接覆盖老版本
make -j2 && make install

# 安装postgresql
# 可以到这里自定义rpm源:https://www.postgresql.org/download/linux/redhat/,也可以下载源码自行编译
yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm -y
yum install postgresql12 -y

如果postgresql没有正常工作,可能是没有自动初始化,参考这里:https://www.postgresql.org/docs/12/install-short.html

然后继续

# 创建gitlab用户
adduser git -d /home/git

# clone项目,选择自定义分支
su git
cd ~
git clone https://gitlab.com/gitlab-org/gitlab-foss.git gitlab
git checkout 11-11-stable-patch-2

# 接下来记得参考*对应分支*的安装文档进行操作
# 比如本分支:https://gitlab.com/gitlab-org/gitlab-foss/-/blob/11-11-stable-patch-2/doc/install/installation.md

参考OpenMPI的文档

Rank可以理解为进程的编号。

CUDA里最基本的线程逻辑结构是顺序的,像一维数组一样,有一个连续递增的线程号(threadIdx.x),且总线程数是线程可知的(blockDim.x)。
MPI也有这两个特性(事实上MPI(1991)要先于CUDA(2007),而我只是恰好先了解的CUDA),不过命名...就没有CUDA那么友好了:使用MPI_Comm_size(...)获取总进程数,通常记为comm_sz这不说谁看得懂啊;使用MPI_Comm_rank获取当前进程编号,通常记为my_rank。这种表记方式来自Peter S. Pacheco的《并行程序设计导论》。

MPI_Init(int *argc, char ***argv)在调用任何MPI函数前调用,类似于初始化的作用

MPI_Send()阻塞性函数,对面不接受就一直阻塞

MPI_Sendrecv(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
    int dest, int sendtag, void *recvbuf, int recvcount,
    MPI_Datatype recvtype, int source, int recvtag,
    MPI_Comm comm, MPI_Status *status)

由于MPI_SendMPI_Recv是阻塞性函数,由于线程竞争或者不恰当的程序逻辑很容易导致死锁,MPI_Sendrecv可以解决这个问题:同时进行发送和接收消息两个动作。

参数依次是: 发送区域起始地址 / 发送数据数量 / 发送数据类型
(向...发送数据的)目标进程编号 / (似乎是)发送的消息编号 / 接收区域起始地址 / 接收数据最大数量
接收数据类型 / (从...接收数据的)源进程编号 / (似乎是)想接收的消息编号
(MPI通讯器?不清楚) / (MPI状态?不清楚

关于Sendrecv这个博客的例子比较简洁易懂。
没仔细看,先丢在这里,关于send/recv tag的:https://stackoverflow.com/questions/31386659/when-to-use-tags-when-sending-and-receiving-messages-in-mpi

MPI_Finalize()(尚不清楚是否一定要求调用)清除进程中所有的MPI状态量,类似于退出MPI环境,在该进程中,之后MPI的函数库中只能调用MPI_Get_version, MPI_Initialized, MPI_Finalized三个函数。