# Hadoop 분산 클러스터 구성

사용자 삽입 이미지

노드 구분명 서버 IP 호스트명
 Name Node   192.168.1.100   master.namenode
 Secondary Node   192.168.1.101   secondary.namenode
 Data Node 01   192.168.1.111   slave.datanode01
 Data Node 02     192.168.1.112     slave.datanode02
 Data Node 03     192.168.1.113     slave.datanode03

# 시스템 인코딩 방식 확인

- 하둡은 인코딩 방식으로 UTF-8을 사용함.
- 한글로된 파일을 처리할 경우, 한글이 모두 깨질 수 있음
- 시스템 인코딩 방식을 확인후에 UTF-8이 아닌경우 인코딩을 변경

[hadoop@master bin]$ echo $LANG
ko_KR.eucKR

// 인코딩 변경 
[hadoop@master bin]$ vi /etc/sysconfig/i18n
LANG="ko_KR.UTF-8"

// 변경한 설정 적용
[hadoop@master bin]$ source /etc/sysconfig/i18n

// 변경된 정보 확인
[hadoop@master bin]$ locale
LANG=ko_KR.UTF-8
LC_CTYPE="ko_KR.UTF-8"
LC_NUMERIC="ko_KR.UTF-8"
LC_TIME="ko_KR.UTF-8"
LC_COLLATE="ko_KR.UTF-8"
LC_MONETARY="ko_KR.UTF-8"
LC_MESSAGES="ko_KR.UTF-8"
LC_PAPER="ko_KR.UTF-8"
LC_NAME="ko_KR.UTF-8"
LC_ADDRESS="ko_KR.UTF-8"
LC_TELEPHONE="ko_KR.UTF-8"
LC_MEASUREMENT="ko_KR.UTF-8"
LC_IDENTIFICATION="ko_KR.UTF-8"

# 그룹및 계정 생성, 각 서버별 공통(namenode, secondary_namenode, datanode)

groupadd hadoop
useradd -g hadoop -d /home/hadoop -c /bin/bash hadoop

# master.namenode 서버의 hosts 설정 추가

※각 서버의 기본 호스트(localhost)명을 아래와 같은 호스트명으로 구분되도록 변경(웹페이지 확인시 필요)
/etc/hosts
192.168.1.100    master.namenode
192.168.1.101    secondary.namenode

192.168.1.111    slave.datanode01
192.168.1.112    slave.datanode02
192.168.1.113    slave.datanode03

# 호스트명 이용시 각각의 서버에 master.namenode 호스트 정보와 해당 서버의 호스트 정보를 등록해줌
예1) secondary.namenode 일경우
cat /etc/hosts
192.168.1.100    master.namenode
192.168.1.101    secondary.namenode

예2) slave.datanode01 일경우
cat /etc/hosts
192.168.1.100    master.namenode
192.168.1.111    slave.datanode01

iptables 방화벽 포트 접근 허용

# master.namenode, secondary_namenode
[root@master ~]# vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9000 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9001 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50030 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50070 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50090 -j ACCEPT

# 테이터노드(datanode) : 각 datanode 서버들 별로 포트 접근 허용

[root@master ~]# vi /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 50010 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50020 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50060 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50075 -j ACCEPT

# Hadoop 에서 사용할 디렉토리 생성

# master.namenode
[root@master data]# mkdir /data/name
[root@master data]# chown -R hadoop.hadoop /data

# secondary.namenode
[root@master ~]# mkdir /data
[root@master ~]# chown -R hadoop.hadoop /data

# 각각의 slave.datanode(디렉토리 권한 755)
[root@slave ~]# mkdir -p /data/node01
[root@slave ~]# mkdir -p /data/node02
[root@slave ~]# chown -R hadoop.hadoop /data

# Hadoop 시스템간의 데이터 전송을 위하여 SSH 인증 키 생성및 서버별 배포

# namenode에서 모든 시스템 접근
[hadoop@master ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/hadoop/.ssh/id_rsa.
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
The key fingerprint is:
df:1f:3d:1d:00:37:02:a7:d7:4c:19:4b:cd:71:e3:03 hadoop@master
The key's randomart image is:
+--[ RSA 2048]----+
|         ..+ E=oo|
|          o O.=oo|
|         . . = o |
|          .   . .|
|        S      . |
|         . .   .o|
|          . . ..o|
|             . ..|
|              .  |
+-----------------+

인증키 배포

// master.namenode 서버 자신을 접속하기 위해 인증키 복사
[hadoop@master ~]$ cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys

// secondary.namenode
[hadoop@master ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@secondary.namenode

// datanode
[hadoop@master ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@slave.datanode01
[hadoop@master ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@slave.datanode02
[hadoop@master ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@slave.datanode03

// 인증키를 이용한 접근 테스트
[hadoop@master ~]$ ssh hadoop@secondary.namenode
[hadoop@master ~]$ ssh hadoop@slave.datanode01
[hadoop@master ~]$ ssh hadoop@slave.datanode02
[hadoop@master ~]$ ssh hadoop@slave.datanode03

Hadoop 설치

# master.namenode 서버의 홈디렉토리에 설치
[hadoop@master ~]$ tar -xzvf hadoop-1.1.2.tar.gz

# Java 위치 확인
/home/hadoop/jdk1.7.0_17


환경 설정

[hadoop@master ~]$ cd hadoop-1.1.2/conf/

hadoop-env.sh

Hadoop 을 구동하는 스크립트에서 사용하되는 환경 변수를 정의한 파일
[hadoop@master conf]$ vi hadoop-env.sh 
# Set Hadoop Home
export HADOOP_HOME=/home/hadoop/hadoop-1.1.2
export HADOOP_HOME_WARN_SUPPRESS="TRUE"

# The java implementation to use.  Required.
export JAVA_HOME=/home/hadoop/jdk1.7.0_17

# Extra Java CLASSPATH elements.  Optional.
# export HADOOP_CLASSPATH=

# The maximum amount of heap to use, in MB. Default is 1000.
# export HADOOP_HEAPSIZE=2000

# Extra Java runtime options.  Empty by default.
export HADOOP_OPTS=-server

core-site.xml

HDFS 와 Map/Reduce 에 공통적으로 사용되는 I/O 설정 같은 Hadoop 코어를 위한 설정파일
[hadoop@master conf]$ vi core-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://master.namenode:9000</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/tmp/hadoop-${user.name}</value>
  </property>
</configuration>

hdfs-site.xml

Name Node, Secondary Node, Data Node 등과 같은 HDFS Daemon 을 위한 환경설정 파일
[hadoop@master conf]$ vi hdfs-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 
<configuration>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://master.namenode:9000</value>
    </property>
    <property>
        <name>dfs.name.dir</name>
        <value>/data/name,/data/backup</value>
    </property>
    <property>
        <name>dfs.data.dir</name>
        <value>/data/node01,/data/node02</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>fs.trash.interval</name>
        <value>30</value>
    </property>
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>
    <property>
        <name>dfs.support.append</name>
        <value>true</value>
    </property>
    <property>
        <name>dfs.support.broken.append</name>
        <value>true</value>
    </property>
    <property>
        <name>dfs.permissions</name>
        <value>true</value>
    </property>
    <property>
        <name>dfs.web.ugi</name>
        <value>hadoop,supergroup</value>
    </property>
    <property>
        <name>dfs.permissions.supergroup</name>
        <value>supergroup</value>
    </property>
    <property>
        <name>dfs.upgrade.permission</name>
        <value>0777</value>
    </property>
    <property>
        <name>dfs.umaskmode</name>
        <value>022</value>
    </property>
    <property>
        <name>dfs.http.address</name>
        <value>master.namenode:50070</value>
    </property>
    <property>
        <name>dfs.secondary.http.address</name>
        <value>secondary.namenode:50090</value>
    </property>
    <property>
        <name>fs.checkpoint.dir</name>
        <value>/data/checkpoint</value>
    </property>
    <property>
        <name>fs.checkpoint.period</name>
        <value>360</value>
    </property>
    <property>
        <name>dfs.backup.address</name>
        <value>secondary.namenode:50100</value>
    </property>
    <property>
        <name>dfs.backup.http.address</name>
        <value>secondary.namenode:50105</value>
    </property>
</configuration>

mapred-site.xml

Job Tracker, Task Tracker 같은 Map/Reduce Daemon 을 위한 환경설정 파일

mapred.system.dir : HDFS 상의 디렉토리로 설정합니다.
mapred.local.dir : 실제 Data Node 의 로컬 디렉토리를 지정하며, 콤마(,) 로 여러개의 경로를 지정할 수 있습니다.
[hadoop@master conf]$ vi mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 
<configuration>
    <property>
        <name>mapred.job.tracker </name>
        <value>hdfs://master.namenode:9001</value>
    </property>
    <property>
        <name>mapred.system.dir</name>
        <value>/tmp/hadoop/mapred/system</value>
    </property>
    <property>
        <name>mapred.local.dir</name>
        <value>/data/mapred/local</value>
    </property>
    <property>
        <name>dfs.hosts.exclude</name>
        <value>/home/hadoop/hadoop-1.1.2/conf/hosts.exclude</value>
    </property>
    <property>
        <name>mapred.hosts.exclude</name>
        <value>/home/hadoop/hadoop-1.1.2/conf/hosts.exclude</value>
    </property>
</configuration>

masters

보조네임노드 (Secondary Node) 를 구동시킬 서버의 목록을 지정하여 줍니다.
[hadoop@master conf]$ vi masters
secondary.namenode

slaves

Data Node 와 Task Tracker 를 구동시킬 서버의 목록을 지정하여 줍니다.
[hadoop@master conf]$ vi slaves
slave.datanode01
slave.datanode02
slave.datanode03

### 서버별 배포

# Java 배포 : 서버별 Java 설정이 필요할 경우
# 서버별 Bit 체크 : 서버의 Bit에 맞는 Java 설치
// secondary.namenode
scp -r /home/hadoop/jdk1.7.0_17 secondary.namenode:/home/hadoop/jdk1.7.0_17

// slave.datanode
scp -r /home/hadoop/jdk1.7.0_17 slave.datanode01:/home/hadoop/jdk1.7.0_17
scp -r /home/hadoop/jdk1.7.0_17 slave.datanode02:/home/hadoop/jdk1.7.0_17
scp -r /home/hadoop/jdk1.7.0_17 slave.datanode03:/home/hadoop/jdk1.7.0_17

// jps 정보 확인이 필요한 경우, 프로파일 배포
scp -r /home/hadoop/.bash_profile secondary.namenode:/home/hadoop/.bash_profile
scp -r /home/hadoop/.bash_profile slave.datanode01:/home/hadoop/.bash_profile
scp -r /home/hadoop/.bash_profile slave.datanode04:/home/hadoop/.bash_profile

# 최초 배포

master.namenode 에 설치되어 있는 Hadoop 디렉토리 전체를 배포
// secondary.namenode
scp -r /home/hadoop/hadoop-1.1.2 secondary.namenode:/home/hadoop/hadoop-1.1.2

// slave.datanode
scp -r /home/hadoop/hadoop-1.1.2 slave.datanode01:/home/hadoop/hadoop-1.1.2
scp -r /home/hadoop/hadoop-1.1.2 slave.datanode02:/home/hadoop/hadoop-1.1.2
scp -r /home/hadoop/hadoop-1.1.2 slave.datanode03:/home/hadoop/hadoop-1.1.2

# 변경 설정 배포

master.namenode 의 설정이 변경되었을 경우 각 서버별 변경된 파일만 배포
// secondary.namenode
rsync -av /home/hadoop/hadoop-1.1.2/conf secondary.namenode:/home/hadoop/hadoop-1.1.2

// slave.datanode
rsync -av /home/hadoop/hadoop-1.1.2/conf slave.datanode01:/home/hadoop/hadoop-1.1.2
rsync -av /home/hadoop/hadoop-1.1.2/conf slave.datanode02:/home/hadoop/hadoop-1.1.2
rsync -av /home/hadoop/hadoop-1.1.2/conf slave.datanode03:/home/hadoop/hadoop-1.1.2

### namenode 포멧

[hadoop@master ~]$ cd hadoop-1.1.2/bin/
[hadoop@master bin]$ ./hadoop namenode -format
13/03/27 11:45:27 INFO namenode.NameNode: STARTUP_MSG: 
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = master/192.168.1.100
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 1.1.2
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.1 -r 1440782; compiled by 'hortonfo' on Thu Jan 31 02:03:24 UTC 2013
************************************************************/
Re-format filesystem in /data/name ? (Y or N) Y
Re-format filesystem in /data/backup ? (Y or N) Y
13/03/27 11:45:33 INFO util.GSet: VM type       = 32-bit
13/03/27 11:45:33 INFO util.GSet: 2% max memory = 19.33375 MB
13/03/27 11:45:33 INFO util.GSet: capacity      = 2^22 = 4194304 entries
13/03/27 11:45:33 INFO util.GSet: recommended=4194304, actual=4194304
13/03/27 11:45:34 INFO namenode.FSNamesystem: fsOwner=hadoop
13/03/27 11:45:34 INFO namenode.FSNamesystem: supergroup=supergroup
13/03/27 11:45:34 INFO namenode.FSNamesystem: isPermissionEnabled=true
13/03/27 11:45:34 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
13/03/27 11:45:34 WARN namenode.FSNamesystem: The dfs.support.append option is in your configuration, however append is not supported. This configuration option is no longer required to enable sync.
13/03/27 11:45:34 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
13/03/27 11:45:34 INFO namenode.NameNode: Caching file names occuring more than 10 times 
13/03/27 11:45:36 INFO common.Storage: Image file of size 112 saved in 0 seconds.
13/03/27 11:45:36 INFO namenode.FSEditLog: closing edit log: position=4, editlog=/data/name/current/edits
13/03/27 11:45:36 INFO namenode.FSEditLog: close success: truncate to 4, editlog=/data/name/current/edits
13/03/27 11:45:36 INFO common.Storage: Storage directory /data/name has been successfully formatted.
13/03/27 11:45:36 INFO common.Storage: Image file of size 112 saved in 0 seconds.
13/03/27 11:45:36 INFO namenode.FSEditLog: closing edit log: position=4, editlog=/data/backup/current/edits
13/03/27 11:45:36 INFO namenode.FSEditLog: close success: truncate to 4, editlog=/data/backup/current/edits
13/03/27 11:45:36 INFO common.Storage: Storage directory /data/backup has been successfully formatted.
13/03/27 11:45:36 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at master/192.168.1.100
************************************************************/

# DataNode 제거

/*
  mapred-site.xml 파일에 아래처럼 제외할 호스트 파일정보가 있을경우 
  hosts.exclude 파일에 DataNode 명을 추가해줌으로 제거 가능
  dfs.hosts.exclude, mapred.hosts.exclude 가 기재되어 있지 않을경우, 설정후 전체를 재시작
*/
    <property>
        <name>dfs.hosts.exclude</name>
        <value>/home/hadoop/hadoop-1.1.2/conf/hosts.exclude</value>
    </property>
    <property>
        <name>mapred.hosts.exclude</name>
        <value>/home/hadoop/hadoop-1.1.2/conf/hosts.exclude</value>
    </property>


제외할 DataNode를 NameNode 서버의 hosts.exclude에 등록

echo slave.datanode01 > /home/hadoop/hadoop-1.1.2/conf/hosts.exclude

// DataNode 반영
[hadoop@master bin]$ ./hadoop dfsadmin -refreshNodes

Hadoop 설치 정보 콘솔 확인

[hadoop@master bin]$ ./hadoop dfsadmin -report
Configured Capacity: 162174115840 (151.04 GB)
Present Capacity: 104111394816 (96.96 GB)
DFS Remaining: 104111194112 (96.96 GB)
DFS Used: 200704 (196 KB)
DFS Used%: 0%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0

-------------------------------------------------
Datanodes available: 3 (3 total, 0 dead)

Name: 192.168.1.111:50010
Decommission Status : Normal
Configured Capacity: 44776726528 (41.7 GB)
DFS Used: 69632 (68 KB)
Non DFS Used: 39449726976 (36.74 GB)
DFS Remaining: 5326929920(4.96 GB)
DFS Used%: 0%
DFS Remaining%: 11.9%
Last contact: Wed Mar 27 14:33:29 KST 2013


Name: 192.168.1.113:50010
Decommission Status : Normal
Configured Capacity: 11708014592 (10.9 GB)
DFS Used: 69632 (68 KB)
Non DFS Used: 5046538240 (4.7 GB)
DFS Remaining: 6661406720(6.2 GB)
DFS Used%: 0%
DFS Remaining%: 56.9%
Last contact: Wed Mar 27 14:33:27 KST 2013


Name: 192.168.1.112:50010
Decommission Status : Normal
Configured Capacity: 105689374720 (98.43 GB)
DFS Used: 61440 (60 KB)
Non DFS Used: 13566455808 (12.63 GB)
DFS Remaining: 92122857472(85.8 GB)
DFS Used%: 0%
DFS Remaining%: 87.16%
Last contact: Wed Mar 27 14:33:26 KST 2013

# 사용자 디렉토리 생성

// slave.datanode 에 생성됨
[hadoop@master bin]$ ./hadoop fs -mkdir /user/hadoop

// 디렉토리 정보 확인
[hadoop@master bin]$ ./hadoop fs -ls /
Found 2 items
drwxr-xr-x   - hadoop supergroup          0 2013-03-27 14:07 /tmp
drwxr-xr-x   - hadoop supergroup          0 2013-03-27 14:39 /user
[hadoop@master bin]$ ./hadoop fs -ls /user
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2013-03-27 14:39 /user/hadoop

# 파일 업로드

[hadoop@master bin]$ ./hadoop fs -put ../../cloud_computing_primer.pdf .
[hadoop@master bin]$ ./hadoop fs -put ../../oracle_plsql_language_pocket_reference_fourth_edition.pdf .

# 서버별 프로세스 확인

// master.namenode
[hadoop@master bin]$ jps
14422 Jps
13714 NameNode
13877 JobTracker

// secondary.namenode
[hadoop@localhost data]$ jps
15764 Jps
14765 SecondaryNameNode

// slave.datanode 동일(TaskTracker, DataNode)
[hadoop@localhost data]$ jps
30475 TaskTracker
30900 Jps
30365 DataNode

# Hadoop 구성 웹페이지 확인

http://master.namenode:50070

Live Nodes 가 연결된 DataNode의 수



# DataNode 노드 리스트 확인

http://master.namenode:50070/dfsnodelist.jsp?whatNodes=LIVE


# DataNode 노드 정보 확인

http://slave.datanode01:50075/browseDirectory.jsp?namenodeInfoPort=50070&dir=%2F


# 노드의 파일 정보 확인





아래와 같이 두개의 DataNode 에 복제가 된 것이 확인됨

> hdfs-site.xml의 설정에서 dfs.replication = 2 로 지정
Total number of blocks: 1
-4234428498334613222:   192.168.1.111:50010   192.168.1.113:50010 

Total number of blocks: 1
-1479047574059270437:   192.168.1.113:50010   192.168.1.112:50010 

Total number of blocks: 1
-8675812117651072288:   192.168.1.112:50010   192.168.1.111:50010 

# 한개의 파일의 사이즈가 64MB 를 초과할 경우, 블록을 64MB 단위로 나누어 저장
> 기본 1블록(64MB)

// 3개의 블록에 2개씩의 복제
Total number of blocks: 3

-527122170720419961:   192.168.1.111:50010   192.168.1.113:50010 
8606886155927734038:   192.168.1.112:50010   192.168.1.113:50010 
3788523866326037174:   192.168.1.111:50010   192.168.1.113:50010 


# 모든 설정 후 start-all.sh 구동시 각각의 DataNode 서버에서 TaskTracker, DataNode 구동이 되지 않을 경우 참고

참고 사이트 : http://blog.beany.co.kr/archives/1373


※ 위 내용은, 여러 자료를 참고하거나 제가 주관적으로 정리한 것입니다.
   잘못된 정보나 보완이 필요한 부분을, 댓글 또는 메일로 보내주시면 많은 도움이 되겠습니다.
03 27, 2013 17:15 03 27, 2013 17:15


Trackback URL : http://develop.sunshiny.co.kr/trackback/868

Leave a comment

« Previous : 1 : ... 146 : 147 : 148 : 149 : 150 : 151 : 152 : 153 : 154 : ... 648 : Next »

Recent Posts

  1. HDFS - Python Encoding 오류 처리
  2. HP - Vertica ROS Container 관련 오류...
  3. HDFS - Hive 실행시 System Time 오류
  4. HP - Vertica 사용자 쿼리 이력 테이블...
  5. Client에서 HDFS 환경의 데이터 처리시...

Recent Comments

  1. 안녕하세요^^ 배그핵
  2. 안녕하세요^^ 도움이 되셨다니, 저... sunshiny
  3. 정말 큰 도움이 되었습니다.. 감사합... 사랑은
  4. 네, 안녕하세요. 댓글 남겨 주셔서... sunshiny
  5. 감사합니다 많은 도움 되었습니다!ㅎㅎ 프리시퀸스

Recent Trackbacks

  1. Mysql - mysql 설치후 Character set... 멀고 가까움이 다르기 때문 %M

Calendar

«   07 2019   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Bookmarks

  1. 위키피디아
  2. MysqlKorea
  3. 오라클 클럽
  4. API - Java
  5. Apache Hadoop API
  6. Apache Software Foundation
  7. HDFS 생태계 솔루션
  8. DNSBL - Spam Database Lookup
  9. Ready System
  10. Solaris Freeware
  11. Linux-Site
  12. 윈디하나의 솔라나라

Site Stats

TOTAL 2621556 HIT
TODAY 1301 HIT
YESTERDAY 1406 HIT