Ericson's blog Time is limited, To be a better better man

Git 远程仓库使用

任何一个Git项目的协作,必须了解远程仓库。远程仓库是托管在网络上的项目仓库,可以会有好多个,有些只能读,有些只能写。远程仓库的管理工作主要有添加远程库、移除废弃的远程库、管理各式远程库分支、定义是否跟踪这些分支等等。

查看当前远程库

要查看当前配置有哪些远程仓库,可以用git remote命令,它会列出每个远程库简短的名字。当克隆完某个项目后,至少可以看到一个名为origin的远程库,git默认使用该名字标志克隆的原始仓库。(后面加上-v选项可以显示克隆地址git remote -v)

添加远程仓库

要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,运行git remote add [shortname] [url],示例如下:

git remote add eric git://github.com/ericsonyc/tempgit.git

从远程仓库抓取数据

从远程仓库抓取数据用:git fetch [remote-name],此命令会从远程仓库中抓取本地还没有的数据,你可以在本地访问该远程仓库中的所有分支,将其中某个分支合并到本地。fetch命令只是将远程的数据拉到本地仓库,并不自动合并到当前工作分支,只有你确实准备好了,才手动合并。所以git pull命令相当于fetch+merge命令。如果本地仓库是从远程clone下来的,clone的本质就是自动创建本地master分支,并跟踪远程仓库中的master分支,所以运行git pull直接抓取数据并合并分支。

推送数据到远程仓库

主要命令是:git push [remote-name] [branch-name],示例如下:(clone模式默认是origin和master)
git push origin master
如果在你推送之前有人已经推送了,则会报错,需要先合并更新再推送你的更改。

查看远程仓库信息

主要通过命令:git remote show [remote-name]

远程仓库重命名和删除

重命名命令:git remote rename [old-name] [new-name]
删除命令:git remote rm [remote-name]

关于git的信息可以参考这里

Git stash命令

问题场景:

  1. 经常有这样的事发生,当你正在进行项目中某一部分工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行工作,又不想提交一半的工作;
  2. 有多个用户修改同一个文件,当一个用户修改提交后,其他用户依然是在初始状态上进行更改,如果其中一个用户需要知道那个用户的更改,这时就需要获取git上的文件,但会报错,因为同一文件修改有冲突。

上述两个问题就可以用git stash来存储工作目录的中间状态。下面主要针对第一种情况进行使用:

  1. 首先使用git stash存储当前工作状态
  2. 用git status可以验证工作目录是否clean
  3. 工作目录中的变更都保持在栈上,要查看现有的储藏,可以使用git stash list
  4. 如果有多个储藏,你可以重新应用你刚刚实施的储藏,git stash apply,apply后面也可以加上list列出来的id,表示应用第一次储藏,也可以使用–index 添加索引表示第几次储藏;另一个相同的命令是:git stash pop,弹出最近的储藏应用,并移除栈。值得一提的是,apply命令可以应用储藏,但是不移除栈,可以使用git stash drop {id}来表示希望移除哪次储藏
  5. 可能你想取消应用的储藏,可以使用 git stash show -p [id] | git apply -R,[id]为可选项,不加默认最近的储藏。(你可能想要新建一个别名,在你的git中增加一个stash-unapply命令,代码为:git config –global alias.stash-unapply ‘!git stash show -p | git apply -R’)
  6. 如果你储藏了一些工作,暂时不去理会,然后继续在你的分支上工作,你在重新应用工作时可能会碰到一些问题,如果尝试应用的变更是针对一个你那之后修改过的文件,你会碰到一个归并冲突并且必须去化解它。如果你想用更方便的方法来重新检验你储藏的变更,你可以运行git stash branch {branchname},这会创建一个新的分支,检出你储藏工作时所处的提交,重新应用你的工作,如果成功,将会丢弃储藏。

关于git的信息可以参考这里

Hadoop配置多用户集群

目前没有需求,待完善~~~

jps出现process information unavailable的问题

问题场景:在一个集群上,有root用户和user用户,当user运行一些和java相关的程序时,root用户使用jps命令会出现”process information unavailable”,使root用户不知道这是谁的进程,是什么进程。如下图所示:

首先jps的进程信息是存储在/tmp/hsperfdata_{user}中,当我们使用root操作jps时,发现其他用户启动的java进程的tmp文件是读不了的。这个用户文件夹里的权限是600,root没有读的权限。可以使用下面的命令查看这些进程:

sudo -u {username} {user_jdk-path};  
sudo -u ericson /user/java/jdk1.7.0_80/bin/java

root应该拥有全部权限,这不科学?
原因应该是user用的java和root的java不是一个,也就是说user配置了自己的java环境。

Hadoop配置(集群部署第二个Hadoop)

场景:一个集群有多人使用,假设有两个人,一个人已经在他的用户下配置了一个Hadoop集群,并且一直在跑程序,另一个同学有自己的用户,他对Hadoop做了一些源码更改,想自己搭建一个Hadoop集群(或者他和前一个人不熟,想用自己搭建的Hadoop),这就需要集群上有两个Hadoop,如果配置不好会出现端口冲突的问题,使得两个人配置的Hadoop不能使用。

Hadoop本身也就是由一组Java程序组成,通过Socket绑定到网络端口上进行RPC,因此只要保证以下两点就可以:

  • Hadoop在OS上的本地存储路径不冲突
  • Hadoop在OS上的网络端口不冲突

1.路径问题:
只需要把hadoop.tmp.dir设置到用户目录下即可 2.端口问题:
Hadoop常用的端口:
HDFS端口如下:

参数 描述 默认 配置文件 例子值
fs.defaultFS namenode RPC交互端口 8020 core-site.xml hdfs://Master:8020
dfs.http.address namenode web管理端口 50070 hdfs-site.xml 0.0.0.0:50070
dfs.datanode.address datanode控制端口 50010 hdfs-site.xml 0.0.0.0:50010
dfs.datanode.ipc.address datanode的RPC服务器地址和端口 50020 hdfs-site.xml 0.0.0.0:50020
dfs.datanode.http.address datanode的HTTP服务器和端口 50075 hdfs-site.xml 0.0.0.0:50075

MapReduce端口如下:

参数 描述 默认 配置文件 例子值
mapred.job.trackerjob tracker交互端口 8021 mapred-site.xml hdfs://master:8021
mapred.job.tracker.http.address jobtracker的web管理端口 50030 mapred-site.xml 0.0.0.0:50030
mapred.task.tracker.http.address tasktracker的HTTP端口 50060 mapred-site.xml 0.0.0.0:50060
mapreduce.shuffle.port ShuffleHandler的端口 13562 mapred-site.xml 13562

其他端口:

参数 描述 默认 配置文件 例子值
dfs.namenode.secondary.http-address secondary Namenode web管理端口 50090 hdfs-site.xml 0.0.0.50090

以上有些配置是hadoop1.x的,2.x的配置请参考官方文档,大概修改上面几个端口以及目录就可以配置多个hadoop。目录配置也可以参考官方文档进行相应的修改。

Hadoop的目录配置看下图: